導致 I/O 效率低下的原因?
我正在
rsync
從外部到內部 3,5" 硬碟驅動器創建一個巨大的文件夾,均為 5.400 rpm。當dstat
用於查看目前吞吐量時,我經常看到這樣的模式:--total-cpu-usage-- -dsk/total- -net/total- ---paging-- ---system-- usr sys idl wai stl| read writ| recv send| in out | int csw 20 6 34 40 0| 98M 90M|1272B 3652B| 0 0 |1702 4455 21 6 37 37 0| 121M 90M|1646B 4678B| 0 0 |2057 6488 17 24 29 30 0| 77M 95M| 630B 2416B| 0 0 |1581 4644 20 5 33 43 0| 86M 84M|1372B 2980B| 0 0 |1560 4146 20 6 30 44 0| 80M 75M| 700B 2722B| 0 0 |1484 3942 11 2 47 39 0| 39M 65M| 642B 1332B| 0 0 | 765 1507 0 0 50 50 0| 0 91M| 70B 354B| 0 0 | 136 70 0 0 50 49 0| 0 71M| 306B 346B| 0 0 | 146 119 0 0 50 50 0| 0 83M| 70B 346B| 0 0 | 145 60 0 0 50 50 0| 0 0 | 70B 346B| 0 0 | 36 84 0 0 50 50 0| 0 0 | 164B 646B| 0 0 | 35 71 0 0 50 50 0| 0 0 | 140B 802B| 0 0 | 30 64 0 0 50 50 0| 0 0 | 70B 346B| 0 0 | 27 68 0 0 50 50 0| 0 34M| 134B 346B| 0 0 | 86 68 0 0 50 50 0| 0 0 | 70B 346B| 0 0 | 30 71 0 0 50 50 0| 0 0 |2320B 346B| 0 0 | 40 76 0 0 50 50 0| 0 0 | 70B 346B| 0 0 | 29 71 0 0 50 50 0| 0 0 | 70B 346B| 0 0 | 25 50 -----------------------------[snip]------------------------------ 0 0 50 50 0| 0 0 |2230B 346B| 0 0 | 35 61 0 0 50 50 0| 0 60M| 70B 346B| 0 0 | 118 83 1 7 42 50 0| 256k 104M| 230B 500B| 0 0 | 281 480 21 5 31 42 0| 117M 76M|1120B 3392B| 0 0 |1849 4309 23 5 36 36 0| 137M 56M|1202B 3958B| 0 0 |2149 5782 24 5 36 35 0| 138M 100M|1284B 4112B| 0 0 |2174 6021
比如說,幾秒鐘到一分鐘,讀寫吞吐量都下降到零。這裡的瓶頸是什麼?
我的意思是,由於兩個驅動器的速度大致相同,因此它們都不應該閒置太久。更進一步,至少一個驅動器應始終處於讀取或寫入狀態。系統還在等什麼?
系統空閒,只有吃cpu的東西是
rsync
任務。記憶體為 8GB,CPU 為第 7 代 i5 四核。內部硬碟通過 SATA 連接到主機板,即 Gigabyte G170X-Ultra Gaming。在這兩種情況下,文件系統都是 ext4,在內部(寫入)端使用 dmcrypt/LUKS 加密。這可能是原因嗎?如果是這樣,如何檢查 dmcrypt 的性能?我看到,當傳輸下降發生時,CPU 50% 空閒 50% 等待。我可以從中得出什麼結論?它是最新的帶有核心版本的 Archlinux
4.13.11-1-ARCH
。有什麼要注意的嗎?提前致謝。更新:
iotop
被指出比dstat
. 不幸的是,iotop
當下dstat
降到零時,也顯示零吞吐量。我做了一個截屏來展示它。
有 2 套工具可以獲取一些塊級設備統計資訊。第一個是來自 Brendan Gregg 的perf tools的iolatency。它會生成一個簡單的磁碟操作延遲直方圖,例如:
>=(ms) .. <(ms) : I/O |Distribution | 0 -> 1 : 1913 |######################################| 1 -> 2 : 438 |######### | 2 -> 4 : 100 |## | 4 -> 8 : 145 |### | 8 -> 16 : 43 |# | 16 -> 32 : 43 |# | 32 -> 64 : 1 |# |
工具集中的另一個腳本是
iosnoop
顯示命令及其操作,例如:COMM PID TYPE DEV BLOCK BYTES LATms /usr/bin/mon 31456 R 8,0 9741888 4096 2.14 /usr/bin/mon 31456 R 8,0 9751408 4096 0.16 /usr/bin/mon 31456 R 8,0 20022728 4096 1.44 /usr/bin/mon 31456 R 8,0 19851752 4096 0.26 jbd2/sda3-41 416 WS 8,0 130618232 65536 1.89 jbd2/sda3-41 416 WS 8,0 209996928 65536 1.92 jbd2/sda3-41 416 WS 8,0 210006528 8192 1.94
然後是blktrace包,它記錄低級塊操作,
blktrace
然後顯示各種資訊,以及許多其他命令,包括來自(pdf 使用者指南blkparse
)的簡單摘要:btt
$ sudo blktrace /dev/sda # ^C to stop === sda === CPU 0: 180 events, 9 KiB data CPU 1: 1958 events, 92 KiB data Total: 2138 events (dropped 0), 101 KiB data $ ls -ltra # one file per cpu -rw-r--r-- 1 root root 8640 Nov 5 10:16 sda.blktrace.0 -rw-r--r-- 1 root root 93992 Nov 5 10:16 sda.blktrace.1 $ blkparse -O -d combined.output sda.blktrace.* # combine cpus $ btt -i combined.output ALL MIN AVG MAX N Q2Q 0.000001053 0.106888548 6.376503027 253 Q2G 0.000000795 0.000002266 0.000011060 184 G2I 0.000000874 0.000979485 0.002588781 328 Q2M 0.000000331 0.000000599 0.000002716 70 I2D 0.000000393 0.000480112 0.002435491 328 M2D 0.000002044 0.000028418 0.000126845 70 D2C 0.000080986 0.001925224 0.010111418 254 Q2C 0.000087025 0.002603157 0.010120629 254 ...
例如,D2C 是硬體設備執行操作所需的時間。
您也可以
sudo smartctl -a /dev/sda
在每張光碟上執行以查看是否有任何故障顯示。