Nhận sử dụng cpu mỗi lần.


13

Khi tôi thực hiện lệnh sau để sử dụng cpu, tôi sẽ sử dụng cpu cho người dùng.

top -b -n1 | grep "Cpu(s)" | awk '{print $2 + $4}' 

Đầu ra:

14.5

Ở đây tôi gặp vấn đề là đầu ra phụ thuộc vào lệnh trên cùng do đó nó không thay đổi ngay lập tức như lệnh trên. Vì vậy, tôi không nhận được cpu chính xác ngay lập tức. Nó cho đầu ra tương tự và không thay đổi.

Tôi muốn có được cpuusage thời gian thực trong đầu ra. Xin hãy giúp tôi cải thiện mệnh lệnh của tôi.


1
Và câu hỏi là?
Dennis Kaarsemaker 26/03/13

Hãy thử chạy lệnh được chuẩn bị trước time. Trên hệ thống của tôi, nó chỉ mất 0.165s.
tước

Xin vui lòng cho tôi chỉnh sửa lệnh.
Ketan Patel

Hãy thử:time (top -b -n1 | grep "Cpu(s)" | awk '{print $2 + $4}' )
tước

không có sự khác biệt về đầu ra, sau khi được thử nghiệm trong các hệ thống khác nhau
Ketan Patel 29/03/13

Câu trả lời:


13

Bạn nói đúng, topdường như cung cấp cho việc sử dụng CPU không chính xác trong lần lặp đầu tiên. Bạn có thể giải quyết vấn đề này như thế này:

top -b -n2 | grep "Cpu(s)"|tail -n 1 | awk '{print $2 + $4}'

Điều này tất nhiên sẽ mất gấp đôi thời gian, nhưng dù sao nó cũng sẽ hoạt động.

Nếu bạn vẫn muốn nó hoạt động nhanh hơn, bạn có thể sử dụng -dtùy chọn, ví dụ: trong tổng thời gian đo 1 giây, hãy sử dụng một nửa số đó:

top -d 0.5 -b -n2 | grep "Cpu(s)"|tail -n 1 | awk '{print $2 + $4}'

serverfault.com/a/436499/134517 cũng sẽ mất nhiều hơn gấp đôi thời gian vì sẽ mất khoảng một giây thay vì gần như không có.
altendky

Ngoài bình luận của altendky, xem thêm câu trả lời của terdon để được giải thích tại sao vấn đề lại ở đó ngay từ đầu.
Ruslan

6

Về mặt kỹ thuật, đầu tiên topkhông phải lúc nào cũng xuất ra cùng một giá trị; nó chỉ xuất ra tải CPU trung bình kể từ lần khởi động trước. Vì topsử dụng delta /proc/statthống kê để tính tải CPU, giá trị đầu tiên được tính trong khi so sánh với 0, cho kết quả không chính xác (nhưng WAD).

Nếu bạn không muốn sử dụng top, bạn có thể phân tích trực tiếp /proc/stat:

cat <(grep 'cpu ' /proc/stat) <(sleep 1 && grep 'cpu ' /proc/stat) | awk -v RS="" '{print ($13-$2+$15-$4)*100/($13-$2+$15-$4+$16-$5) "%"}'

Nó cũng nhanh hơn và chính xác hơn theo cách này.

Bạn có thể kiểm tra nó với stress:

stress -c 1 -q &

Và làm

killall stress

sau.


Đẹp. Và nếu lệnh của bạn được đặt trong một tệp có tên 'cpu', thì watchcó thể chạy trên đó:watch -n1 "bash ./cpu"
Brent Faust

Kịch bản awk của bạn để phân tích cú pháp /proc/statkhá tuyệt nhưng nó có vẻ có nhược điểm giống như lần lặp đầu tiên hàng đầu: Nó tạo ra tải CPU trung bình kể từ lần khởi động trước, không phải lần hiện tại.
pieroxy

5

Chỉ cần mở rộng câu trả lời của @ Ruslan, topphân chia việc sử dụng CPU giữa người dùng, quy trình hệ thống và nicequy trình, chúng tôi muốn tổng của cả ba. Vì vậy, chúng ta có thể chạy toptrong bchế độ atch cho phép chúng ta phân tích đầu ra của nó. Tuy nhiên, như đã giải thích ở đây , lần lặp đầu tiên top -btrả về tỷ lệ phần trăm kể từ khi khởi động, do đó chúng ta cần ít nhất hai lần lặp ( -n 2) để có được tỷ lệ phần trăm hiện tại. Để tăng tốc mọi thứ, bạn có thể đặt delay giữa các lần lặp thành 0.01:

top -bn 2 -d 0.01 | grep '^%Cpu' | tail -n 1 | gawk '{print $2+$4+$6}'

4

Có thể sử dụng cái này dựa trên psđầu ra:

ps aux  | awk 'BEGIN { sum = 0 }  { sum += $3 }; END { print sum }

0

Sử dụng lệnh watch hoặc cho vòng lặp trong shell,

I E watch -n1 "top -b -n1 | grep 'Cpu(s)' | awk '{print \$2 + \$4}'"


Điều tương tự xảy ra với đồng hồ
Ketan Patel 26/03/13

0

Tại sao bạn quan tâm đến việc sử dụng CPU? Trung bình tải là một chỉ báo tốt hơn nhiều:

cat /proc/loadavg

Nếu bạn thực sự cần sử dụng CPU, phân tích cú pháp /proc/statcó lẽ là cách để đi.


1
Tải trung bình về cơ bản là tích phân thời gian của việc sử dụng CPU (chia cho thời gian). Tại sao bạn lại nói một đặc tính tách rời là chỉ số [của mọi thứ] tốt hơn nhiều so với một đặc tính khác biệt khi chúng có các trường hợp sử dụng hoàn toàn khác nhau? Ngoài ra, /proc/statkhông cho sử dụng CPU như hiện tại, người ta phải đọc nó hai lần trong một khoảng thời gian giữa các lần đọc và thực hiện một số tính toán để có được mức sử dụng CPU. Đây chỉ là những gì toplàm.
Ruslan

Tôi không thể làm toán, vì vậy tôi phải thừa nhận rằng tôi không thực sự hiểu sự khác biệt giữa tích phân và vi phân: / "Trung bình tải về cơ bản là tích phân thời gian của việc sử dụng CPU" - có thực sự không? AFAIK một quá trình bị treo ở trạng thái D gây tăng tải, nhưng không sử dụng CPU. "Tại sao bạn lại nói ..." - OP không nói những gì anh ấy thực sự muốn đạt được, vì vậy thành thật mà nói, tôi chỉ cho rằng anh ấy muốn đo tải hệ thống của mình và nghĩ rằng việc sử dụng CPU sẽ là chỉ số tốt nhất cho việc này , vì vậy tôi hướng dẫn anh ta tải trung bình.
Martin von Wittich

Từ liên kết của bạn: "Các hệ thống tính trung bình tải là trung bình di chuyển theo cấp số nhân / trọng số của số tải." và "tải hệ thống là thước đo lượng công việc tính toán". Nhà nước D không tham gia bất kỳ công việc tính toán nào. Những gì đang dùng là các quá trình sử dụng thời gian CPU. Vì vậy, tải trung bình về cơ bản là phần trăm thời gian CPU không hoạt động trong một khoảng thời gian (giả sử, từ vài phút đến hàng chục phút). Và việc sử dụng CPU là phần trăm thời gian CPU không ở chế độ thời gian tính bằng mili giây - tức là được cập nhật mỗi khi bạn đọc nó và phản ánh trạng thái hiện tại .
Ruslan

-2

Sử dụng sarlệnh

sar 1 10

Điều đó có nghĩa là: nhận được 10 lần kết quả trong mỗi giây

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.