我在 Azure 中管理一些虚拟机,每周有几次,在看似随机的时间,其中一些虚拟机会启动I/O 读取速度超过 400 Mb/s。这种情况一次发生在一台机器上,而不是同时发生。
这些机器使用SSD作为硬盘,但那些读取速度似乎不正常。
此外,经历此活动的机器几分钟后无法通过 SSH 访问。
我目前正在使用奥托普尝试将其输出到日志文件,因此在重新启动卡住的机器后,我可以检查它并尝试识别导致问题的进程。
我还使用 crontab 每分钟运行一次。
在下面找到我正在使用的当前脚本:
#!/usr/bin/env bash
OUT=/var/log/zs/io.log
echo $(date) >> $OUT
echo $(iotop -o -b -n 1|head -n 2) >> $OUT
echo $(iotop -o -b -n 1|head -n 6|tail -n +4) >> $OUT
显示 I/O 峰值的日志文件:
Fri Jan 12 09:33:01 CET 2024
Total DISK READ : 113.45 M/s | Total DISK WRITE : 7.04 M/s Actual DISK READ: 171.85 M/s | Actual DISK WRITE: 85.79 M/s
3350 be/4 root 41.59 M/s 0.00 B/s ?unavailable? containerd 11744 be/4 root 112.49 M/s 0.00 B/s ?unavailable? dockerd -H fd:// --containerd=/run/containerd/containerd.sock 11925 be/4 root 1142.56 K/s 0.00 B/s ?unavailable? dockerd -H fd:// --containerd=/run/containerd/containerd.sock
Fri Jan 12 09:58:35 CET 2024
显然它似乎与 docker 进程有关,但我想知道:
- 是否可以防止机器无法访问?
- 如何追踪导致此问题的确切 Docker 容器?
先感谢您。
答案1
Docker 应该能够通过使用 cgroups (V2) 对 io 操作设置限制。
然而,高磁盘写入速率通常会导致不是通过 ssh 使机器无响应。
我最好的猜测是,它不是单个 docker 容器,而是您的操作系统:您可能已激活交换,并且您的容器之一正在探索 RAM 使用情况。
不管怎样,使用您最喜欢的过程监控工具应该很容易弄清楚这一点。top
会这样做,但我更喜欢htop
,因为它也能够显示 Io 读/写速率列。
您应该使用相同的机制,即 docker 的 cgroups 集成,来限制容器可以需求的 RAM 量。不要禁用交换;这只会让事情变得更糟,因为您失去了内存短期超额需求的灵活性。