1、什么是磁盤
在講解磁盤IO前,先簡單說下什么是磁盤。磁盤是可以持久化存儲的設備,根據存儲介質的不同,常見磁盤可以分為兩類:機械磁盤和固態磁盤。
1.1機械磁盤
第一類,機械磁盤,也稱為硬盤驅動器(Hard Disk Driver),通常縮寫為 HDD。機械磁盤主要由盤片和讀寫磁頭組成,數據就存儲在盤片的環狀磁道中。在讀寫數據前,需要移動讀寫磁頭,定位到數據所在的磁道,然后才能訪問數據。顯然,如果 I/O 請求剛好連續,那就不需要磁道尋址,自然可以獲得最佳性能。這其實就是我們熟悉的,連續 I/O 的工作原理。與之相對應的,當然就是隨機 I/O,它需要不停地移動磁頭,來定位數據位置,所以讀寫速度就會比較慢。
1.2 固態磁盤
第二類,固態磁盤(Solid State Disk),通常縮寫為 SSD,由固態電子元器件組成。固態磁盤不需要磁道尋址,所以,不管是連續 I/O,還是隨機 I/O 的性能,都比機械磁盤要好得多。
1.3機械磁盤和固態磁盤對比
其實,無論機械磁盤,還是固態磁盤,相同磁盤的隨機 I/O 都要比連續 I/O 慢很多,原因也很明顯。
對機械磁盤來說,剛剛提到過的,由于隨機 I/O 需要更多的磁頭尋道和盤片旋轉,它的性能自然要比連續 I/O 慢。
而對固態磁盤來說,雖然它的隨機性能比機械硬盤好很多,但同樣存在“先擦除再寫入”的限制。隨機讀寫會導致大量的垃圾回收,所以相對應的,隨機 I/O 的性能比起連續 I/O 來,也還是差了很多。
此外,連續 I/O 還可以通過預讀的方式,來減少 I/O 請求的次數,這也是其性能優異的一個原因。很多性能優化的方案,也都會從這個角度出發,來優化 I/O 性能。
此外,機械磁盤和固態磁盤還分別有一個最小的讀寫單位。
機械磁盤的最小讀寫單位是扇區,一般大小為 512 字節。
而固態磁盤的最小讀寫單位是頁,通常大小是 4KB、8KB 等。
如果每次都讀寫 512 字節這么小的單位的話,效率很低。所以,Linux文件系統會把連續的扇區或頁,組成邏輯塊,然后以邏輯塊作為最小單元來管理數據。常見的邏輯塊的大小是 4KB,也就是說,連續 8 個扇區,或者單獨的一個頁,都可以組成一個邏輯塊。
1.4 按照接口進行磁盤分類
除了可以按照存儲介質來分類,另一個常見的分類方法,是按照接口來分類,比如可以把硬盤分為 IDE(Integrated Drive Electronics)、SCSI(Small Computer System Interface) 、SAS(Serial Attached SCSI) 、SATA(Serial ATA) 、FC(Fibre Channel) 等。
不同的接口,往往分配不同的設備名稱。比如, IDE 設備會分配一個 hd 前綴的設備名,SCSI 和 SATA 設備會分配一個 sd 前綴的設備名。如果是多塊同類型的磁盤,就會按照 a、b、c 等的字母順序來編號。
1.5磁盤架構
除了磁盤本身的分類外,當你把磁盤接入服務器后,按照不同的使用方式,又可以把它們劃分為多種不同的架構。
最簡單的,就是直接作為獨立磁盤設備來使用。這些磁盤,往往還會根據需要,劃分為不同的邏輯分區,每個分區再用數字編號。比如我們前面多次用到的 /dev/sda ,還可以分成兩個分區 /dev/sda1 和 /dev/sda2。
另一個比較常用的架構,是把多塊磁盤組合成一個邏輯磁盤,構成冗余獨立磁盤陣列,也就是 RAID(Redundant Array of Independent Disks),從而可以提高數據訪問的性能,并且增強數據存儲的可靠性。
根據容量、性能和可靠性需求的不同,RAID 一般可以劃分為多個級別,如 RAID0、RAID1、RAID5、RAID10 等。
RAID0 有最優的讀寫性能,但不提供數據冗余的功能。
而其他級別的 RAID,在提供數據冗余的基礎上,對讀寫性能也有一定程度的優化。
最后一種架構,是把這些磁盤組合成一個網絡存儲集群,再通過 NFS、SMB、iSCSI 等網絡存儲協議,暴露給服務器使用。(云服務器基本都是這種架構)
其實在 Linux 中,磁盤實際上是作為一個塊設備來管理的,也就是以塊為單位讀寫數據,并且支持隨機讀寫。每個塊設備都會被賦予兩個設備號,分別是主、次設備號。主設備號用在驅動程序中,用來區分設備類型;而次設備號則是用來給多個同類設備編號。
2、什么是磁盤IO
磁盤 I/O(Input/Output)是指計算機系統中涉及到磁盤的數據讀取和寫入操作。磁盤 I/O 是計算機與存儲設備之間進行數據交換的一種重要方式。當計算機需要從磁盤讀取數據時,它會發起一個讀取請求,磁盤會尋找并將數據傳輸到計算機的內存中;當計算機需要將數據寫入磁盤時,它會發起一個寫入請求,將數據從內存寫入到磁盤中。
??我們都知道磁盤中存儲的程序,必須要加載到內存后才能運行,在磁盤中保存的原始程序是無法直接運行的。這是因為,負責解析和運行程序內容的CPU,需要通過內部程序計數器來指定內存地址,然后才能讀出程序。即使CPU可以直接讀出并運行磁盤中保存的程序,由于磁盤讀取速度慢,程序的運行速度還是會降低。總之,存儲在磁盤中的程序需要讀入到內存后才能運行。
??當程序在內存中執行時,如果需要加載一些文檔數據或其他文件,它會通過操作系統提供的文件操作功能來實現。操作系統會提供一些函數或系統調用,允許程序訪問磁盤上的文件并將其加載到內存中。程序可以使用文件路徑指定要加載的文件,然后通過操作系統提供的函數來打開這些文件。一旦文件被打開,程序就可以讀取其中的數據,并將其加載到內存中,以便后續處理。這就好像你在讀一本書,首先需要打開書本,然后才能閱讀其中的內容。當程序執行 I/O 操作時,CPU 將會暫時停止執行程序指令,而是會等待操作系統完成讀取文件的工作。
??一旦CPU下發了讀取文件的指令,它會等待操作系統通知文件已經準備好,并將數據加載到內存中。CPU會繼續執行其他的指令,而不是空閑等待。一旦文件數據加載到內存中,CPU 就會繼續執行程序的后續邏輯。在這個過程中,CPU 可能會執行其他指令,例如處理內存中的其他數據,執行其他線程的操作,或者執行程序的其他部分邏輯。CPU 不會在等待期間完全停止執行。
注意 1:當CPU需要等待磁盤操作完成才能繼續處理數據時,它可能會進入空閑狀態,這時,CPU的使用率下降,因為它正在等待IO操作,而不是執行計算任務,這種現象說明了IO操作對CPU性能的重要影響。
注意 2:內存相當于CPU和硬盤之間的橋梁,當需要運行一個程序時,先將程序加載到內存中,然后CPU取內存中的指令和數據進行處理運算,處理完后將結果寫回內存,如果需要的話再將結果從內存寫入硬盤。
3、磁盤性能指標
說到磁盤性能的衡量標準,必須要提到五個常見指標,也就是我們經常用到的,使用率、飽和度、IOPS、吞吐量以及響應時間等。這五個指標,是衡量磁盤性能的基本指標:
IOPS(Input/Output Per Second),是指每秒磁盤處理的I/O請求數量。衡量存儲性能一般看吞吐量(傳輸速度)和IOPS兩個指標。
吞吐量,是指每秒磁盤處理的 I/O 請求大小,吞吐量主要指大文件的連續讀寫速度,在大文件的復制、備份等場景適用,用“HD Tune專業版”中的“基準”測試功能即可測試出磁盤的吞吐量,一般傳統機械sata硬盤的順序讀寫速度為 :80~150M/s,SAS硬盤為150~200M/s,SSD固態硬盤為400~600M/s。
響應時間,是指 I/O 請求從發出到收到響應的間隔時間。
使用率,是指磁盤處理 I/O 的時間百分比。過高的使用率(比如超過 80%),通常意味著磁盤 I/O 存在性能瓶頸,這里要注意的是,使用率只考慮有沒有 I/O,而不考慮 I/O 的大小。換句話說,當使用率是 100% 的時候,磁盤依然有可能接受新的 I/O 請求,比如磁盤一直讀寫小文件,雖然使用率是100%,但是磁盤壓力可能并不大。
飽和度,是指磁盤處理 I/O 的繁忙程度。過高的飽和度,意味著磁盤存在嚴重的性能瓶頸。當飽和度為 100% 時,磁盤無法接受新的 I/O 請求。
這些指標,很可能是你經常掛在嘴邊的,一討論磁盤性能必定提起的對象。不過我還是要強調一點,不要孤立地去比較某一指標,而要結合讀寫比例、I/O 類型(隨機還是連續)以及 I/O 的大小,綜合來分析。舉個例子,在數據庫、大量小文件等這類隨機讀寫比較多的場景中,IOPS 更能反映系統的整體性能;而在多媒體等順序讀寫較多的場景中,吞吐量才更能反映系統的整體性能。
一般來說,我們在為應用程序的服務器選型時,要先對磁盤的 I/O 性能進行基準測試,以便可以準確評估,磁盤性能是否可以滿足應用程序的需求。但還是那句話,因地制宜,靈活選取。在基準測試時,一定要注意根據應用程序 I/O 的特點,來具體評估指標。當然,這就需要你測試出,不同 I/O 大小(一般是 512B 至 1MB 中間的若干值)分別在隨機讀、順序讀、隨機寫、順序寫等各種場景下的性能情況。用性能工具得到的這些指標,可以作為后續分析應用程序性能的依據。一旦發生性能問題,你就可以把它們作為磁盤性能的極限值,進而評估磁盤 I/O 的使用情況。
4、磁盤 I/O 觀測
了解磁盤的性能指標,只是我們 I/O 性能測試的第一步。接下來,又該用什么方法來觀測它們呢?這里,介紹幾個常用的 I/O 性能觀測方法。
4.1 觀察每塊磁盤的使用情況
iostat是I/O statistics(輸入/輸出統計)的縮寫,iostat工具將對系統的磁盤操作活動進行監視。它的特點是匯報磁盤活動統計情況,同時也會匯報出CPU使用情況。iostat也有一個弱點,就是它不能對某個進程進行深入分析,僅對系統的整體情況進行分析。
1 2 |
# iostat屬于sysstat軟件包。可以直接安裝。 yum install sysstat -y |
選項說明:
1 2 3 4 5 6 7 8 |
-c: 僅顯示CPU利用率相關信息; -d: 僅顯示磁盤I/O相關信息; -k: 顯示輸出的數據單位為KB/s而不是默認的字節/s; -t: 在輸出中顯示時間戳(時間戳格式YYYY-MM-DD HHSS)。 -m:顯示狀態以兆字節每秒為單位; -p:僅顯示塊設備和所有被使用的其他分區的狀態; -V:顯示版號并退出; -x:顯示擴展狀態。 |
iostat 的詳細使用本文不再贅余,詳情見《Linux iowait詳解》這篇博文。
在iostat輸出的這些指標中,需要注意:
%util ,就是我們前面提到的磁盤 I/O 使用率;
r/s+ w/s ,就是 IOPS;
rkB/s+wkB/s ,就是吞吐量;
r_await 或 w_await ,就是響應時間。
在觀測指標時,也別忘了結合請求的大小( rareq-sz 和 wareq-sz)一起分析。你可能注意到,從 iostat 并不能直接得到磁盤飽和度。事實上,飽和度通常也沒有其他簡單的觀測方法,不過,你可以把觀測到的平均請求隊列長度或者讀寫請求完成的等待時間,跟基準測試的結果(比如通過 fio)進行對比,綜合評估磁盤的飽和情況。
4.2 觀察進程io的使用情況
除了每塊磁盤的 I/O 情況,每個進程的 I/O 情況也是我們需要關注的重點。上面提到的 iostat 只提供磁盤整體的 I/O 性能數據,缺點在于,并不能知道具體是哪些進程在進行磁盤讀寫。要觀察進程的 I/O 情況,還可以使用iotop這個工具。iotop。它是一個類似于 top 的工具,你可以按照 I/O 大小對進程排序,然后找到 I/O 較大的那些進程。
#安裝 yum -y install iotop
說明:
? --version #顯示版本號 ? -h, --help #顯示幫助信息 ? -o, --only #顯示進程或者線程實際上正在做的I/O,而不是全部的,可以隨時切換按o ? -b, --batch #運行在非交互式的模式 ? -n NUM, --iter=NUM #在非交互式模式下,設置顯示的次數, ? -d SEC, --delay=SEC #設置顯示的間隔秒數,支持非整數值 ? -p PID, --pid=PID #只顯示指定PID的信息 ? -u USER, --user=USER #顯示指定的用戶的進程的信息 ? -P, --processes #只顯示進程,一般為顯示所有的線程 ? -a, --accumulated #顯示從iotop啟動后每個線程完成了的IO總數 ? -k, --kilobytes #以千字節顯示 ? -t, --time #在每一行前添加一個當前的時間 ? -q, --quiet #suppress some lines of header (implies --batch). This option can be specified up to three times to remove header lines. ? -q column names are only printed on the first iteration, ? -qq column names are never printed, ? -qqq the I/O summary is never printed. iotop 快捷鍵 ? 左右箭頭 #改變排序方式,默認是按IO排序 ? r #改變排序順序 ? o #只顯示有IO輸出的進程 ? p #進程/線程的顯示方式的切換 ? a #顯示累積使用量 ? q #退出
iotop 的輸出如下所示:
$ iotop Total DISK READ : 0.00 B/s | Total DISK WRITE : 7.85 K/s Actual DISK READ: 0.00 B/s | Actual DISK WRITE: 0.00 B/s TID PRIO USER DISK READ DISK WRITE SWAPIN IO> COMMAND 15055 be/3 root 0.00 B/s 7.85 K/s 0.00 % 0.00 % systemd-journald
從這個輸出,可以看到,前兩行分別表示,進程的磁盤讀寫大小總數和磁盤真實的讀寫大小總數。因為緩存、緩沖區、I/O 合并等因素的影響,它們可能并不相等。剩下的部分,則是從各個角度來分別表示進程的 I/O 情況,包括線程 ID、I/O 優先級、每秒讀磁盤的大小、每秒寫磁盤的大小、換入和每個進程的 I/O 利用率(即進程正在進行的 I/O 操作所占用的時間比例)。
4.3 磁盤性能觀測命令補充
(1)sar命令
iostat 和 iotop 命令都主要用于實時監控系統的 I/O 情況,通常不會記錄歷史的 I/O 信息。如果你需要查看歷史的 I/O 信息,可以考慮使用sar命令。
sar 命令是分析系統瓶頸的神器,可以用來查看 CPU 、內存、磁盤、網絡等性能,sar 命令查看當前磁盤性能的命令為:
[root@106 sa]# sar -d -p 1 2 Linux 3.10.0-1160.59.1.el7.x86_64 (106) 2024年04月18日 _x86_64_ (8 CPU) 17時33分33秒 DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util 17時33分34秒 sdc 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 17時33分34秒 sdd 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 17時33分34秒 sdb 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 17時33分34秒 sda 25.00 0.00 276.00 11.04 0.00 0.16 0.16 0.40 17時33分34秒 centos-root 25.00 0.00 276.00 11.04 0.00 0.16 0.16 0.40 17時33分34秒 centos-swap 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 17時33分34秒 DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util 17時33分35秒 sdc 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 17時33分35秒 sdd 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 17時33分35秒 sdb 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 17時33分35秒 sda 153.00 0.00 1444.00 9.44 0.85 5.55 0.29 4.40 17時33分35秒 centos-root 153.00 0.00 1444.00 9.44 0.85 5.54 0.29 4.40 17時33分35秒 centos-swap 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 平均時間: DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util 平均時間: sdc 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 平均時間: sdd 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 平均時間: sdb 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 平均時間: sda 89.00 0.00 860.00 9.66 0.43 4.79 0.27 2.40 平均時間: centos-root 89.00 0.00 860.00 9.66 0.43 4.79 0.27 2.40 平均時間: centos-swap 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 [root@106 sa]#
其中, “-d”參數代表查看磁盤性能,“-p”參數代表將 dev 設備按照 sda,sdb……名稱顯示,“1”代表每隔1s采取一次數值,“2”代表總共采取2次數值。輸出項除了tps,其他指標和iostat一致,這里就不再贅余(tps:每秒鐘物理設備的 I/O 傳輸總量)。
默認情況下,sar顯示當前數據;如果想繼續查看一天前的報告;可以查看保存在/var/log/sa/下的sar日志(默認保存三天數據):
[root@106 sa]# sar -d -p -f /var/log/sa/sa16 Linux 3.10.0-1160.59.1.el7.x86_64 (106) 2024年04月16日 _x86_64_ (8 CPU) 14時10分01秒 DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util 14時20分01秒 sdc 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 14時20分01秒 sdd 0.04 0.00 0.36 9.00 0.00 2.12 2.12 0.01 14時20分01秒 sdb 0.01 0.00 0.12 9.00 0.00 0.38 0.38 0.00 14時20分01秒 sda 49.17 0.00 888.31 18.07 0.07 1.41 0.58 2.85 14時20分01秒 centos-root 49.42 0.00 888.30 17.97 0.07 1.43 0.58 2.85 ...... 23時40分01秒 sdc 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 23時40分01秒 sdd 0.04 0.00 0.36 9.00 0.00 0.79 0.79 0.00 23時40分01秒 sdb 0.01 0.00 0.12 9.00 0.00 1.62 1.62 0.00 23時40分01秒 sda 48.50 0.00 892.42 18.40 0.08 1.57 0.63 3.07 23時40分01秒 centos-root 48.71 0.00 892.42 18.32 0.08 1.58 0.63 3.07 23時40分01秒 centos-swap 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 23時50分01秒 sdc 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 23時50分01秒 sdd 0.04 0.00 0.36 9.00 0.00 0.25 0.25 0.00 23時50分01秒 sdb 0.01 0.00 0.12 9.00 0.00 0.25 0.25 0.00 23時50分01秒 sda 49.29 0.00 824.63 16.73 0.07 1.52 0.64 3.18 23時50分01秒 centos-root 49.50 0.00 824.63 16.66 0.08 1.53 0.64 3.18 23時50分01秒 centos-swap 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 平均時間: sdc 0.00 0.47 0.01 208.69 0.00 4.06 2.78 0.00 平均時間: sdd 0.04 0.00 0.37 9.08 0.00 0.49 0.48 0.00 平均時間: sdb 0.02 0.00 0.14 9.31 0.00 0.53 0.50 0.00 平均時間: sda 48.53 0.00 863.51 17.79 0.07 1.46 0.61 2.97 平均時間: centos-root 48.74 0.00 863.51 17.71 0.07 1.47 0.61 2.97 平均時間: centos-swap 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
(2)其他IO相關的常用命令
5、小結
本文梳理了磁盤、 Linux IO、IO性能指標和性能工具。我們通常用 IOPS、吞吐量、使用率、飽和度以及響應時間等幾個指標,來評估磁盤的 I/O 性能。可以用 iostat 獲得磁盤的 I/O 情況,也可以用iotop 觀察進程的 I/O 情況。不過在分析這些性能指標時,要注意結合讀寫比例、I/O 類型以及 I/O 大小等,進行綜合分析。
鏈接:https://www.cnblogs.com/zhangmingcheng/p/18143353
-
Linux
+關注
關注
87文章
11292瀏覽量
209330 -
計算機
+關注
關注
19文章
7488瀏覽量
87852 -
服務器
+關注
關注
12文章
9123瀏覽量
85328 -
磁盤
+關注
關注
1文章
375瀏覽量
25201
原文標題:深入了解Linux磁盤IO性能優化:必讀指南
文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論