Có cách nào để tính toán tỷ lệ sử dụng CPU bằng cách đọc / Proc / stat cùng một lúc không?


12

Tôi đoán câu hỏi là, bằng cách nào đó tôi có thể tính toán tỷ lệ phần trăm sử dụng CPU chỉ bằng cách đọc / Proc / stat một lần không?

# head -1 /proc/stat
cpu  67891300 39035 6949171 2849641614 118251644 365498 2341854 0

Tôi đang suy nghĩ về việc tóm tắt các cột ngoại trừ IOWait (tôi đã đọc ở đâu đó rằng nó được tính ở chế độ rảnh) và điều đó sẽ cho tôi 100% và mỗi cột riêng lẻ có thể được chuyển thành tỷ lệ phần trăm theo (cột / 100_percent) * 100.

  • người dùng: quá trình bình thường thực thi trong chế độ người dùng
  • Nice: xử lý các quá trình thực thi trong chế độ người dùng
  • system: process thực thi trong chế độ kernel
  • nhàn rỗi: ngón tay cái xoay tròn
  • iowait: chờ I / O hoàn thành
  • irq: ngắt dịch vụ
  • softirq: phục vụ softirqs
  • ăn cắp: chờ đợi không tự nguyện
  • khách: chạy một khách bình thường
  • guest_nice: điều hành một vị khách

Đây có phải là một cách tiếp cận khả thi hay tôi hoàn toàn không theo dõi?

Câu trả lời:


11

Bạn đang đi đúng hướng, topsử dụng tệp này cho mục đích này. Nhưng bạn cần phải đọc nó nhiều hơn một lần.

Sử dụng là một biện pháp sử dụng theo thời gian. Bạn có thể đọc nó một lần với điều kiện bạn biết thời gian hoạt động tính bằng giây của máy chủ, sau đó chia cho số đó, nhưng điều đó sẽ cung cấp cho bạn tỷ lệ tiện ích của máy chủ kể từ khi máy được khởi động.

Nếu bạn muốn tốc độ trên 5 giây, bạn sẽ đọc tệp một lần, ngủ trong 5 giây, đọc lại, nhận được sự khác biệt của các phép tính và chia cho 5.


6

Cách tiếp cận của bạn là chính xác. Bạn có thể sử dụng / Proc / stat làm dữ liệu thô và nguồn cấp dữ liệu ví dụ rrdtool với nó. Tôi đã làm cho mình một cái gì đó như thế này để tôi biết 100% là có thể. Sau đó, bạn có thể vẽ đồ thị toàn bộ hệ thống hoặc từng lõi riêng lẻ.

Đây là một ví dụ hoạt động của riêng tôi: nhập mô tả hình ảnh ở đây

Đánh giá lại -> Bạn có thể làm điều đó, không khó chỉ là toán học cơ bản và đồ thị của tôi là một ví dụ trực tiếp về điều đó. Để thu thập dữ liệu, tôi thực hiện một ảnh chụp nhanh / Proc / stat vào một tệp tạm thời được định vị trên ramdisk và sau đó tôi phân tích tệp đó để thu thập dữ liệu cứ sau 1 phút.

Làm thế nào tôi phân tích dữ liệu (đoạn mã bash):

cat=/bin/cat # others defined the same way
......

$cat /proc/stat > /ramdisk/tmp/stat

ssCpuRawUser=`$cat /ramdisk/tmp/stat|$grep "cpu " | $awk '{print $2}'`
ssCpuRawNice=`$cat /ramdisk/tmp/stat|$grep "cpu " | $awk '{print $3}'`
    #other columns follow ....... 

#the most important there is that it is an incrementing COUNTER.
if [ ! -f ${data_dir}/sys.cpu.rrd ];then
        $rrdtool create ${data_dir}/sys.cpu.rrd -s 60 \
        DS:ssCpuRawUser:COUNTER:300:0:1250000 \
        DS:ssCpuRawNice:COUNTER:300:0:1250000 \
        DS:ssCpuRawSystem:COUNTER:300:0:1250000 \
        DS:ssCpuRawIdle:COUNTER:300:0:1250000 \
        DS:ssCpuRawIOwait:COUNTER:300:0:1250000 \
        DS:ssCpuRawIRQ:COUNTER:300:0:1250000 \
        DS:ssCpuRawSoftIRQ:COUNTER:300:0:1250000 \
            RRA:AVERAGE:0.5:1:532800

fi

$rrdtool update ${data_dir}/sys.cpu.rrd N:$ssCpuRawUser:$ssCpuRawNice:$ssCpuRawSystem:$ssCpuRawIdle:$ssCpuRawIOwait:$ssCpuRawIRQ:$ssCpuRawSoftIRQ

# then in a loop each core the same way until all are parsed.

sau khi bạn nhận được dữ liệu vào cơ sở dữ liệu thứ nhất Bạn có thể vẽ đồ thị và bầu trời là giới hạn :) http://oss.oetiker.ch/rrdtool/doc/rrdgraph.en.html


Làm thế nào để bạn phân tích dữ liệu?
ewwhite

@ewwhite -> Tôi đã chỉnh sửa câu trả lời của mình để hiển thị cách tôi phân tích dữ liệu.
Bartłomiej Zarzecki

Đồ thị đẹp! Về chú thích cột bị thiếu của bạn: askubfox.com/a/120961/451886 . Nếu nó chạy trong VM, có thể đó là bộ đếm "ăn cắp".
rkagerer

+1 cho rrdtool và ramdisk!
shadi

4

Nếu bạn muốn oneliner, nó có thể trông như thế này:

echo $(echo '100'; echo $(echo '(';head -1 /proc/stat | awk '{print $5}'; sleep 1; echo '-';head -1 /proc/stat |  awk '{print $5}';echo ')/100') | bc -l) | bc -l

Kết quả: 97.17000000000000000000

Làm thế nào nó hoạt động:

echo $(echo '(';head -1 /proc/stat | awk '{print $5}'; sleep 1; echo '-';head -1 /proc/stat |  awk '{print $5}';echo ')/100')

sản xuất ( 1055057784 - 1055058055 )/100sau đó dòng này cung cấp cho bc. Sẽ có một cái gì đó như thế -7.84000000000000000000, sau đó chỉ cần bọc nó lại 100-$(value)và cho ăn bc một lần nữa

Ở đó: sleep #- Độ trễ 1 giây, nếu bạn thay đổi giá trị này thì kết quả trung gian sẽ được chia cho số giây. $5- Trường thứ 5, theo man prochttp://www.linuxhowtos.org/System/procstat.htm

Xin vui lòng cho tôi biết nếu điều này không làm việc cho bạn.


0

Hoặc nếu bạn hài lòng chỉ với hai chữ số sau thời điểm awk có thể thực hiện tất cả đơn giản hơn và dễ đọc hơn nhiều:

 awk -v oldidle=$(awk '/cpu / {print $5}' /proc/stat; sleep 1) '/cpu / {perc=100-($5-oldidle)/100 ; printf "%s", perc}' /proc/stat
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.