成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

文件系統與磁盤常見優化方案和術語

存儲 存儲設備
計算機的文件系統是一種存儲和組織計算機數據的方法,它使得對其訪問和查找變得容易,文件系統使用文件和樹形目錄的抽象邏輯概念代替了硬盤和光盤等物理設備使用數據塊的概念,用戶使用文件系統來保存數據不必關心數據實際保存在硬盤(或者光盤)的地址為多少的數據塊上,只需要記住這個文件的所屬目錄和文件名

[[407959]]

本文轉載自微信公眾號「運維開發故事」,作者沒有文案的夏老師 。轉載本文請聯系運維開發故事公眾號。

術語

文件系統

計算機的文件系統是一種存儲和組織計算機數據的方法,它使得對其訪問和查找變得容易,文件系統使用文件和樹形目錄的抽象邏輯概念代替了硬盤和光盤等物理設備使用數據塊的概念,用戶使用文件系統來保存數據不必關心數據實際保存在硬盤(或者光盤)的地址為多少的數據塊上,只需要記住這個文件的所屬目錄和文件名。在寫入新數據之前,用戶不必關心硬盤上的那個塊地址沒有被使用,硬盤上的存儲空間管理(分配和釋放)功能由文件系統自動完成,用戶只需要記住數據被寫入到了哪個文件中。

I/O

I/O(英語:Input/Output),即輸入/輸出,通常指數據在存儲器(內部和外部)或其他周邊設備之間的輸入和輸出,是信息處理系統(例如計算機)與外部世界(可能是人類或另一信息處理系統)之間的通信。輸入是系統接收的信號或數據,輸出則是從其發送的信號或數據。該術語也可以用作行動的一部分;到“運行I/O”是運行輸入或輸出的操作。

文件緩存

內存上的一塊的一塊區域,用來緩存文件系統的內容。索引節點緩存,簡稱為 inode,用來記錄文件的元數據,比如 inode 編號、文件大小、訪問權限、修改日期、數據的位置等。索引節點和文件一一對應,它跟文件內容一樣,都會被持久化存儲到磁盤中。目錄項,簡稱為 dentry,用來記錄文件的名字、索引節點指針以及與其他目錄項的關聯關系。多個關聯的目錄項,就構成了文件系統的目錄結構。不過,不同于索引節點,目錄項是由內核維護的一個內存數據結構,所以通常也被叫做目錄項緩存。

隨機I/O與順序I/O

順序IO是指讀寫操作的訪問地址連續。在順序IO訪問中,HDD所需的磁道搜索時間顯著減少,因為讀/寫磁頭可以以最小的移動訪問下一個塊。數據備份和日志記錄等業務是順序IO業務。隨機IO是指讀寫操作時間連續,但訪問地址不連續,隨機分布在磁盤的地址空間中。產生隨機IO的業務有OLTP服務,SQL,即時消息服務等。

預讀

Linux文件預讀算法磁盤I/O性能的發展遠遠滯后于CPU和內存,因而成為現代計算機系統的一個主要瓶頸。預讀可以有效的減少磁盤的尋道次數和應用程序的I/O等待時間,是改進磁盤讀I/O性能的重要優化手段之一。本文作者是中國科學技術大學自動化系的博士生,他在1998年開始學習Linux,為了優化服務器的性能,他開始嘗試改進Linux kernel,并最終重寫了內核的文件預讀部分,這些改進被收錄到Linux Kernel 2.6.23及其后續版本中。預取算法的涵義和應用非常廣泛。它存在于CPU、硬盤、內核、應用程序以及網絡的各個層次。預取有兩種方案:啟發性的(heuristic prefetching)和知情的(informed prefetching)。前者自動自發的進行預讀決策,對上層應用是透明的,但是對算法的要求較高,存在命中率的問題;后者則簡單的提供API接口,而由上層程序給予明確的預讀指示。在磁盤這個層次,Linux為我們提供了三個API接口:posix_fadvise(2), readahead(2), madvise(2)。不過真正使用上述預讀API的應用程序并不多見:因為一般情況下,內核中的啟發式算法工作的很好。預讀(readahead)算法預測即將訪問的頁面,并提前把它們批量的讀入緩存。它的主要功能和任務可以用三個關鍵詞來概括:1、批量,也就是把小I/O聚集為大I/O,以改善磁盤的利用率,提升系統的吞吐量。2、提前,也就是對應用程序隱藏磁盤的I/O延遲,以加快程序運行。3、預測,這是預讀算法的核心任務。前兩個功能的達成都有賴于準確的預測能力。當前包括Linux、FreeBSD和Solaris等主流操作系統都遵循了一個簡單有效的原則:把讀模式分為隨機讀和順序讀兩大類,并只對順序讀進行預讀。這一原則相對保守,但是可以保證很高的預讀命中率,同時有效率/覆蓋率也很好。因為順序讀是最簡單而普遍的,而隨機讀在內核來說也確實是難以預測的。

寫回緩存

回寫緩存存在有一個與生俱來的潛在問題,即應用程序在接到寫完成信號之后可能會進行一些其他操作,而在數據被真正寫入非易失性介質之前系統失效。此時就會導致介質上的數據與后續操作不一致性。由于這個問題,良好的回寫緩存實現時要有在系統失效期間(包括電源失效)保護緩存內容,當系統重啟時再寫入介質的機制。

吞吐量

磁盤的吞吐量,也就是每秒磁盤 I/O 的流量,即磁盤寫入加上讀出的數據的大小。

IOPS

磁盤的 IOPS,也就是在一秒內,磁盤進行多少次 I/O 讀寫。

寫時復制

寫入時復制(英語:Copy-on-write,簡稱COW)是一種計算機程序設計領域的優化策略。其核心思想是,如果有多個調用者(callers)同時請求相同資源(如內存或磁盤上的數據存儲),他們會共同獲取相同的指針指向相同的資源,直到某個調用者試圖修改資源的內容時,系統才會真正復制一份專用副本(private copy)給該調用者,而其他調用者所見到的最初的資源仍然保持不變。這過程對其他的調用者都是透明的(transparently)。此做法主要的優點是如果調用者沒有修改該資源,就不會有副本(private copy)被建立,因此多個調用者只是讀取操作時可以共享同一份資源。沒有COW之前 第一代Unix系統實現了一種傻瓜式的進程創建:當執行fork系統調用時,內核復制父進程的整個用戶空間并把復制得到的那一份分配給子進程。這種行為是非常耗時的,因為它需要完成以下幾項任務:

  • 為子進程的頁表分配頁面
  • 為子進程的頁分配頁面
  • 初始化子進程的頁表
  • 把父進程的頁復制到子進程對應的頁中

有COW之后

在Linux中,系統調用fork()創建子進程時,并不會立即為子進程創建新的物理內存空間(邏輯空間當然還是保持獨立,只是說兩份邏輯空間一開始映射到同一份物理空間),而是公用父進程的物理空間。只有在需要寫入的時候,數據才會被復制,從而使父進程、子進程擁有各自的副本。也就是說,資源的復制只有在需要寫入的時候才進行,在此之前以只讀方式共享。

零拷貝

技術是指計算機執行操作時,CPU不需要先將數據從某處內存復制到另一個特定區域。這種技術通常用于通過網絡傳輸文件時節省CPU周期和內存帶寬。實現零復制的軟件通常依靠基于直接存儲器訪問(DMA)的復制,以及通過內存管理單元(MMU)的內存映射。這些功能需要特定硬件的支持,并通常涉及到特定存儲器的對齊。一種較新的方式為使用異構系統架構(HSA),便于CPU和GPU以及其他處理器傳遞指針。這需要CPU和GPU使用統一地址空間。Linux內核通過各個系統調用支持零復制,例如sys/socket.h的sendfile、sendfile64以及splice。它們部分在POSIX中指定,因此也存在于BSD內核或IBM AIX中,部分則是Linux內核API中獨有。

使用率

是指磁盤處理 I/O 的時間百分比。過高的使用率(比如超過 80%),通常意味著磁盤 I/O 存在性能瓶頸。

飽和度

飽和度是指磁盤處理 I/O 的繁忙程度。過高的飽和度,意味著磁盤存在嚴重的性能瓶頸。當飽和度為 100% 時,磁盤無法接受新的 I/O 請求。

響應時間

響應時間是指 I/O 請求從發出到收到響應的間隔時間。

優化方案

當然, 想要優化 I/O 性能,肯定離不開 Linux 系統的 I/O 棧圖的思路輔助。

應用程序優化

首先,我們來看一下,從應用程序的角度有哪些優化 I/O 的思路。應用程序處于整個 I/O 棧的最上端,它可以通過系統調用,來調整 I/O 模式(如順序還是隨機、同步還是異步), 同時,它也是 I/O 數據的最終來源。在我看來,可以有這么幾種方式來優化應用程序的 I/O 性能。

第一,可以用追加寫代替隨機寫,減少尋址開銷,加快 I/O 寫的速度。

第二,可以借助緩存 I/O ,充分利用系統緩存,降低實際 I/O 的次數。

第三,可以在應用程序內部構建自己的緩存,或者用 Redis 這類外部緩存系統。這樣,一方面,能在應用程序內部,控制緩存的數據和生命周期;另一方面,也能降低其他應用程序使用緩存對自身的影響。C 標準庫提供的 fopen、fread 等庫函數,都會利用標準庫的緩存,減少磁盤的操作。而你直接使用 open、read 等系統調用時,就只能利用操作系統提供的頁緩存和緩沖區等,而沒有庫函數的緩存可用。

第四,在需要頻繁讀寫同一塊磁盤空間時,可以用 mmap 代替 read/write,減少內存的拷貝次數。

第五,在需要同步寫的場景中,盡量將寫請求合并,而不是讓每個請求都同步寫入磁盤,即可以用 fsync() 取代 O_SYNC。

第六,在多個應用程序共享相同磁盤時,為了保證 I/O 不被某個應用完全占用,推薦你使用 cgroups 的 I/O 子系統,來限制進程 / 進程組的 IOPS 以及吞吐量。最后,在使用 CFQ 調度器時,可以用 ionice 來調整進程的 I/O 調度優先級,特別是提高核心應用的 I/O 優先級。ionice 支持三個優先級類:Idle、Best-effort 和 Realtime。其中, Best-effort 和 Realtime 還分別支持 0-7 的級別,數值越小,則表示優先級別越高。

文件系統優化

應用程序訪問普通文件時,實際是由文件系統間接負責,文件在磁盤中的讀寫。所以,跟文件系統中相關的也有很多優化 I/O 性能的方式。

第一,你可以根據實際負載場景的不同,選擇最適合的文件系統。比如 Ubuntu 默認使用 ext4 文件系統,而 CentOS 7 默認使用 xfs 文件系統。相比于 ext4 ,xfs 支持更大的磁盤分區和更大的文件數量,如 xfs 支持大于 16TB 的磁盤。但是 xfs 文件系統的缺點在于無法收縮,而 ext4 則可以。其他對比:

  1. 初始化模式下,ext4性能并沒有比xfs來得高
  2. 隨機讀寫模式下,ext4性能比xfs將近高一倍
  3. 其他測試模式中,ext4和xfs性能相當

在一些對隨機IO性能要求較高的環境下,可以嘗試使用ext4,比如數據庫,大型圖片后臺存儲等

第二,在選好文件系統后,還可以進一步優化文件系統的配置選項,包括文件系統的特性(如 ext_attr、dir_index)、日志模式(如 journal、ordered、writeback)、掛載選項(如 noatime)等等。比如, 使用 tune2fs 這個工具,可以調整文件系統的特性(tune2fs 也常用來查看文件系統超級塊的內容)。而通過 /etc/fstab ,或者 mount 命令行參數,我們可以調整文件系統的日志模式和掛載選項等。

第三,可以優化文件系統的緩存。

  • 比如,你可以優化 pdflush 臟頁的刷新頻率(比如設置 dirty_expire_centisecs 和 dirty_writeback_centisecs)以及臟頁的限額(比如調整 dirty_background_ratio 和 dirty_ratio 等)。
  • 再如,你還可以優化內核回收目錄項緩存和索引節點緩存的傾向,即調整 vfs_cache_pressure(/proc/sys/vm/vfs_cache_pressure,默認值 100),數值越大,就表示越容易回收。最后,在不需要持久化時,你還可以用內存文件系統 tmpfs,以獲得更好的 I/O 性能 。tmpfs 把數據直接保存在內存中,而不是磁盤中。比如 /dev/shm/ ,就是大多數 Linux 默認配置的一個內存文件系統,它的大小默認為總內存的一半。

磁盤優化

數據的持久化存儲,最終還是要落到具體的物理磁盤中,同時,磁盤也是整個 I/O 棧的最底層。從磁盤角度出發,自然也有很多有效的性能優化方法。

第一,最簡單有效的優化方法,就是換用性能更好的磁盤,比如用 SSD 替代 HDD。

第二,我們可以使用 RAID ,把多塊磁盤組合成一個邏輯磁盤,構成冗余獨立磁盤陣列。這樣做既可以提高數據的可靠性,又可以提升數據的訪問性能。

第三,針對磁盤和應用程序 I/O 模式的特征,我們可以選擇最適合的 I/O 調度算法。比方說,SSD 和虛擬機中的磁盤,通常用的是 noop 調度算法。而數據庫應用,我更推薦使用 deadline 算法。

第四,我們可以對應用程序的數據,進行磁盤級別的隔離。比如,我們可以為日志、數據庫等 I/O 壓力比較重的應用,配置單獨的磁盤。

第五,在順序讀比較多的場景中,我們可以增大磁盤的預讀數據,比如,你可以通過下面兩種方法,調整 /dev/sdb 的預讀大小。

  • 調整內核選項 /sys/block/sdb/queue/read_ahead_kb,默認大小是 128 KB,單位為 KB。
  • 使用 blockdev 工具設置,比如 blockdev --setra 8192 /dev/sdb,注意這里的單位是 512B(0.5KB),所以它的數值總是 read_ahead_kb 的兩倍。

第六,我們可以優化內核塊設備 I/O 的選項。比如,可以調整磁盤隊列的長度 /sys/block/sdb/queue/nr_requests,適當增大隊列長度,可以提升磁盤的吞吐量(當然也會導致 I/O 延遲增大)。

 

最后,要注意,磁盤本身出現硬件錯誤,也會導致 I/O 性能急劇下降,所以發現磁盤性能急劇下降時,你還需要確認,磁盤本身是不是出現了硬件錯誤。比如,你可以查看 dmesg 中是否有硬件 I/O 故障的日志。還可以使用 badblocks、smartctl 等工具,檢測磁盤的硬件問題,或用 e2fsck 等來檢測文件系統的錯誤。如果發現問題,你可以使用 fsck 等工具來修復。

 

責任編輯:武曉燕 來源: 運維開發故事
相關推薦

2014-02-26 11:41:33

Fuse文件系統

2021-06-28 06:24:12

磁盤存儲VFS

2021-06-21 14:52:45

磁盤機械磁盤固態磁盤

2021-06-22 15:16:01

磁盤機械磁盤固態磁盤

2016-12-27 10:48:59

Linux命令磁盤與文件系統

2009-12-18 17:08:10

Linux常見文件系統

2018-01-10 12:42:09

Linux磁盤文件系統

2017-02-28 20:00:17

Linux文件系統對比

2009-10-12 11:14:51

LinuxLinux磁盤文件系統管理

2011-01-13 13:18:38

Linux網絡文件

2014-01-24 09:58:45

fuse文件系統

2013-05-27 14:46:06

文件系統分布式文件系統

2010-03-02 15:09:26

Linux mount

2010-04-07 18:42:42

Unix命令

2010-03-01 16:13:06

Linux磁盤管理命令

2023-05-16 08:35:22

2009-10-13 14:31:26

:Linux系統磁盤系統管理

2011-08-05 14:51:21

2020-07-22 14:53:06

Linux系統虛擬文件

2017-08-17 10:03:06

磁盤系統實例
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 99精品久久久 | 国产成人在线视频 | 午夜一级黄色片 | 国产剧情一区二区三区 | 日韩成人久久 | 久久精品成人 | 国产乱肥老妇国产一区二 | 中文字幕在线视频网站 | 91成人精品 | 亚洲精品一区久久久久久 | 午夜视频网站 | 国产欧美一区二区久久性色99 | 亚洲精品一区二区 | 亚洲欧美一区二区三区国产精品 | 日韩精品一区二区三区 | 欧美美女爱爱 | 乱码av午夜噜噜噜噜动漫 | 久久久久久中文字幕 | www.日韩在线| 久久涩涩 | 欧美一级久久 | 96国产精品久久久久aⅴ四区 | 国产精品99久久久久久久久 | 国产一区二区三区免费视频 | 久久久91精品国产一区二区三区 | 欧美日韩精品一区二区天天拍 | 91精品国产乱码久久久久久久久 | 国产一区二区三区 | 亚卅毛片 | 国产欧美精品一区二区 | 欧美一区2区三区4区公司 | 欧美成人一区二免费视频软件 | a级黄色毛片免费播放视频 国产精品视频在线观看 | 涩涩视频在线看 | av在线播放免费 | 欧美黄页 | 久久高清 | 欧美亚洲视频在线观看 | 一区二区三区亚洲 | 欧美一级免费看 | 久久新 |