如何防止磁碟 i/o 超時導致磁碟斷開連接和 SMR 磁碟數據損壞?
我有這些希捷磁碟(ST5000LM000 - 請注意它們是 SMR),當我將它們置於繁重的寫入工作負載下時,i/o 使用率達到 100%,吞吐量基本上為零。磁碟插入使用
mpt3sas
驅動程序的 SAS 控制器(磁碟顯示為 scsi 設備)。我嘗試更改noop
調度程序,將 ncq 設置為 1,並將設備超時時間增加到 1 小時。我什至嘗試了一個完全不同的磁碟控制器(它使用megaraid
驅動程序),它沒有改變任何東西。每個驅動器都有一個 XFS 分區。唯一似乎有幫助的是降低我的腳本寫出文件的並發性,以便磁碟 i/o 永遠不會落後,以至於滾雪球效應使事情停止。
我認為
echo 1 > /sys/block/sdl/device/queue_depth
應該防止並發磁碟操作,但我通常會看到大約 150 個正在進行的操作來自cat /sys/block/sdl/stat
.這是一個大問題,因為如果在這種情況開始發生時我不終止載入腳本,最終 i/o 操作會超時導致磁碟斷開連接,這有時會導致程序陷入可怕的
D
狀態,我經常會結束帶有損壞的數據。我可以更改核心設置以防止進入這種不良狀態嗎? 似乎應該有一些我可以做的事情,因為如果我足夠早地殺死它,它總是可以在任何 i/o 操作超時並斷開磁碟之前被趕上。
kern.log
從磁碟實際斷開連接時開始[401217.833235] sd 0:0:6:0: device_block, handle(0x0010) [401218.583675] mpt3sas_cm0: log_info(0x31110e03): originator(PL), code(0x11), sub_code(0x0e03) [401218.833518] sd 0:0:6:0: device_unblock and setting to running, handle(0x0010) [401222.584105] sd 0:0:6:0: device_block, handle(0x0010) [401230.581727] sd 0:0:6:0: device_unblock and setting to running, handle(0x0010) [401230.586627] scsi_io_completion: 6 callbacks suppressed [401230.586641] sd 0:0:6:0: [sdg] tag#0 FAILED Result: hostbyte=DID_NO_CONNECT driverbyte=DRIVER_OK [401230.586656] sd 0:0:6:0: [sdg] tag#0 CDB: Read(16) 88 00 00 00 00 01 3b e5 74 18 00 00 02 00 00 00 [401230.586661] XFS (sdg): metadata I/O error: block 0x800007b8 ("xfs_trans_read_buf_map") error 5 numblks 32 [401230.586670] XFS (sdg): xfs_imap_to_bp: xfs_trans_read_buf() returned error -5. [401230.597537] blk_update_request: 6 callbacks suppressed [401230.597540] blk_update_request: I/O error, dev sdg, sector 5299860504
磁碟頻寬基本上下降到零 平均 i/o 請求時間猛增 磁碟 i/o 保持在 100% 使用率 飛行中 i/o 請求保持在 150 左右 (請注意,在上面的圖像中它最終恢復,因為我取消了我的載入腳本在寫入吞吐量顯著下降的中間某處)
發行版/核心
$ lsb_release -d Description: Ubuntu 16.04.6 LTS $ uname -r 4.15.0-62-generic
fdisk -l
Disk /dev/sdl: 4.6 TiB, 5000981078016 bytes, 9767541168 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 4096 bytes I/O size (minimum/optimal): 4096 bytes / 4096 bytes
xfs_info
meta-data=/dev/sdl isize=512 agcount=5, agsize=268435455 blks = sectsz=4096 attr=2, projid32bit=1 = crc=1 finobt=1 spinodes=0 data = bsize=4096 blocks=1220942646, imaxpct=5 = sunit=0 swidth=0 blks naming =version 2 bsize=4096 ascii-ci=0 ftype=1 log =internal bsize=4096 blocks=521728, version=2 = sectsz=4096 sunit=1 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0
我更改了以下核心參數,並且 SMR 磁碟在寫入負載過重時不再斷開連接。有時寫入性能會在繁重的 I/O (如個位數 MB/s 寫入速度)下緩慢下降,但磁碟至少不再斷開連接。
DEVICE=sdX # insert your device name here echo 3600 > /sys/block/$DEVICE/device/timeout echo 3600 > /sys/block/$DEVICE/device/eh_timeout echo noop > /sys/block/$DEVICE/queue/scheduler echo 1 > /sys/block/$DEVICE/device/queue_depth echo 4 > /sys/block/$DEVICE/queue/nr_requests
我沒有單獨測試每一個,所以我不確定是否需要設置每一個,但這種組合確實對我有用。