Linux

如何防止磁碟 i/o 超時導致磁碟斷開連接和 SMR 磁碟數據損壞?

  • January 26, 2020

我有這些希捷磁碟(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 請求時間猛增 磁碟 i/o 保持在 100% 使用率 磁碟 i/o 保持在 100% 的使用率 飛行中 i/o 請求保持在 150 左右 飛行中的 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

我沒有單獨測試每一個,所以我不確定是否需要設置每一個,但這種組合確實對我有用。

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