Cách nhận mức sử dụng CPU tổng thể (ví dụ 57%) trên Linux [đã đóng]


193

Tôi tự hỏi làm thế nào bạn có thể có được việc sử dụng CPU hệ thống và trình bày nó theo phần trăm bằng cách sử dụng bash, ví dụ.

Đầu ra mẫu:

57%

Trong trường hợp có nhiều hơn một lõi, sẽ rất tuyệt nếu tính tỷ lệ phần trăm trung bình.


1
@julesanchez giá trị cần được đặt ở một nơi khác, do đó nó phải là một int
user1199739

làm top> myfile.txt Và áp dụng bộ lọc của bạn trong xử lý hậu kỳ, có ổn không?
JuSchz

11
Một lệnh không yêu cầu sysstat:ps -A -o pcpu | tail -n+2 | paste -sd+ | bc
RFon 3/03/2015

7
Mở lại tôi không hiểu tại sao điều này lại bị coi là lạc đề, những người đã đóng nó có thể quan tâm để giải thích không?
Jonathan H

3
Sự hiểu biết của tôi /proc/statrất hạn chế, nhưng lớp lót này hoạt động đủ tốt cho tôi : cat <(grep 'cpu ' /proc/stat) <(sleep 1 && grep 'cpu ' /proc/stat) | awk -v RS="" '{printf "%.2f%\n", ($13-$2+$15-$4)*100/($13-$2+$15-$4+$16-$5)}'. Với% .2f, bạn có thể kiểm soát số thập phân bạn muốn xuất và với sleep 1bạn có thể đặt thời gian bạn muốn trung bình hơn, nghĩa là, nếu nó làm như tôi nghĩ. Bạn có thể đặt nó trong một vòng lặp bash while để kiểm tra nó trong thời gian thực.
Yeti

Câu trả lời:


174

Hãy xem cat /proc/stat

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

EDIT vui lòng đọc các bình luận trước khi sao chép-dán này hoặc sử dụng nó cho bất kỳ công việc nghiêm trọng nào. Điều này đã không được thử nghiệm và cũng không được sử dụng, đó là một ý tưởng cho những người không muốn cài đặt một tiện ích hoặc cho một cái gì đó hoạt động trong bất kỳ phân phối. Một số người nghĩ rằng bạn có thể "apt-get install" bất cứ điều gì.

LƯU Ý: đây không phải là mức sử dụng CPU hiện tại , mà là mức sử dụng CPU tổng thể trong tất cả các lõi kể từ khi khởi động hệ thống. Điều này có thể rất khác với việc sử dụng CPU hiện tại. Để có được giá trị hiện tại hàng đầu (hoặc công cụ tương tự) phải được sử dụng.

Việc sử dụng CPU hiện tại có thể được tính toán với:

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)

12
Nhưng bạn phải cài đặt mpstat như bạn giới thiệu ở trên. Nhiều người không có sự linh hoạt đó. cat / Proc / stat thì pipe dễ hơn nhiều so với mpstat mà bạn đề xuất.
vimdude

12
+1 Không hiểu tại sao phân tích cú pháp một tiện ích khác tốt hơn phân tích cú pháp/proc/stat
Phục hồi lại Monica Vui lòng

9
hệ thống + người dùng + nhàn rỗi = 100%. Vì vậy, có thể một cái gì đó như: grep 'cpu' / Proc / stat | awk '{cpu_usage = ($ 2 + $ 4) * 100 / ($ 2 + $ 4 + $ 5)} END {in cpu_usage "%"}'
vimdude

106
Tôi nghĩ rằng giải pháp này không hiển thị tải CPU hiện tại mà là tải cpu trung bình kể từ khi CPU khởi động.
Etienne

11
@jlliagre, vâng đúng vậy. Để tính toán mức sử dụng cpu HIỆN TẠI không trung bình, bạn sẽ cần lấy giá trị $ 1 ​​sau đó trì hoãn sau đó lấy giá trị $ 1 ​​và xem sự khác biệt. Đó là cách sử dụng cpu hiện tại.
vimdude

102

Bạn co thể thử:

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

11
Mỗi lần tôi chạy lệnh này, tôi nhận được cùng một đầu ra ( 32.7%).
alanaktion

13
Một kết quả chính xác hơn được đưa ra khi tôi sử dụng top -bn2, nhưng phải mất một thời gian dài. Từ những gì tôi đã đọc, đây dường như là cách duy nhất để có được kết quả chính xác.
alanaktion

6
top -bn1dường như không chính xác trên hệ thống FC20 của tôi. top -bn2dường như làm việc tốt
Martin Tournoij

23
Lệnh trong câu trả lời này dường như được viết cho các hệ thống top -vtrả về procps-ng(ví dụ: Fedora). Ngoài ra, còn có procps, được tìm thấy trên, ví dụ, Ubuntu và CentOS, nơi lệnh không hoạt động (luôn chỉ ra 100%, vì phân tích cú pháp không thành công do dòng với các số liệu CPU được định dạng khác nhau). Đây là phiên bản hoạt động với cả hai triển khai:top -b -n2 -p 1 | fgrep "Cpu(s)" | tail -1 | awk -F'id,' -v prefix="$prefix" '{ split($1, vs, ","); v=vs[length(vs)]; sub("%", "", v); printf "%s%.1f%%\n", prefix, 100 - v }'
mkuity0

2
Lưu ý bên: trên OSX, sử dụng như sau : top -l 2 -n 0 -F | egrep -o ' \d*\.\d+% idle' | tail -1 | awk -F% -v prefix="$prefix" '{ printf "%s%.1f%%\n", prefix, 100 - $1 }'.
mkuity0

38

Thử mpstattừ sysstatgói

> 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

Sau đó, một số cuthoặc grepphân tích thông tin bạn cần:

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

1
Tôi không tin điều này cho thấy tổng số CPU
user1199739

Tôi muốn nói rằng 100-% nhàn rỗi đó là tổng mức sử dụng CPU (tính theo%)
Peter Svensson

Đó là tỷ lệ "không" được sử dụng. Câu trả lời này là tốt, cho đến khi grep | đuôi | phần awk ...
jordanm

Tôi sẽ thay đổi awkphần thành : awk -F " " '{print (100 - $12)"%"}', cho đầu ra được định dạng như anh ta muốn, nhưng nếu không thì điều này có vẻ tốt với tôi.
Dan Fego

1
@jordanm Tất cả sự thật; Tôi đã bỏ phiếu nhiều hơn vì nó hoạt động. Cá nhân tôi sẽ làm điều này:mpstat | awk '$12 ~ /[0-9.]+/ { print 100 - $12 }'
Dan Fego

22

Cũng có thể đưa ra một phản ứng thực tế với giải pháp của tôi, được lấy cảm hứng từ Peter Liljenberg:

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

Điều này sẽ sử dụng awkđể in ra 100 trừ đi trường thứ 12 (không hoạt động), với dấu phần trăm sau nó. awksẽ chỉ làm điều này cho một dòng trong đó trường thứ 12 chỉ có số và dấu chấm ( $12 ~ /[0-9]+/).

Bạn cũng có thể trung bình năm mẫu, cách nhau một giây:

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

Kiểm tra nó như thế này:

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

14
Sẽ tốt hơn nếu chạy "mpstat 2 1 | ..." để nó hiển thị các số liệu thống kê trong 1 giây cuối cùng. Mặt khác, theo mặc định, mpstat hiển thị số liệu thống kê kể từ khi bắt đầu và điều đó không thay đổi nhiều khi thời gian tiến triển
Sarang

1
"mpstat | awk '$ 12 ~ /[0-9.[+/ {print 100 - $ 11"% "}'" công việc này đối với tôi.
AloneInTheDark

@Sarang Cảm ơn bạn rất nhiều !! Cuối cùng tôi cũng có thể nhận được kết quả conkyđang hiển thị. Thật không may, dòng này RẤT chậm, gần như mất đến một giây để thực thi.
cú pháp

6
@syntaxerror Mất đúng 2 giây vì nếu bạn nhìn vào lệnh sẽ giúp bạn thấy rằng đối số thứ nhất là khoảng đó nhưng nó chỉ thực thi một lần vì đối số thứ hai nên nó đợi 2 giây cho đến khi trả về kết quả.
Johan Bjäreholt 30/1/2015

Câu hỏi đã bị đóng, vì vậy hãy thêm câu trả lời (tương tự) của tôi vào câu hỏi của bạn :-) Hy vọng bạn không phiền. Giống như bạn, tôi đã được truyền cảm hứng từ câu trả lời của Peter Liljenberg.
PJ Brunet

16

EDITED: Tôi nhận thấy rằng trong phần trả lời% idle của người dùng khác là trường 12 thay vì trường 11. Awk đã được cập nhật để giải thích cho trường% idle đang biến.

Điều này sẽ giúp bạn có đầu ra mong muốn:

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

Nếu bạn muốn làm tròn số nguyên đơn giản, bạn có thể sử dụng printf:

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

2
mpstat 1 1 | awk '$3 ~ /CPU/ { for(i=1;i<=NF;i++) { if ($i ~ /%idle/) field=i } } $3 ~ /all/ { printf("%d",100 - $field) }'làm việc tuyệt vời cho tôi, cảm ơn. lưu ý mpstat 1 1 để đảm bảo rằng việc sử dụng cpu được lấy mẫu trong một giây
chrishiestand

1
Nếu bạn có jq:mpstat -o JSON -u 1 1 | jq '.sysstat.hosts[0].statistics[0]["cpu-load"][0].idle'
nyet
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.