Linux

以非互動方式辨識佔用大量 CPU 時間的程序

  • September 7, 2021

我有一個奇怪的問題:有時當我的顯示器關閉時,風扇運轉得很響,據我所知,即使系統上的 CPU 使用率不高。

但是,只要我移動滑鼠並開始top嘗試對此進行診斷,該活動(無論它是什麼)都會停止;隨著風扇的關閉。

所以我想要一個可以在某個時間點啟動的腳本/程序/方法,在該程序記錄程序的 CPU 活動時讓電腦無人看管,然後當我恢復操作電腦時,我應該能夠從我很快就會知道是什麼過程讓粉絲們努力工作。

編輯:一個chromium過程是在螢幕關閉時讓風扇大聲運轉的過程。不過不知道為什麼。

這應該這樣做:

Top 有一個“批處理”模式,用於非互動式使用,可通過-b. 所以這個腳本每 10 秒記錄一次最高輸出:

#! /bin/sh

set -u

recording=/tmp/top_recording.txt

top_interval_seconds=10

top -b -d "$top_interval_seconds" > "$recording"

遺憾的是,除了前幾個之外的所有程序/任務都是多餘的,所以我使用 Tr 和 Sed 查看報告,只留下 Top 生成的每個快照的前三個程序:

#! /bin/sh

set -u

recording=/tmp/top_recording.txt

regexp_first_few_lines='top'\
'[^\x00]*\x00'\
'[^\x00]*\x00'\
'[^\x00]*\x00'\
'[^\x00]*\x00'\
'[^\x00]*\x00'\
'[^\x00]*\x00'\
'[^\x00]*\x00'\
'[^\x00]*\x00'\
'[^\x00]*\x00'\
'[^\x00]*\x00'

export LC_ALL=C

< "$recording" \
  tr '\n' '\0' | \
  sed -E -e 's/\x00top/\ntop/g' | \
  sed -E -e 's/^('"$regexp_first_few_lines"')(.|\x00)*$/\1/' | \
  tr '\0' '\n' | \
  less

要在 Less 中查找高 CPU 活動程序,請使用:

/[0-9] [A-Za-z] ([^ ]| [^ ]|  [987])

您可以每隔幾秒鐘執行一次“ps”,連同一個基本的 loadavg 轉儲,以簡化搜尋。將其保存為“psdump.sh”並使用chmod +x psdump.sh.

#!/bin/bash

while true; do
   sleep 15
   date
   cat /proc/loadavg
   ps Swaux | awk '$3!=0.0 {print}'
done

您可以從終端執行腳本,以便將其保存到文件並在後台執行:

/home/lserni/psdump.sh > /home/lserni/psdump.log

那麼,就等著吧。該文件將顯示如下內容,

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  5.0  0.0 185412  5272 ?        Ss   Jan30 15340:14 /lib/systemd/systemd --system --deserialize 27
root        63  1.6  0.0      0     0 ?        S    Jan30 5042:59 [kswapd0]
root      1930  1.5  0.0  29008  2464 ?        Ss   Jan30 4816:50 /usr/sbin/cron -f
root      7446  0.1  0.0 3964564 60880 ?       Sl   Jan30 425:27 /opt/dell/srvadmin/sbin/dsm_om_connsvcd -run
mysql     7509  3.3 57.3 41322444 37757724 ?   Ssl  Aug17 599:39 /usr/sbin/mysqld
root      9634 17.1  4.9 6141588 3234672 ?     Ssl  Jan30 52154:34 /usr/local/bin/antani

日誌文件將僅報告具有非零 CPU 百分比的程序(包括子程序)。您感興趣的列可能是 %CPU 和累計時間(第 3 列和第 10 列)。

引用自:https://unix.stackexchange.com/questions/666779