当在安装了 MySQL 守护进程的多个区域运行写入繁重的 Solaris 10 服务器上运行 DTT iotop 时,我得到以下输出:
UID PID PPID CMD 设备 MAJ MIN D 字节 70 26636 1 mysqld sd1 10 64 R 360448 70 25940 1 mysqld sd1 10 64 R 530432 0 5 0 zpool-rpool sd1 10 64 W 17250816
让我困扰的是,它zpool-rpool
占用了大部分 io。我该怎么做才能查看哪个 MySQL 或其他进程真正占用了 IO - 更详细的细分?如果zpool-rpool
表示“写入 ZFS”,那么 iotop 在这里真的帮不上忙…… :)
谢谢!
答案1
你可能会发现 Brendan Gregg 最近有关文件系统延迟的博客系列很有用。他展示了几个使用 syscall 提供程序调查文件系统使用情况的脚本(与 iotop 使用的 io 提供程序相比,它应该更可靠地识别负责的进程)。
例如,syscall-read-zfs.d
第 4 部分中显示的脚本可以轻松修改为探测写入并聚合 pid 而不是 execname。
此脚本的输出可能比 iotop 更有用,因为它显示了 IO 数量和每个进程的 IO 延迟分布。对于数据库,读取和同步写入的延迟是性能问题的直接衡量标准 - 比每秒字节数更容易解释。
如果你有时间,我也强烈建议你看他的BayLISA 上的演讲以实际演示他如何调查 MySQL 查询性能问题。
答案2
如果要测量哪些应用程序读取/写入最多,则需要在系统调用级别进行测量。在设备级别,只有内核线程在执行其工作。