Rsync

導致 I/O 效率低下的原因?

  • November 5, 2017

我正在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在每張光碟上執行以查看是否有任何故障顯示。

引用自:https://unix.stackexchange.com/questions/402545