Atas dan ps tidak menampilkan hasil cpu yang sama

54

Ini terkait dengan pertanyaan ini .

Ketika saya menjalankan topsaya mendapatkan hasil berikut:

masukkan deskripsi gambar di sini

pid 3038menggunakan 18% cpu, namun saat dijalankan

masukkan deskripsi gambar di sini

hasilnya adalah 5,5%. Dan angka ini tampaknya tidak berubah dengan waktu (yaitu ketika menjalankan perintah yang sama sedikit kemudian) ...

Apakah psperintahnya entah bagaimana rata-rata penggunaan cpu?

Theodor
sumber

Jawaban:

87

man psdi NOTESbagian.

   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%.

Dan, tebak Anda tahu, tetapi Anda juga bisa melakukannya:

top -p <PID>

Sunting : untuk komentar Anda tentang jawaban lain;

" Hmm ya aku ingin tahu bagaimana cara mendapatkan (persentase CPU instan) dari ps "

Jawaban singkat: Anda tidak bisa.

Kenapa gitu?

Itu seperti meminta seseorang untuk menghitung kecepatan mobil dari sebuah gambar.

Sedangkan topalat pemantauan, psadalah alat snapshot. Pikirkan seperti ini: Pada saat tertentu suatu proses baik menggunakan CPU atau tidak. Dengan demikian Anda memiliki beban 0% atau 100% pada saat yang tepat.

Memberi: Jika psharus memberikan penggunaan CPU instan itu akan menjadi 0% atau 100%.

top di sisi lain tetap nomor polling dan hitung beban dari waktu ke waktu.

psbisa memberikan penggunaan saat ini - tetapi itu akan mengharuskannya untuk membaca data beberapa kali dan tidur di antara masing-masing membaca. Tidak.

Perhitungan untuk ps% cpu

ps menghitung penggunaan CPU dengan cara berikut:

uptime = total waktu sistem telah berjalan.
ps_time = proses waktu mulai diukur dalam detik dari boot.
pu_time = total waktu proses telah menggunakan CPU.

;; Proses detik telah berjalan:
detik = waktu aktif - ps_time
;; Pemakaian:
cpu_usage = pu_time * 1000 / detik

cetak: cpu_usage / 10 "." cpu_usage% 10


Contoh: uptime = 344.545 ps_time = 322.462 pu_time = 3,383 detik = 344.545 - 322.462 = 22.083 cpu_usage = 3.383 * 1.000 / 22.083 = 153 cetak: 153/10 "." 153% 10 => 15.3

Jadi nomor yang dicetak adalah: waktu proses telah menggunakan CPU selama masa pakainya. Seperti pada contoh di atas. Itu telah melakukannya dalam 15,3% dari masa hidupnya. Dalam 84,7% dari waktu itu belum bug di CPU.

Penerimaan data

ps, serta top, menggunakan data dari file yang disimpan di bawah /proc/- atau sistem pseudo-file informasi proses .

Anda memiliki beberapa file di root /proc/yang memiliki berbagai informasi tentang keadaan keseluruhan sistem. Selain itu setiap proses memiliki sub folder sendiri di /proc/<PID>/mana proses data spesifik disimpan. Jadi, misalnya proses dari pertanyaan Anda memiliki folder di /proc/3038/.

Saat psmenghitung penggunaan CPU, ia menggunakan dua file:

/ proc / uptime Uptime sistem (detik), dan jumlah waktu yang dihabiskan dalam proses idle (detik).
/ proc / [PID] / status stat informasi tentang proses.
  • Dari uptimeitu menggunakan nilai pertama ( uptime ).
  • Dari [PID]/statitu menggunakan yang berikut:
 # Deskripsi Nama
14 waktu CPU dihabiskan dalam kode pengguna, diukur dalam jiffies
15 stime waktu CPU dihabiskan dalam kode kernel, diukur dalam jiffies
16 cutime waktu CPU dihabiskan dalam kode pengguna, termasuk waktu dari anak-anak
17 waktu cstime CPU dihabiskan dalam kode kernel, termasuk waktu dari anak-anak 
22 waktu mulai Waktu ketika proses dimulai, diukur dalam jiffies

Sebuah jiffie adalah jam tick. Jadi selain itu menggunakan berbagai metode, yaitu., sysconf(_SC_CLK_TCK)Untuk mendapatkan sistem Hertz (jumlah kutu per detik) - akhirnya menggunakan 100 sebagai mundur setelah melelahkan opsi lain.

Jadi jika utime1234 dan Hertz 100 maka:

seconds = utime / Hertz = 1234 / 100 = 12.34

Perhitungan aktual dilakukan oleh:

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

Contoh (Output dari skrip Bash khusus):

$ ./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%

Menghitung beban "saat ini" dengan ps

Ini adalah usaha (agak?) Teduh tapi OK. Mari kita mulai.

Satu dapat menggunakan waktu yang disediakan oleh psdan menghitung penggunaan CPU dari ini. Ketika memikirkannya, itu sebenarnya bisa berguna, dengan beberapa batasan.

Ini bisa berguna untuk menghitung penggunaan CPU dalam periode yang lebih lama. Yakni Anda ingin memonitor beban CPU rata-rata plugin-containerdi Firefox saat melakukan beberapa tugas yang berhubungan dengan Firefox.

Dengan menggunakan output dari:

$ 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.

Saya menggunakan etimelebih etimesdalam sampel ini, pada perhitungan, hanya untuk menjadi sedikit lebih jelas. Saya juga menambahkan% cpu untuk "kesenangan". Dalam contoh skrip bash yang jelas akan digunakan etimes- atau lebih baik dibaca dari yang /proc/<PID>/lain.

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

Proses menggunakan CPU 38% dari waktu selama periode ini.

Lihatlah kodenya

Jika Anda ingin tahu bagaimana psmelakukannya, dan tahu sedikit C, lakukan (sepertinya Anda menjalankan Gnome Debain deriavnt) - sikap yang baik dalam kode mengenai komentar dll .:

apt-get source procps
cd procps*/ps
vim HACKING
Runium
sumber
Saya mungkin memperbarui dengan informasi lebih lanjut tentang top, dan pemantauan terus menerus - atau jepret alias " ps" dengan beban CPU saat ini.
Runium
2
Jawaban yang sangat bagus!
Theodor
Bagaimana dengan saat menghitung total penggunaan CPU di seluruh sistem. Apakah alat mencoba mendapatkan penggunaan CPU melalui snapshot, atau rata-rata dari waktu ke waktu?
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).
Rahul Patil
sumber
Hmm ya saya ingin tahu bagaimana cara mendapatkan (persentase CPU instan) darips
Theodor
2
Anda dapat mengekstrak dari contoh teratastop -p 3343 -n1 | awk '/ R /{print $10}'
Rahul Patil
1
Luar biasa. Saya menemukan bahwa awk: untuk yang pidbekerja lebih baik, seperti dalamtop -p 3343 -n1 | awk '/ 3343 /{print $10}'
Theodor
1
Terima kasih "top-p" bagus, saya tidak pernah memperhatikan opsi ini! Namun saya tidak suka mencari PID, bagaimana jika kebetulan angka yang sama muncul di bagian memori bebas atau sesuatu. Di sistem saya informasinya ada di baris ke-8 dan ke-9, maka saya lakukan:top -p $PID -n1 | awk '{if (NR ==8) print $9 }'
phil_w