如何找到佔用機器的進程

如何找到佔用機器的進程

場景:突然間,我的電腦感覺運作緩慢。滑鼠移動,但視窗需要很長時間才能打開,等等,uptime表示負載為 7.69 並且正在上升。

找出造成負載的進程的最快方法是什麼?

現在,「top」和類似的工具並不是答案,因為它們要麼顯示 CPU 或記憶體使用情況,但不能同時顯示兩者。我需要的是一個我可以在發生時輸入的命令 - 可以計算出以下任何內容的命令

系統正在嘗試將 8GB RAM 交換到磁碟,因為進程 X ...

或者

進程 X 在整個磁碟上進行查找

或者

進程 X 使用 400% CPU”

所以我正在尋找的是 iostat、htop/atop 和類似的工具,它們的輸出如下:

 1235 cp - Disk trashing
   87 chrome - Uses 2 GB of RAM
  137 nfs_bench - Uses 95% of the network bandwidth

我不需要一個為我提供一些可以分析的數字的工具,而是一個可以準確告訴我哪個進程導致當前負載的工具。假設鍵盤前的使用者幾乎不知道如何寫“進程”,但是當談到“駐留大小”、“虛擬記憶體”或“進程生命週期”時,用戶很快就會不知所措。

我的論點是這樣的:使用者註意到一個問題。可能有數千個原因......好吧,幾乎:-) 用戶想知道問題的根源。

目前的解決方案給了我很多數字,我需要知道這些數字意味著什麼。我正在尋找的是一個元工具。 99%的數據與問題無關。因此,該工具應該要做的是尋找佔用一些資源的進程,並僅列出那些「該進程需要大量 CPU,這會產生許多 IRQ,該進程分配大量 RAM(並且仍在增長)」的進程。

這將是一個相對較短的列表。對於剛接觸這個的人來說,從這個清單中找到罪魁禍首比從輸出中找到罪魁禍首簡單得多,比如說,htop它給了我大約5000 個數字,但需要我自己折疊多線程進程(我有50 行,VIRT 2750M但只有 16 GB 的 RAM - 機器應該自行交換死機,但當然,這是對可能很快發生的資料的誤解)。

答案1

我確實不得不對這些回答微笑,因為每個人都告訴你運行工具 X。像這樣的工具薩爾如果你以足夠高的頻率運行它會有所幫助,但我想說收集甚至更好。

喜歡薩爾,您可以透過安裝 RPM 並執行以下操作將其作為守護程序運行/etc/init.d/collectl start

現在,當您看到某些緩慢的東西時,collectl -p /var/log/collectl/filename --top將回放資料並向您顯示最重要的進程。您也可以直接運行collectl --top並即時查看它們。順便說一句 - 任何你可以實時做的事情都可以回放。

至於 CPU 負載,如果中斷超載怎麼辦? collectl -sC不僅會顯示各個 CPU 上的負載(或用於-sc平均負載),還會顯示它們如何花費時間。包含-j( -scj),您將看到每個 CPU 的中斷數。使用大寫字母-J,您將看到每個中斷/CPU 的類型。

當然,如果你真的喜歡vmstat,你可以隨時回放collectl數據,--vmstat它會以vmstat格式顯示歷史數據。

開關的數量遠遠超出了我的時間列出的範圍,但您可以在以下位置查看:來源鍛造或者只是谷歌一下。

答案2

只要您查看正確的數字,「top」的效果就相當不錯。讓我們來看看:

top - 13:11:45 up 13 days,  1:13, 21 users,  load average: 0.06, 0.11, 0.26
Tasks: 271 total,   2 running, 267 sleeping,   0 stopped,   2 zombie
Cpu(s): 19.0%us,  6.3%sy,  0.0%ni, 74.0%id,  0.5%wa,  0.0%hi,  0.2%si,  0.0%st
Mem:   8183668k total,  8002712k used,   180956k free,    12476k buffers
Swap: 11847900k total,   723480k used, 11124420k free,   767016k cached

現在,如果系統因 CPU 被全部佔用而變慢,則會顯示「Cpu(s):」行上的「us」和「sy」列合計接近 100%。

如果因為交換而緩慢,「Mem:」「free」顯示非常低的值,「Swap:」「used」顯示高值。

如果速度慢是因為輸入/輸出一般來說,「Cpu(s):」「wa」表示時間花在 I/O 等待上。

現在,如果您知道 I/O 等待是問題所在,您可以使用程式「iotop」來了解哪些進程創建了最多的 I/O。

答案3

根據 400% 使用率,我假設您擁有四核心處理器。您的平均負載幾乎是容量的兩倍,一半的進程正在等待 CPU。

首先,renice將您的 shell 設為 0 或 -10 以獲得響應更快的系統,然後用於htop查找有問題的進程並strace在給定進程上遵循該進程。其他可能有用的工具有:

  • vmsat
  • sar
  • iostat
  • pmap

答案4

vmstat 可以在一般方面為您提供協助。使用範例是:

$ vmstat
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa
 1  0      0 977908 426184 1543884    0    0    38    45  106  385  4  1 95  1

您也可以每 X 秒運行一次——只需在命令後添加數字 X 即可。

編輯:鑑於評論...將以下內容寫入文件並使該文件可執行。它會告訴您機器上最重要的 3 個進程。

top -n 1 | tail -16 | head -4 | awk '{print $13}'

如果您想知道哪些佔用了記憶體而不是 CPU,請閱讀頂部手冊頁並更改顯示順序。

相關內容