'htop' tidak menunjukkan% CPU yang benar, tetapi 'top' tidak

12

Saat berjalan mencoderdengan utas = 4 (pada cpu quad-core). Saya perhatikan bahwa htoptidak menunjukkan penggunaan CPU yang sebenarnya , tetapi toptidak.

Tampaknya htop hanya melaporkan satu inti . Apakah ini bug / batasan htop ? Apa yang terjadi disini?

Tidak ada entri untuk mencoder ditampilkan di psatau htopatau top. Saya berasumsi bahwa 100% berarti bahwa 1 core sudah maksimal, tetapi bahkan ini terasa aneh bagi saya; bagaimana dengan core lainnya?

Pembaruan: menambahkan output "System Monitor"

                  PID   %CPU   COMMAND                    
           "top"  1869   220   mencoder                 
          "htop"  1869    95   mencoder -noodml /media/...  
"System Monitor"  1869   220   mencoder
Peter.O
sumber
Bendera apa yang Anda gunakan untuk htop?
sep332
sep332 ... Saya baru saja menjalankan "htop" ... jadi itu adalah kasus apa pun defaultnya.
Peter.O
Bingo! sep332 .. membuat jawaban dari itu dan saya akan tandai itu terpecahkan .. Anda membuat saya melihat default saya .... "H" adalah tombol sakelar ke "Sembunyikan utas pengguna" ... Ketika semuanya gagal " Baca info bantuan ", tetapi terkadang petunjuk praktis di directon yang tepat membantu lebih banyak .. Terima kasih.
Peter.O
@ Peter.O: Tidak sengaja turun (mouse touchpad!). Saya akan membatalkannya jika Anda mengedit posting Anda.
SabreWolfy

Jawaban:

24

Seperti yang telah Anda katakan sendiri, Anda dapat menekan Huntuk menampilkan utas pengguna.

Hanya untuk referensi di masa mendatang (dan untuk bersenang-senang), mari kita hitung pemanfaatan CPU!

Sedikit latar belakang:

Dalam sistem operasi modern, ada Penjadwal. Ini bertujuan untuk memastikan bahwa semua Proses dan utasnya mendapatkan waktu komputasi yang adil. Saya tidak akan terlalu banyak menjadwalkan (itu benar-benar rumit). Tetapi pada akhirnya ada sesuatu yang disebut run queue . Di sinilah semua instruksi dari semua proses berbaris untuk menunggu giliran mereka dieksekusi.

Proses apa pun menempatkan "tugas" di antrian proses, dan begitu prosesor siap, ia mengeluarkannya dan menjalankannya. Ketika sebuah program pergi tidur, misalnya, ia menghapus dirinya sendiri dari antrian run dan kembali ke "akhir baris" setelah siap dijalankan lagi.

Mengurutkan pada antrian ini berkaitan dengan Prioritas proses (juga disebut "nilai bagus" - yaitu proses yang baik tentang sumber daya sistem).

Panjang antrian menentukan Beban sistem. Beban 2,5 misalnya berarti bahwa ada 2,5 instruksi untuk setiap instruksi CPU dapat menangani secara real time .

Di Linux, omong-omong, beban ini dihitung dalam interval 10 ms (secara default).

Sekarang ke nilai Persentase pemanfaatan CPU:

Bayangkan Anda memiliki dua jam, satu disebut tdan itu mewakili waktu nyata . Mengukur satu detik untuk setiap detik. Jam lain yang kita panggil c. Ini hanya berjalan jika ada proses yang harus dilakukan. Itu berarti, hanya ketika suatu proses menghitung sesuatu, jam berjalan. Ini juga disebut waktu CPU. Setiap proses pada sistem 'memiliki' salah satunya.

Pemanfaatan prosesor sekarang dapat dihitung untuk satu proses:

U = c / t = 0,5s / 1s = 0,5

atau untuk semua proses:

teks alternatif

Pada mesin multi-core, ini dapat menghasilkan nilai 3,9 tentu saja, karena CPU dapat menghitung komputasi bernilai empat detik setiap detik, jika digunakan dengan sempurna.

Wikipedia memberikan contoh ini:

Aplikasi perangkat lunak yang berjalan di mesin UNIX 6-CPU menciptakan tiga proses UNIX untuk memenuhi kebutuhan pengguna. Masing-masing dari ketiga proses ini menciptakan dua utas. Pekerjaan aplikasi perangkat lunak didistribusikan secara merata pada 6 utas eksekusi independen yang dibuat untuk aplikasi tersebut. Jika tidak ada menunggu sumber daya terlibat, Total waktu CPU diharapkan menjadi enam kali waktu nyata berlalu.

Berikut potongan python kecil yang melakukan ini

>>> import time
>>> t = time.time()
>>> c = time.clock()
>>> # the next line will take a while to compute
>>> tuple(tuple(i**0.2 for i in range(600)) for i in range(6000))
>>> print (time.clock() / (time.time() - t)) * 100, "%"
66.9384021612 %

Di dunia yang sempurna, Anda dapat menyimpulkan bahwa beban sistem adalah 100 - 66,93 = 33,1%. (Tetapi pada kenyataannya itu salah karena hal-hal kompleks seperti I / O tunggu, penjadwalan ketidakefisienan dan sebagainya)

Berbeda dengan memuat , perhitungan ini akan selalu menghasilkan nilai antara 0 dan jumlah prosesor, yaitu antara 0 dan 1 atau 0 hingga 100%. Sekarang tidak ada cara untuk membedakan antara mesin yang menjalankan tiga tugas, memanfaatkan cpu 100%, dan mesin yang menjalankan sejuta tugas, hampir tidak ada pekerjaan yang dilakukan pada salah satu dari mereka, juga pada 100%. Jika Anda, misalnya, mencoba menyeimbangkan banyak proses di banyak komputer, pemanfaatan cpu hampir tidak berguna. Muat apa yang Anda inginkan di sana.

Pada kenyataannya, ada lebih dari satu jam waktu pemrosesan. Ada satu untuk menunggu di I / O misalnya. Jadi Anda juga bisa menghitung pemanfaatan sumber daya I / O.

Ini mungkin tidak membantu mengenai pertanyaan awal, tapi saya harap ini menarik. :)

Stefano Palazzo
sumber
Saya seharusnya benar-benar memasukkan nilai-nilai ketidakpastian, karena menggunakan metode sederhana ini, perhitungannya mungkin tidak akan sebesar ± 1%, tetapi saya tidak ingin membuat semua orang terlalu bosan .
Stefano Palazzo
Terima kasih untuk pelajarannya. Saya tahu sebagian besar tentang itu tetapi beberapa hal lebih spesifik daripada apa yang saya pelajari.
NightwishFan