
LUKS パーティションにデータを移行中です。オペレーティング システム ドライブが LUKS から実行されているので、データ ドライブの移行を開始しようとしました。すると、サーバーが応答しなくなりました。
このLUKSデバイスは開かれました:
cryptsetup luksOpen /dev/sdc data1
そして、これらのコマンドのいずれかがサーバーを圧迫しました:
pv /dev/zero > /dev/mapper/data1
pv /dev/zero > /dev/sdc
すぐにではありませんが、数秒以内にサーバーは使用できないほど遅くなりました。I/O のすべてがブロックされました。
root@node51 [~]# ps aux | awk '{if($8~"D"||$8=="STAT"){print $0}}'
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1197 0.0 0.0 0 0 ? D 06:39 0:00 [jbd2/dm-1-8]
root 1687 0.1 0.0 0 0 ? D 11:15 0:12 [kworker/u96:5]
root 13057 2.0 0.0 0 0 ? D 13:10 0:01 [dmcrypt_write]
root 13644 10.9 0.0 7452 784 pts/1 D+ 13:10 0:08 pv /dev/zero
root 14159 0.0 0.0 98256 6836 ? DNs 13:10 0:00 sshd: root [priv]
root 14772 0.0 0.0 29008 92 ? D 13:11 0:00 /usr/sbin/CRON -f
root 14773 0.0 0.0 98256 6748 ? DNs 13:11 0:00 sshd: root [priv]
root 15411 0.0 0.0 98256 6876 ? DNs 13:11 0:00 sshd: root [priv]
root 16009 0.1 0.0 98256 6840 ? DNs 13:11 0:00 sshd: root [priv]
root 16632 0.5 0.0 98256 6892 ? DNs 13:11 0:00 sshd: root [priv]
root 16900 0.0 0.0 5448 356 pts/3 D+ 13:11 0:00 awk {if($8~"D"||$8=="STAT"){print $0}}
root 28553 0.6 0.0 0 0 ? D 12:12 0:21 [txg_sync]
注目すべきは、約 2 秒間、pv
を超える速度でデータをコピーしていたことが報告されたことです2GiB/s
。これは、ライトバック キャッシュとダーティ ページの両方がいっぱいになっているためです ( の監視によって検出/proc/meminfo
)。
その後、pv
通常の書き込み速度を記録しましたが、ライトバック キャッシュではと200MiB/s
の間でまだ先行していました。2GiB
3GiB
すべての I/O ブロックが起こっているため、サーバーの負荷平均は 10.00 を超えて急上昇しました。
pv
ライトバック キャッシュを空にする必要があるため、書き込みテストを中止するにはしばらく時間がかかりますが、テストが中止された直後にサーバーのパフォーマンスは正常に戻りました。
興味深いことに、これらのコマンドはサーバーの遅延を引き起こしません。
# Reads from dm-crypt block device
pv /dev/mapper/data1 > /dev/zero
# Reads from the raw block device
pv /dev/sdc > /dev/zero
# Writes to a control disk of a different model
pv /dev/zero > /dev/sdi
# Reads from a control disk
pv /dev/sdi > /dev/zero
# Writes to a file on a dm-crypt ext4 filesystem on a solid-state drive
pv /dev/zero > /tmp/empty
# Reads from that same solid-state drive
pv /dev/sda > /dev/zero
次のような質問があります:
- このデータ ディスクへの連続書き込みが継続すると、サーバーの速度がなぜこれほど低下するのでしょうか?
- 特定の 1 台または少数のディスクに書き込むときに、他のディスクの速度低下を回避するにはどうすればよいでしょうか?
- なぜこの種類のハードドライブではパフォーマンスの問題が発生するのに、他のドライブでは発生しないのでしょうか?
/dev/sdc
暗号化するディスクは同じモデル ( 、、、、、、 )が 6 台あり、将来的には順次書き込みワークロードが発生するため、この問題によってサーバーが停止しないようにしたいと考えています/dev/sdd
。/dev/sde
/dev/sdf
/dev/sdg
/dev/sdh
追加情報
クイックファクト
サーバ: デルパワーエッジT320
カーネル: Linux node51 4.4.0-22-generic #39-Ubuntu SMP Thu May 5 16:53:32 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
オペレーティング·システム: Ubuntu Server 16.04 LTS Xenial Xerus 64 ビット
問題のあるハードドライブ: 東芝 PH3500U-1I72
私はこれらのディスクを 6 台所有しており、すべて正常であることが分かっています。そのうち 2 台をテストしたところ、両方のディスクでサーバー全体の I/O パフォーマンスの低下が発生しました。ディスクは、ほぼ200MiB/s
最初から読み取りと書き込みを実行していました。
コントロール(問題のない)ハードドライブ: サムスン SP1614C
このディスクの持続書き込み速度は です50MiB/s
。問題のあるディスクが速すぎる可能性がありますか?
ディスクコントローラ: デル PERC H310
このコントローラには、2 台のソリッド ステート ドライブと 6 台の問題のあるハード ドライブが接続されており、それらはすべて AHCI として直接渡されます。制御ディスクは、マザーボードに組み込まれた SATA ポートに接続されています。
I/Oスケジューラ
root@node51 [/tmp]# tail -n +1 /sys/block/sd*/queue/scheduler
==> /sys/block/sda/queue/scheduler <==
noop [deadline] cfq
==> /sys/block/sdb/queue/scheduler <==
noop [deadline] cfq
==> /sys/block/sdc/queue/scheduler <==
[noop] deadline cfq
==> /sys/block/sdd/queue/scheduler <==
[noop] deadline cfq
==> /sys/block/sde/queue/scheduler <==
[noop] deadline cfq
==> /sys/block/sdf/queue/scheduler <==
[noop] deadline cfq
==> /sys/block/sdg/queue/scheduler <==
[noop] deadline cfq
==> /sys/block/sdh/queue/scheduler <==
[noop] deadline cfq
==> /sys/block/sdi/queue/scheduler <==
noop [deadline] cfq
のスケジューラを/dev/sdc
から にnoop
変更してdeadline
も、目立った違いはありません。 スケジューラを に変更すると、cfq
遅延はいくらか軽減されるように見えますが、他のディスクの I/O 操作には依然として影響があります。
vm.dirty*
カーネルパラメータ
root@node51 [~]# sysctl -a | grep 'vm.dirty'
vm.dirty_background_bytes = 0
vm.dirty_background_ratio = 10
vm.dirty_bytes = 0
vm.dirty_expire_centisecs = 3000
vm.dirty_ratio = 20
vm.dirty_writeback_centisecs = 500
vm.dirtytime_expire_seconds = 43200
検出され記録された遅延の例/var/log/syslog
ZFS トランザクション グループの同期:
May 11 19:28:44 node51 kernel: [ 4080.179688] INFO: task txg_sync:3179 blocked for more than 120 seconds.
May 11 19:28:44 node51 kernel: [ 4080.179905] Tainted: P O 4.4.0-22-generic #39-Ubuntu
May 11 19:28:44 node51 kernel: [ 4080.180110] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message.
May 11 19:28:44 node51 kernel: [ 4080.180357] txg_sync D ffff88060b68baa8 0 3179 2 0x00000000
May 11 19:28:44 node51 kernel: [ 4080.180362] ffff88060b68baa8 ffff880616a96d00 ffff8806133ea940 ffff880603dc2940
May 11 19:28:44 node51 kernel: [ 4080.180366] ffff88060b68c000 ffff880616ad6d00 7fffffffffffffff ffff88056cb8c508
May 11 19:28:44 node51 kernel: [ 4080.180368] 0000000000000001 ffff88060b68bac0 ffffffff818211f5 0000000000000000
May 11 19:28:44 node51 kernel: [ 4080.180372] Call Trace:
May 11 19:28:44 node51 kernel: [ 4080.180381] [<ffffffff818211f5>] schedule+0x35/0x80
May 11 19:28:44 node51 kernel: [ 4080.180385] [<ffffffff81824315>] schedule_timeout+0x1b5/0x270
May 11 19:28:44 node51 kernel: [ 4080.180390] [<ffffffff810abe52>] ? default_wake_function+0x12/0x20
May 11 19:28:44 node51 kernel: [ 4080.180395] [<ffffffff810c33b2>] ? __wake_up_common+0x52/0x90
May 11 19:28:44 node51 kernel: [ 4080.180398] [<ffffffff81820744>] io_schedule_timeout+0xa4/0x110
May 11 19:28:44 node51 kernel: [ 4080.180412] [<ffffffffc05afbec>] cv_wait_common+0xbc/0x140 [spl]
May 11 19:28:44 node51 kernel: [ 4080.180416] [<ffffffff810c3a70>] ? wake_atomic_t_function+0x60/0x60
May 11 19:28:44 node51 kernel: [ 4080.180423] [<ffffffffc05afcc8>] __cv_wait_io+0x18/0x20 [spl]
May 11 19:28:44 node51 kernel: [ 4080.180487] [<ffffffffc071320e>] zio_wait+0x10e/0x1f0 [zfs]
May 11 19:28:44 node51 kernel: [ 4080.180528] [<ffffffffc069ce66>] dsl_pool_sync+0x2c6/0x430 [zfs]
May 11 19:28:44 node51 kernel: [ 4080.180573] [<ffffffffc06b85b6>] spa_sync+0x366/0xb30 [zfs]
May 11 19:28:44 node51 kernel: [ 4080.180576] [<ffffffff810abe52>] ? default_wake_function+0x12/0x20
May 11 19:28:44 node51 kernel: [ 4080.180623] [<ffffffffc06c9a4a>] txg_sync_thread+0x3ba/0x630 [zfs]
May 11 19:28:44 node51 kernel: [ 4080.180669] [<ffffffffc06c9690>] ? txg_delay+0x180/0x180 [zfs]
May 11 19:28:44 node51 kernel: [ 4080.180676] [<ffffffffc05aae31>] thread_generic_wrapper+0x71/0x80 [spl]
May 11 19:28:44 node51 kernel: [ 4080.180682] [<ffffffffc05aadc0>] ? __thread_exit+0x20/0x20 [spl]
May 11 19:28:44 node51 kernel: [ 4080.180686] [<ffffffff810a0588>] kthread+0xd8/0xf0
May 11 19:28:44 node51 kernel: [ 4080.180688] [<ffffffff810a04b0>] ? kthread_create_on_node+0x1e0/0x1e0
May 11 19:28:44 node51 kernel: [ 4080.180692] [<ffffffff8182568f>] ret_from_fork+0x3f/0x70
May 11 19:28:44 node51 kernel: [ 4080.180694] [<ffffffff810a04b0>] ? kthread_create_on_node+0x1e0/0x1e0
ext4ジャーナル:
May 11 20:46:46 node51 kernel: [ 6000.186474] INFO: task jbd2/dm-2-8:1148 blocked for more than 120 seconds.
May 11 20:46:46 node51 kernel: [ 6000.193164] Tainted: P O 4.4.0-22-generic #39-Ubuntu
May 11 20:46:46 node51 kernel: [ 6000.199950] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message.
May 11 20:46:46 node51 kernel: [ 6000.208323] jbd2/dm-2-8 D ffff88060a6e7c98 0 1148 2 0x00000000
May 11 20:46:46 node51 kernel: [ 6000.208330] ffff88060a6e7c98 0000000000000246 ffff8806133eb700 ffff88060b561b80
May 11 20:46:46 node51 kernel: [ 6000.208333] ffff88060a6e8000 ffff88060aeb68b8 ffff88060a6e7d88 ffff88060a6e7d70
May 11 20:46:46 node51 kernel: [ 6000.208336] ffff88060b561b80 ffff88060a6e7cb0 ffffffff818211f5 ffff8805fd6af900
May 11 20:46:46 node51 kernel: [ 6000.208339] Call Trace:
May 11 20:46:46 node51 kernel: [ 6000.208355] [<ffffffff818211f5>] schedule+0x35/0x80
May 11 20:46:46 node51 kernel: [ 6000.208361] [<ffffffff812ea0e0>] jbd2_journal_commit_transaction+0x240/0x1870
May 11 20:46:46 node51 kernel: [ 6000.208365] [<ffffffff810b6be1>] ? dequeue_entity+0x431/0xa80
May 11 20:46:46 node51 kernel: [ 6000.208368] [<ffffffff810b774a>] ? dequeue_task_fair+0x51a/0x8a0
May 11 20:46:46 node51 kernel: [ 6000.208372] [<ffffffff810c3a70>] ? wake_atomic_t_function+0x60/0x60
May 11 20:46:46 node51 kernel: [ 6000.208378] [<ffffffff810ec5fe>] ? try_to_del_timer_sync+0x5e/0x90
May 11 20:46:46 node51 kernel: [ 6000.208381] [<ffffffff812ef32a>] kjournald2+0xca/0x250
May 11 20:46:46 node51 kernel: [ 6000.208384] [<ffffffff810c3a70>] ? wake_atomic_t_function+0x60/0x60
May 11 20:46:46 node51 kernel: [ 6000.208387] [<ffffffff812ef260>] ? commit_timeout+0x10/0x10
May 11 20:46:46 node51 kernel: [ 6000.208391] [<ffffffff810a0588>] kthread+0xd8/0xf0
May 11 20:46:46 node51 kernel: [ 6000.208394] [<ffffffff810a04b0>] ? kthread_create_on_node+0x1e0/0x1e0
May 11 20:46:46 node51 kernel: [ 6000.208397] [<ffffffff8182568f>] ret_from_fork+0x3f/0x70
May 11 20:46:46 node51 kernel: [ 6000.208399] [<ffffffff810a04b0>] ? kthread_create_on_node+0x1e0/0x1e0
May 11 20:46:46 node51 kernel: [ 6292.776357] perf interrupt took too long (2539 > 2500), lowering kernel.perf_event_max_sample_rate to 50000
答え1
制御ディスクは、マザーボードに内蔵された SATA ポートに接続されます。
前述のとおり、ジャーナル フラッシュ タイムアウトの問題が発生しているディスクは、問題のある Toshiba が接続されているのと同じコントローラーである PERC に接続されています。
PERC 310 は、基本的なハードウェア RAID カードにすぎません。CPU はおそらく簡単に圧倒されるか、ファームウェアのバグがあるかのどちらかです。ダイレクト AHCI はあまり一般的に使用されていません。
PERCのIOがロックアップしているのであって、OSではないと思います。
答え2
これは消化すべきことがたくさんあります。
ZFS を使用しているため、プール内の 5TB ディスクと、場合によってはプールの設定に問題がある可能性があります。
これらは 4k セクターのディスクである可能性があるため、それを考慮して ZFS セットアップでいくつかの調整を行う必要があります。
df -h
、、、および出力fdisk -l
を提供できますか?zpool list
zpool status -v
zfs list
答え3
ブロック デバイスの速度に比べて書き込みキャッシュが大きすぎると思います。次のことをお勧めします。
vm.dirty_background_bytes = 50000000
vm.dirty_bytes = 200000000
vm.dirty_expire_centisecs = 500
vm.dirty_writeback_centisecs = 20
*_bytes
決して両方とを設定しないでください*_ratio
。最後に設定された方が優先されます。また、一部の Linux カーネル バージョンでは、設定が意図したとおりに機能しないバグがある場合があります。常に*_ratio
を使用することをお勧めします。*_bytes
残念ながら、私の知る限り、書き込みキャッシュ設定はグローバルです。その結果、低速デバイスのためにグローバル書き込みキャッシュ サイズを減らす必要がある場合、高速デバイスへのスループットが少し低下します。