我现在在管理一个用于科学计算的计算机集群。集群中有些进程需要大量 io 使用。现在我发现这样一个进程:
- 其状态在 DOWN 和 RUN 之间快速变化,其 CPU 使用率在 1% 和 100% 之间快速变化。
- 输出中
top
,iowait为0%,idle约为90%
我认为该进程可能存在一些问题,但进程所有者声称它运行正常,因为它仍在将数据写入磁盘。
更多信息:
- 该进程正在将数据写入挂载在 /home 上的远程磁盘
- 该过程基于稍微修改过的代码。原始软件能够进行多线程处理,但需要大量内存。修改后的代码使用更多磁盘和更少内存,但修改代码的人对多线程一无所知。
- 小测试表明代码可以给出正确的结果
问题:
- 为什么该进程没有使用 100% 的 CPU,如果是因为等待 io,那么为什么 iowait 是 0%?
- 如何判断流程中是否有问题、是什么类型的问题?
答案1
The process is writing data to a remote disk mounted on /home
这可能是你的答案。进程状态D
不是向下, 这是不间断睡眠通常意味着需要完成一些 I/O。由于您有网络共享,根据情况,它可能不会显示为 I/O 等待,并且可能不会在您的系统等待时消耗太多 CPU。
但是,如果由于应用程序的编写方式、网络或文件服务器性能而导致网络共享速度很慢,那么对于您和您的应用程序来说,速度就会非常慢。
如何确定是应用程序还是网络共享导致的?很简单——使用其他工具和其他使用模式测试网络共享性能。将大量数据从 /home 复制到其他位置并返回,运行一些基准测试,例如iozone
,使用 测试原始网络性能iperf
,诸如此类。
如果这些给你合理的结果,那么去看看你的应用程序正在做什么。
但很多时候原因在于其他地方;在不了解您的系统的情况下,我猜您需要调整 NFS 挂载设置。但是,目前这仍然只是猜测,因为我不知道您是否正在使用 NFS。
答案2
如果 CPU 不忙,则您的进程可能正在等待外部的某些东西。我想,通过使用 strace 查看哪些系统调用耗时最长,您很有可能会弄清楚这一点。
除此之外,请尝试使用分析器来找出代码正在做什么。
您的代码是否使用 mmap'd IO?我认为这可能不会被报告为您的进程的 iowait 时间,但会显示为系统进程使用大量磁盘,因为它将页面刷新到磁盘。