在托管各种网站的服务器上,我经常看到 IO 成为瓶颈,而无法使用 iotop、iostat 或 sar 等工具识别负责 IO 操作的进程。
我怀疑这些进程正在对元数据执行大量 IO(读取和/或写入属性、创建或删除大量空文件等)。不幸的是,这些操作似乎没有被“按进程”计算,也不是使用内存映射文件 (mmap) 执行的 IO。
我的问题是:有没有办法监视和/或计算(例如,使用 cgroups 和 blkio)每个进程或(可能更好)每个文件的 IO,包括元数据和内存映射文件上的 io?
目前,我正在尝试使用 systemtap 来计算“哪些请求击中磁盘”,探测handle_mm_fault()(内核中的 mm/memory.c)是否存在主要页面错误,但我无法验证是否对文件系统进行了操作元数据生成由该函数处理的页面错误。
感谢您的见解!
答案1
我想出了一个 systemtap 脚本,它与我想要做的很接近,但它不跟踪写入。
答案2
在我发表评论之后,我刚刚记住了这个伟大的命令:奥托普
iotop watches I/O usage information output by the Linux kernel (requires
2.6.20 or later) and displays a table of current I/O usage by processes or
threads on the system.
然而它通常没有安装,所以由于你的服务器似乎正在生产中,你可能想看看这里如果你无法安装它。
还拉索夫是一个很好的命令来检查进程打开的文件。