我有一个定期“出去吃午饭”的盒子。症状是任何需要实际磁盘 IO 挂起 30 多秒的东西,并且看起来任何已经分页的东西都没有受到影响。该问题间歇性地发生,最多每小时发生几次),并且到目前为止还无法追溯到任何正在运行的程序或用户行为。现在重新成像盒子将是一个很大的破坏,所以我希望隔离这个问题并希望证明这是不必要的。带有 btrfs-on-luks nvme root fs 的 Ubuntu 20.04 系统。
用户描述 + 日志分析 (dmesg
和journalctl
) 没有显示任何与问题相关的行为,除了 10 秒后的 io-timeout 相关消息,这些消息似乎显然是症状/后果。该盒子在 ubuntu 20.04 上使用了大约 6 个月(没有注意到这个问题的实例),几个月前被重新映像,所以我有一个小数据点,表明问题没有失败。 btrfs scrub
并且biossmart
不报告任何错误。
在复制过程中使用iotop -o
live 我可以看到磁盘的实际吞吐量下降到 ~ 零,除了几个内核线程[kworker/.*events-power-efficient]
。
请推荐后续步骤来分类/隔离 IO 挂起的原因。
根据要求的智能输出:
#> smartctl -a /dev/nvme0n1` as requested:
[...]
=== START OF SMART DATA SECTION ===
SMART overall-health self-assessment test result: PASSED
SMART/Health Information (NVMe Log 0x02)
Critical Warning: 0x00
Temperature: 33 Celsius
Available Spare: 100%
Available Spare Threshold: 10%
Percentage Used: 0%
Data Units Read: 4,339,623 [2.22 TB]
Data Units Written: 7,525,333 [3.85 TB]
Host Read Commands: 23,147,319
Host Write Commands: 69,696,108
Controller Busy Time: 1,028
Power Cycles: 98
Power On Hours: 3,996
Unsafe Shutdowns: 25
Media and Data Integrity Errors: 0
Error Information Log Entries: 0
Warning Comp. Temperature Time: 0
Critical Comp. Temperature Time: 0
Error Information (NVMe Log 0x01, max 256 entries)
No Errors Logged
按照@anx 的建议使用netdata
,我越来越接近:在我能看到的所有情况下,内核内存中的以下症状似乎与再现 100% 相关。在约 1 分钟的不可回收内核分配内存的过程中 ~加倍。在这一切都被分配期间,~所有 IO 都被挂起。当内存被释放时,IO 有时会在下坡道上解除阻塞。中心峰值/倍增非常一致,之前和之后的较小峰值略有不同。
致力于清点每小时运行的 cron 和 systemd 任务。查看是否有任何可以启用的调试日志记录,因为今天在这些时间日志中没有任何可疑之处。
模式(降级何时发生?)和相关指标(降级期间是否有任何其他指标急剧下降/飙升?)通常是识别触发因素的最快途径。
即使触发器不是问题的原因(例如,如果系统因内存压力而停顿,但它这样做的机制更复杂),有一个可靠的再现方法是有帮助的,这样您就可以获得更多的数据。
分诊步骤:
netdata
可视化确定模式和/或相关指标的工具。当问题发生时,性能指标是否会发生任何事情?最有用的问题可能出现在性能下降之前- 您看到的问题很可能是某些驱动程序或程序行为不端的恢复阶段。top
安排任务,确保您在事件期间(例如,甚至)获得相关系统状态的快照(或每 X 个时间单位一个echo t >/proc/sysrq-trigger ; dmesg
)。至少手动运行一次计划任务,以便缓存其依赖项常见解释的想法:
discard
),或缺少它加上大量写入使系统等待磁盘完成