Ale*_*lex 16 linux software-raid high-load
在过去的一周里,我的负载激增。这通常每天发生一次或两次。我已经设法从 iotop 确定 [jbd2/md1-8] 正在使用 99.99% IO。在高负载期间,服务器没有高流量。
服务器规格为:
除了尖峰,负载通常最多在 0.80 左右。
我四处搜索,但找不到 [jbd2/md1-8] 究竟做了什么。有没有人遇到过这个问题或者有没有人知道可能的解决方案?
谢谢你。
更新:
TIME TID PRIO USER DISK READ DISK WRITE SWAPIN IO COMMAND
16:05:36 399 be/3 root 0.00 B/s 38.76 K/s 0.00 % 99.99 % [jbd2/md1-8]
Run Code Online (Sandbox Code Playgroud)
Iwa*_*amp 25
这不是一个真正的答案,因为没有足够的上下文来给出确切的原因,但它描述了当它发生在我身上时我如何设法跟踪它。
我注意到我jbd2/md0-8一直出现在iotop. 我/sys/kernel/debug/tracing/events/jbd2查看了有哪些选项可以确定jbd2正在做什么。
NOTE-1:查看调试跟踪事件的输出cat /sys/kernel/debug/tracing/trace_pipe- 我在启用/禁用跟踪的同时在终端中运行它。
NOTE-2:要启用事件以进行跟踪,请使用例如echo 1 > /sys/kernel/debug/tracing/events/jbd2/jbd2_run_stats/enable. 要禁用echo 0 > /sys/kernel/debug/tracing/events/jbd2/jbd2_run_stats/enable.
我从启用开始/sys/kernel/debug/tracing/events/jbd2/jbd2_run_stats/enable- 但是在它的输出中没有什么特别有趣的东西。我尝试了其他一些事件来跟踪,当我启用时,/sys/kernel/debug/tracing/events/jbd2/jbd2_commit_flushing/enable我看到它每秒都在发生:
# cat /sys/kernel/debug/tracing/trace_pipe
...
jbd2/md0-8-2520 [004] .... 658660.216492: jbd2_commit_flushing: dev 9,0 transaction 32856413 sync 0
jbd2/md0-8-2520 [001] .... 658661.334900: jbd2_commit_flushing: dev 9,0 transaction 32856414 sync 0
jbd2/md0-8-2520 [001] .... 658661.394113: jbd2_commit_flushing: dev 9,0 transaction 32856415 sync 0
Run Code Online (Sandbox Code Playgroud)
这看起来似乎是与sync(2)/ fsync(2)/ msync(2),所以我找了一些方法来此链接到过程中,发现这样的:
# find /sys/kernel/debug/tracing/events/ | grep sync.*enable
...
/sys/kernel/debug/tracing/events/ext4/ext4_sync_file_enter/enable
...
Run Code Online (Sandbox Code Playgroud)
当我启用它时,我看到以下输出:
# cat /sys/kernel/debug/tracing/trace_pipe
...
nzbget-17367 [002] .... 658693.222288: ext4_sync_file_enter: dev 9,0 ino 301924373 parent 301924357 datasync 1
jbd2/md0-8-2520 [001] .... 658693.284080: jbd2_commit_flushing: dev 9,0 transaction 32856465 sync 0
nzbget-17367 [000] .... 658693.334267: ext4_sync_file_enter: dev 9,0 ino 301924357 parent 301924353 datasync 1
jbd2/md0-8-2520 [002] .... 658693.334275: jbd2_commit_flushing: dev 9,0 transaction 32856466 sync 0
nzbget-17367 [001] .... 658694.369514: ext4_sync_file_enter: dev 9,0 ino 301924367 parent 301924357 datasync 1
jbd2/md0-8-2520 [002] .... 658694.414861: jbd2_commit_flushing: dev 9,0 transaction 32856467 sync 0
nzbget-17367 [001] .... 658694.470872: ext4_sync_file_enter: dev 9,0 ino 301924357 parent 301924353 datasync 1
jbd2/md0-8-2520 [002] .... 658694.470880: jbd2_commit_flushing: dev 9,0 transaction 32856468 sync 0
Run Code Online (Sandbox Code Playgroud)
这给了我进程名称/id - 在对这个进程做了一些更多的调试之后 ( nzbget) 我发现它fsync(2)每秒都在做。在我更改了它的配置(FlushQueue=no我认为没有记录,在源代码中找到它)以阻止它每秒执行此操作后fsync(2),问题就消失了。
我的内核版本是4.4.6-gentoo. 我认为我make oldconfig在内核配置中的某个时间启用了一些选项(手动或使用)来获取/sys/kernel/debug这些事件 - 所以如果你没有它,也许只是在互联网上查看有关启用的更多信息它。
这似乎是与日志更新相关的事情。软件 RAID 由多少个磁盘组成。你能告诉我用于创建它的命令吗?
您还可以粘贴 dumpe2fs 输出吗?首先,确定您看到负载的物理设备。使用 df 就可以知道这一点。然后,
dumpe2fs /dev/sdaX > /tmp/dump
Run Code Online (Sandbox Code Playgroud)
对于您的情况,它可能是/dev/md0。
另外,运行这个。
iostat -xdk 1 25
Run Code Online (Sandbox Code Playgroud)
IO高的时候出现问题。
我不知道cloudlinux,但它下有blktrace工具吗?
| 归档时间: |
|
| 查看次数: |
29889 次 |
| 最近记录: |