
我現在正在管理一個用於科學計算的電腦集群。叢集中的某些進程需要大量 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 時間,但會在將頁面刷新到磁碟時顯示為使用大量磁碟的系統進程。