簡體   English   中英

如何在 Linux 上獲取整體 CPU 使用率(例如 57%)

[英]How to get overall CPU usage (e.g. 57%) on Linux

例如,我想知道如何獲取系統 CPU 使用率並使用 bash 以百分比表示。

樣本輸出:

57%

如果有多個內核,最好能計算出平均百分比。

看看cat /proc/stat

grep 'cpu ' /proc/stat | awk '{usage=($2+$4)*100/($2+$4+$5)} END {print usage "%"}'

編輯請在復制粘貼或將其用於任何嚴肅的工作之前閱讀評論。 這沒有經過測試或使用,對於不想安裝實用程序或在任何發行版中都可以使用的東西的人來說,這是一個想法。 有些人認為你可以“apt-get install”任何東西。

注意:這不是當前的CPU 使用率,而是自系統啟動以來所有內核的總體 CPU 使用率。 這可能與當前的 CPU 使用率非常不同。 要獲取當前值,必須使用 top(或類似工具)。

當前 CPU 使用率可以通過以下方式計算:

awk '{u=$2+$4; t=$2+$4+$5; if (NR==1){u1=u; t1=t;} else print ($2+$4-u1) * 100 / (t-t1) "%"; }' \
<(grep 'cpu ' /proc/stat) <(sleep 1;grep 'cpu ' /proc/stat)

你可以試試:

top -bn1 | grep "Cpu(s)" | \
           sed "s/.*, *\([0-9.]*\)%* id.*/\1/" | \
           awk '{print 100 - $1"%"}'

sysstat包中嘗試mpstat

> sudo apt-get install sysstat
Linux 3.0.0-13-generic (ws025)  02/10/2012  _x86_64_    (2 CPU)  

03:33:26 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest   %idle
03:33:26 PM  all    2.39    0.04    0.19    0.34    0.00    0.01    0.00    0.00   97.03

然后一些cutgrep來解析你需要的信息:

mpstat | grep -A 5 "%idle" | tail -n 1 | awk -F " " '{print 100 -  $ 12}'a

不妨對我的解決方案做出實際回應,這是受到 Peter Liljenberg 的啟發:

$ mpstat | awk '$12 ~ /[0-9.]+/ { print 100 - $12"%" }'
0.75%

這將使用awk打印出 100 減去第 12 個字段(空閑),其后帶有一個百分號。 awk只會對第 12 個字段只有數字和點的行執行此操作( $12 ~ /[0-9]+/ )。

您還可以平均間隔一秒的五個樣本:

$ mpstat 1 5 | awk 'END{print 100-$NF"%"}'

像這樣測試它:

$ mpstat 1 5 | tee /dev/tty | awk 'END{print 100-$NF"%"}'

編輯:我注意到在另一個用戶的回復中 %idle 是字段 12 而不是字段 11。awk 已更新以說明 %idle 字段是可變的。

這應該會得到你想要的輸出:

mpstat | awk '$3 ~ /CPU/ { for(i=1;i<=NF;i++) { if ($i ~ /%idle/) field=i } } $3 ~ /all/ { print 100 - $field }'

如果你想要一個簡單的整數四舍五入,你可以使用 printf:

mpstat | awk '$3 ~ /CPU/ { for(i=1;i<=NF;i++) { if ($i ~ /%idle/) field=i } } $3 ~ /all/ { printf("%d%%",100 - $field) }'

這樣做可以查看整體 CPU 使用率 這調用python3並使用跨平台psutil模塊

printf "%b" "import psutil\nprint('{}%'.format(psutil.cpu_percent(interval=2)))" | python3

interval=2部分表示在 2 秒的阻塞周期內測量總 CPU 負載。

樣本輸出:

9.4%

它包含的python程序是這樣的:

import psutil

print('{}%'.format(psutil.cpu_percent(interval=2)))

在調用前面放置time證明在這種情況下它需要大約 2 秒的指定間隔時間。 這是調用和輸出:

$ time printf "%b" "import psutil\nprint('{}%'.format(psutil.cpu_percent(interval=2)))" | python3
9.5%

real    0m2.127s
user    0m0.119s
sys 0m0.008s

要查看單個內核的輸出,讓我們使用下面的這個 python 程序。 首先,我獲得“per CPU”信息的python 列表(數組),然后對該列表中的所有內容進行平均以獲得“total % CPU”類型值。 然后我打印總和單個核心百分比。

蟒蛇程序:

import psutil

cpu_percent_cores = psutil.cpu_percent(interval=2, percpu=True)
avg = sum(cpu_percent_cores)/len(cpu_percent_cores)
cpu_percent_total_str = ('%.2f' % avg) + '%'
cpu_percent_cores_str = [('%.2f' % x) + '%' for x in cpu_percent_cores]
print('Total: {}'.format(cpu_percent_total_str))
print('Individual CPUs: {}'.format('  '.join(cpu_percent_cores_str)))

如果您願意,可以將其包裝成一個非常丑陋的 1 行 bash 腳本,就像這樣。 我必須確保在 Python 程序中僅使用單引號 ( '' ),而不是雙引號 ( "" ),以便將其包裝成 bash 1-liner 工作:

printf "%b" "import psutil\n\
cpu_percent_cores = psutil.cpu_percent(interval=2, percpu=True)\n\
avg = sum(cpu_percent_cores)/len(cpu_percent_cores)\n\
cpu_percent_total_str = ('%.2f' % avg) + '%'\n\
cpu_percent_cores_str = [('%.2f' % x) + '%' for x in cpu_percent_cores]\n\
print('Total: {}'.format(cpu_percent_total_str))\n\
print('Individual CPUs: {}'.format('  '.join(cpu_percent_cores_str)))\n\
" | python3

示例輸出:請注意我有 8 個內核,因此“Individual CPUs:”后面有 8 個數字:

Total: 10.15%
Individual CPUs: 11.00%  8.50%  11.90%  8.50%  9.90%  7.60%  11.50%  12.30%

有關psutil.cpu_percent(interval=2) python 調用如何工作的更多信息,請參閱此處的官方psutil.cpu_percent(interval=None, percpu=False)文檔

psutil.cpu_percent(interval=None, percpu=False)

返回一個浮點數,以百分比表示當前系統范圍的 CPU 利用率。 當間隔大於0.0時,比較間隔之前和之后經過的系統 CPU 時間(阻塞)。 當間隔為0.0None時,比較自上次調用或模塊導入以來經過的系統 CPU 時間,立即返回。 這意味着第一次調用它會返回一個無意義的0.0值,你應該忽略它。 在這種情況下,為了准確起見,建議在兩次調用之間至少間隔0.1秒調用此函數。 當 percpu 為 True 時,返回一個浮點列表,表示每個 CPU 的利用率百分比。 列表的第一個元素指的是第一個 CPU,第二個元素指的是第二個 CPU,依此類推。 列表的順序在調用之間是一致的。

警告:第一次使用 interval = 0.0None調用此函數時,它將返回一個無意義的0.0值,您應該忽略該值。

參考:

  1. Stack Overflow:如何在 Python 中獲取當前的 CPU 和 RAM 使用情況?
  2. 堆棧溢出:在單行命令行中執行多行語句?
  3. 如何顯示帶有兩位小數的浮點數?
  4. 查找列表的平均值

有關的

  1. https://unix.stackexchange.com/questions/295599/how-to-show-processes-that-use-more-than-30-cpu/295608#295608
  2. https://askubuntu.com/questions/22021/how-to-log-cpu-load

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM