Top và ps không hiển thị cùng kết quả cpu


54

Điều này được liên kết với câu hỏi này .

Khi tôi chạy, toptôi nhận được kết quả như sau:

nhập mô tả hình ảnh ở đây

pid 3038đang sử dụng 18% cpu, tuy nhiên khi chạy

nhập mô tả hình ảnh ở đây

kết quả là 5,5%. Và con số này dường như không thay đổi theo thời gian (tức là khi chạy cùng một lệnh sau đó một chút) ...

pslệnh bằng cách nào đó trung bình sử dụng cpu?

Câu trả lời:


87

man pstrong NOTESphần.

   CPU usage is currently expressed as the percentage of time spent running
   during the entire lifetime of a process.  This is not ideal, and it does not
   conform to the standards that ps otherwise conforms to.  CPU usage is
   unlikely to add up to exactly 100%.

Và, đoán bạn biết, nhưng bạn cũng có thể làm:

top -p <PID>

Chỉnh sửa : như nhận xét của bạn về câu trả lời khác;

" Hmm yeah tôi tự hỏi làm thế nào để có được điều đó (phần trăm CPU tức thời) từ ps "

Câu trả lời ngắn gọn: bạn không thể.

Tại sao nó như vậy?

Nó giống như yêu cầu ai đó tính tốc độ của một chiếc xe hơi từ một bức tranh.

Trong khi toplà một công cụ giám sát, pslà một công cụ chụp nhanh. Hãy nghĩ về nó như thế này: Tại bất kỳ thời điểm nào, một quá trình đều sử dụng CPU hoặc không. Do đó, bạn có tải 0% hoặc 100% trong thời điểm chính xác đó.

Cho đi: Nếu psnên cho sử dụng CPU ngay lập tức, nó sẽ là 0% hoặc 100%.

top mặt khác giữ số lượng bỏ phiếu và tính tải theo thời gian.

pscó thể đã đưa ra cách sử dụng hiện tại - nhưng điều đó sẽ yêu cầu nó đọc dữ liệu nhiều lần và ngủ giữa mỗi lần đọc. Nó không.

Tính toán cho ps% cpu

ps tính toán mức sử dụng CPU theo cách sau:

uptime = tổng thời gian hệ thống đã được chạy.
ps_time = thời gian bắt đầu quá trình được tính bằng giây từ khi khởi động.
pu_time = quá trình tổng thời gian đã sử dụng CPU.

;; Quá trình giây đã được chạy:
giây = thời gian hoạt động - ps_time
;; Sử dụng:
cpu_usage = pu_time * 1000 / giây

in: cpu_usage / 10 "." cpu_usage% 10


Thí dụ: thời gian hoạt động = 344,545 ps_time = 322.462 pu_time = 3,383 giây = 344,545 - 322,462 = 22,083 cpu_usage = 3,383 * 1.000 / 22,083 = 153 in: 153/10 "." 153% 10 => 15.3

Vì vậy, số được in là: thời gian quá trình sử dụng CPU trong suốt vòng đời của nó. Như trong ví dụ trên. Nó đã làm như vậy trong 15,3% của cuộc đời. Trong 84,7% thời gian nó không được xử lý trên CPU.

Phục hồi dữ liệu

ps, cũng như top, sử dụng dữ liệu từ các tệp được lưu trữ bên dưới /proc/- hoặc hệ thống tệp giả thông tin quy trình .

Bạn có một số tệp trong thư mục gốc /proc/có thông tin khác nhau về trạng thái chung của hệ thống. Ngoài ra, mỗi tiến trình có thư mục con riêng /proc/<PID>/, nơi lưu trữ dữ liệu cụ thể của quá trình. Vì vậy, ví dụ quá trình từ câu hỏi của bạn có một thư mục tại /proc/3038/.

Khi pstính toán mức sử dụng CPU, nó sử dụng hai tệp:

/ Proc / uptime Thời gian hoạt động của hệ thống (giây) và lượng thời gian dành cho quá trình nhàn rỗi (giây).
/ Proc / [PID] / stat Thông tin trạng thái về quy trình.
  • Từ uptimeđó sử dụng giá trị đầu tiên ( thời gian hoạt động ).
  • Từ [PID]/statđó sử dụng như sau:
 # Tên Mô tả
14 thời gian CPU sử dụng trong mã người dùng, được đo bằng jiffies
Thời gian CPU 15 giây dành cho mã hạt nhân, được đo bằng jiffies
16 thời gian CPU đáng tin cậy dành cho mã người dùng, bao gồm cả thời gian từ trẻ em
17 thời gian CPU cstime dành cho mã hạt nhân, bao gồm cả thời gian từ trẻ em 
22 thời gian bắt đầu Thời gian khi quá trình bắt đầu, được đo bằng jiffies

Một jiffie là đồng hồ tích tắc. Vì vậy, ngoài ra, nó còn sử dụng nhiều phương pháp khác nhau, ví dụ sysconf(_SC_CLK_TCK), để lấy Hertz của hệ thống (số lần đánh dấu mỗi giây) - cuối cùng sử dụng 100 làm dự phòng sau khi làm cạn kiệt các tùy chọn khác.

Vậy nếu utimelà 1234 và Hertz là 100 thì:

seconds = utime / Hertz = 1234 / 100 = 12.34

Tính toán thực tế được thực hiện bởi:

total_time = utime + stime

IF include_dead_children
    total_time = total_time + cutime + cstime
ENDIF

seconds = uptime - starttime / Hertz

pcpu = (total_time * 1000 / Hertz) / seconds

print: "%CPU" pcpu / 10 "." pcpu % 10

Ví dụ (Đầu ra từ tập lệnh Bash tùy chỉnh):

$ ./psw2 30894
System information
           uptime : 353,512 seconds
             idle : 0
Process information
              PID : 30894
         filename : plugin-containe
            utime : 421,951 jiffies 4,219 seconds
            stime : 63,334 jiffies 633 seconds
           cutime : 0 jiffies 0 seconds
           cstime : 1 jiffies 0 seconds
        starttime : 32,246,240 jiffies 322,462 seconds

Process run time  : 31,050
Process CPU time  : 485,286 jiffies 4,852 seconds
CPU usage since birth: 15.6%

Tính toán tải "hiện tại" với ps

Đây là một nỗ lực mờ ám (bit?) Nhưng OK. Hãy đi đi.

Người ta có thể sử dụng thời gian được cung cấp bởi psvà tính toán mức sử dụng CPU từ việc này. Khi nghĩ về nó, nó thực sự có thể khá hữu ích, với một số hạn chế.

Điều này có thể hữu ích để tính toán việc sử dụng CPU trong một khoảng thời gian dài hơn. Tức là bạn muốn theo dõi tải CPU trung bình của plugin-containerFirefox trong khi thực hiện một số tác vụ liên quan đến Firefox.

Bằng cách sử dụng đầu ra từ:

$ ps -p -o cputime, etimes

CODE    HEADER   DESCRIPTION
cputime TIME     cumulative CPU time, "[DD-]hh:mm:ss" format.  (alias time).
etime   ELAPSED  elapsed time since the process was started, [DD-]hh:]mm:ss.
etimes  ELAPSED  elapsed time since the process was started, in seconds.

Tôi sử dụng etimetrên etimestrong mẫu này, trên các tính toán, chỉ là một chút rõ ràng hơn. Ngoài ra tôi thêm% cpu cho "vui vẻ". Trong ví dụ, một tập lệnh bash rõ ràng người ta sẽ sử dụng etimes- hoặc đọc tốt hơn từ /proc/<PID>/v.v.

Start:
$ ps -p 30894 -o %cpu,cputime,etime,etimes
%CPU     TIME     ELAPSED ELAPSED
 5.9 00:13:55    03:53:56   14036

End:
%CPU     TIME     ELAPSED ELAPSED
 6.2 00:14:45    03:56:07   14167

Calculate times:
            13 * 60 + 55 =    835   (cputime this far)
3 * 3,600 + 53 * 60 + 56 = 14,036   (time running this far)

            14 * 60 + 45 =    885   (cputime at end)
3 * 3,600 + 56 * 60 +  7 = 14,167   (time running at end)

Calculate percent load:
((885 - 835) / (14,167 - 14,036)) * 100 = 38

Quá trình đã sử dụng CPU 38% thời gian trong giai đoạn này.

Nhìn vào mã

Nếu bạn muốn biết làm thế nào psvà biết một chút C, hãy làm (có vẻ như bạn chạy Gnome Debain deriavnt) - thái độ tốt đẹp trong mã liên quan đến ý kiến, v.v .:

apt-get source procps
cd procps*/ps
vim HACKING

Tôi có thể cập nhật với nhiều thông tin hơn topvà theo dõi liên tục - hoặc chụp nhanh bằng cách trì hoãn aka " ps" với tải CPU hiện tại.
Runium

2
Câu trả lời thực sự tuyệt vời!
Theodor

Thế còn khi tính toán tổng mức sử dụng CPU trên toàn bộ hệ thống. Là các công cụ đang cố gắng để có được việc sử dụng CPU thông qua một ảnh chụp nhanh, hoặc tính trung bình theo thời gian?
CMCDragonkai

4
man top

%CPU  --  CPU usage
The  task's share of the elapsed CPU time since the last screen update, expressed as a percentage of total CPU time.  In a true SMP environment, if 'Irix
mode' is Off, top will operate in 'Solaris mode' where a task's cpu usage will be divided by the total number of CPUs.  You toggle  'Irix/Solaris'  modes
with the 'I' interactive command.


man ps 
%cpu       %CPU    cpu utilization of the process in "##.#" format. Currently, it is the CPU time used divided by the time the process has been running                       (cputime/realtime ratio), expressed as a percentage. It will not add up to 100% unless you are lucky. (alias pcpu).

Hmm yeah tôi tự hỏi làm thế nào để có được điều đó (tỷ lệ phần trăm CPU ngay lập tức) từps
Theodor

2
bạn có thể trích xuất từ ​​ví dụ hàng đầutop -p 3343 -n1 | awk '/ R /{print $10}'
Rahul Patil

1
Tuyệt vời. Tôi thấy rằng awk: ing cho công pidviệc tốt hơn, như trongtop -p 3343 -n1 | awk '/ 3343 /{print $10}'
Theodor

1
Cảm ơn "top -p" là tốt, tôi không bao giờ nhận thấy tùy chọn này! Tuy nhiên, tôi không thích tìm kiếm PID, nếu tình cờ các chữ số tương tự xuất hiện trong phần bộ nhớ trống hoặc thứ gì đó. Trên hệ thống của tôi, thông tin nằm ở dòng thứ 8 và cột thứ 9 do đó tôi thực hiện:top -p $PID -n1 | awk '{if (NR ==8) print $9 }'
phil_w
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.