Bagaimana "rata-rata beban" ditafsirkan dalam output "atas"? Apakah sama untuk semua distribusi?

12

Saya ingin tahu apakah output dari linux berbasis Red-Hat dapat diinterpretasikan berbeda oleh linux berbasis Debian.

Untuk membuat pertanyaan lebih spesifik, apa yang saya cari, adalah memahami bagaimana "rata-rata muat" dari baris pertama topperintah pada sistem Red-Hat ditafsirkan dan bagaimana memverifikasi ini dengan kode ro dokumentasi dokumentasi resmi.

[Ada banyak cara untuk mendekati subjek ini, yang semuanya merupakan jawaban yang dapat diterima untuk pertanyaan]

Salah satu pendekatan potensial, adalah menemukan di mana informasi ini didokumentasikan secara resmi.
Yang lain, akan menemukan versi kode yang topdibangun dari dalam distribusi spesifik dan versi yang saya kerjakan.

Output perintah yang saya dapatkan adalah:

    top - 13:08:34 up  1:19,  2 users,  load average: 0.02, 0.00, 0.00
    Tasks: 183 total,   1 running, 182 sleeping,   0 stopped,   0 zombie
    Cpu(s):  0.2%us,  0.2%sy,  0.0%ni, 96.8%id,  2.7%wa,  0.0%hi,  0.0%si,  0.0%st
    Mem:   3922520k total,   788956k used,  3133564k free,   120720k buffers
    Swap:  2097148k total,        0k used,  2097148k free,   344216k cached


Dalam hal ini, bagaimana saya bisa mengartikan nilai rata-rata beban ?
Saya telah berhasil menemukan bahwa beban rata-rata adalah sekitar menit terakhir, dari satu sumber dokumentasi dan harus ditafsirkan setelah dikalikan dengan 100, oleh sumber dokumentasi lain.
Jadi, pertanyaannya adalah:
Apakah 0,02% atau 2% dimuat?
Sumber dan versi dokumentasi:

1) Bintang pertama dengan

    TOP(1)                        Linux User’s Manual                       TOP(1)

    NAME
           top - display Linux tasks

Sumber: man topdalam distribusi RedHat saya
Ubuntu juga memiliki versi dengan "tugas" yang tidak menjelaskan rata-rata beban di:
http://manpages.ubuntu.com/manpages/precise/man1/top.1.html

2) Yang kedua dimulai dengan

    TOP(1)                          User Commands                         TOP(1)

   NAME         top

   top - display Linux processes

Sumber:
http://man7.org/linux/man-pages/man1/top.1.htm

3) Yang ini dimulai dengan:

   TOP(1)

   NAME

   top - display and update information about the top cpu processes

Sumber: http://www.unixtop.org/man.shtml

Yang pertama , dapat dilihat man topdi dalam RHELatau di online ubuntu documentationdan tidak memiliki penjelasan untuk format output (atau tentang rata-rata beban di mana saya tertarik) .

Yang kedua , berisi penjelasan singkat, menunjukkan bahwa rata-rata beban ada hubungannya dengan 1 menit terakhir, tetapi tidak ada tentang interpretasi nilainya!

Saya mengutip langsung dari sumber kedua:

2a. Rata-rata UPTIME dan LOAD
Bagian ini terdiri dari satu baris yang berisi:
nama program atau jendela, tergantung pada mode tampilan
waktu saat ini dan lamanya waktu sejak
jumlah total boot terakhir dari pengguna
yang memuat sistem rata-rata selama 1, 5 dan 15 menit terakhir

Jadi, jika penjelasan ini memang benar, itu hanya cukup untuk memahami bahwa rata-rata beban sekitar 1 menit terakhir.
Tapi itu tidak menjelaskan format angka.

Dalam penjelasan ketiga , dikatakan bahwa:

Saat menentukan angka untuk rata-rata muat, angka itu harus dikalikan dengan 100.

Penjelasan ini menunjukkan bahwa 0,02 berarti 2% dan bukan 0,02%. Tetapi apakah ini benar? Selain itu, apakah benar untuk semua distribusi linux dan implementasi yang berpotensi berbeda top?
Untuk menemukan jawaban atas pertanyaan ini, saya mencoba membaca kode dengan mencarinya secara online. Tapi saya menemukan, setidaknya, dua versi berbeda topterkait dengan RHEL di luar sana! yang builtin-top.cdan refactored top.c. Keduanya dilindungi hak cipta oleh Red-Hat sebagaimana pemberitahuan mengatakan di awal kode dan dengan demikian tampaknya logis bahwa RHEL menggunakan salah satunya.
http://lxr.free-electrons.com/source/tools/perf/builtin-top.c
http://lxr.free-electrons.com/source/tools/perf/util/top.c

Jadi, sebelum mempelajari kode sebanyak itu, saya ingin pendapat tentang di mana fokus untuk membentuk pemahaman yang akurat tentang bagaimana cpu load diinterpretasikan?

Dari informasi yang diberikan dalam jawaban di bawah ini, di samping beberapa pencarian pribadi, saya telah menemukan bahwa:

1 - Yang topsaya gunakan terkandung dalam paket procps-3.2.8. Yang dapat diverifikasi dengan menggunakan top -v.
2 - Dalam versi procps-3.2.8yang saya unduh dari situs web resmi, tampaknya alat tersebut uptimemendapatkan informasi dari procfsfile /proc/loadavgsecara langsung (tidak menggunakan fungsi linux getloadavg()).
3 - Sekarang untuk topperintah itu juga tidak menggunakan fungsi getloadavg(). Saya berhasil memverifikasi bahwa topmemang melakukan hal yang sama denganuptimealat untuk menampilkan rata-rata beban. Ini sebenarnya memanggil fungsi uptimealat, yang mendapat informasinya dari procfsfile /proc/loadavg.

Jadi, semuanya menunjuk ke /proc/loadavgfile! Jadi, untuk membentuk pemahaman yang akurat tentang yang load averagedihasilkan oleh top, seseorang harus membaca kode kernel untuk melihat bagaimana file loadavgtersebut ditulis.
Ada juga artikel bagus yang ditunjukkan dalam salah satu jawaban yang memberikan penjelasan istilah tiga orang awam tentang tiga nilai loadavg.
Jadi, terlepas dari kenyataan bahwa semua jawaban sama bermanfaat dan membantu, saya akan menandai jawaban yang menunjuk ke artikel http://www.linuxjournal.com//article/9001 sebagai "the" jawaban untuk pertanyaan saya. Terima kasih atas kontribusi Anda!

Selain itu dari pertanyaan Memahami rata-rata atas dan memuat , saya telah menemukan tautan ke kode sumber kernel yang menunjuk ke tempat di mana loadavgdihitung. Sepertinya ada komentar besar yang menjelaskan cara kerjanya, bagian kode ini juga ada C!
Tautan ke kode adalah http://lxr.free-electrons.com/source/kernel/sched/loadavg.c
Sekali lagi saya tidak mencoba terlibat dalam segala bentuk plagiarisme, saya hanya menambahkan ini untuk kelengkapan. Jadi, saya mengulangi bahwa tautan ke kode kernel ditemukan dari salah satu jawaban dalam Memahami rata-rata teratas dan memuat ...

Angelos Asonitis
sumber
Apa yang dikatakan versi-versi itu kepada Anda? ( top -v)
Fiximan
atas: proksi versi 3.2.8
Angelos Asonitis

Jawaban:

19

Beban CPU adalah panjang antrian proses, yaitu panjang antrian proses yang menunggu untuk dijalankan.

The uptimeperintah dapat digunakan untuk melihat rata-rata panjang antrian run selama menit terakhir, lima menit terakhir, dan yang terakhir 15 menit, seperti apa yang biasanya ditampilkan oleh top.

Nilai beban tinggi berarti antrian run panjang. Nilai yang rendah berarti pendek. Jadi, jika rata-rata muatan satu menit adalah 0,05, itu berarti bahwa rata-rata selama menit itu, ada 0,05 proses yang menunggu untuk dijalankan dalam antrian proses. Ini bukan persentase. Ini, AFAIK, sama pada semua Unices (walaupun beberapa Unices mungkin tidak menghitung proses yang menunggu I / O, yang menurut saya dilakukan oleh Linux; OpenBSD, untuk sementara saja, juga menghitung utas kernel, sehingga beban selalu 1 atau lebih).

topUtilitas Linux mendapatkan nilai-nilai load dari kernel, yang menuliskannya /proc/loadavg. Melihat sumber untuk procps-3.2.8, kita melihat bahwa:

  1. Untuk menampilkan rata-rata beban, sprint_uptime()fungsi ini disebut dalam top.c.
  2. Fungsi ini tinggal di proc/whattime.cdan panggilan loadavg()di proc/sysinfo.c.
  3. Fungsi itu hanya terbuka LOADAVG_FILEuntuk membaca rata-rata beban.
  4. LOADAVG_FILEdidefinisikan sebelumnya sebagai "/proc/loadavg".
Kusalananda
sumber
Terima kasih banyak atas jawaban Anda, apakah ini didokumentasikan secara resmi di suatu tempat?
Angelos Asonitis
1
@AgelosAssonitis Artikel LinuxJournal dari 2006 ini mungkin menarik. Itu menunjuk ke beberapa file sumber di pohon source Kernel Linux yang mungkin ingin Anda lihat. Saya bukan pengguna Linux, jadi saya tidak tahu apakah file-file itu masih ada dalam inkarnasi kernel terbaru: linuxjournal.com/article/9001
Kusalananda
Artikel yang sangat menarik! Saya hanya melihat ke dalam paket procps untuk melihat apakah memang perintah teratas mengambil nilainya dari file / proc / loadavg dan apakah ini sama dengan hasil dari fungsi getloadavg ().
Angelos Asonitis
@AgelosAssonitis Tempat yang pasti untuk dokumentasi rata-rata beban adalah pohon sumber kernel Anda. POSIX tidak mendefinisikan apa beban CPU, dan tidak menyebutkan kata-kata "load average" di mana saja. The topdan uptimeutilitas tidak POSIX utilitas dan getloadavg()fungsi perpustakaan juga tidak didefinisikan dalam POSIX (memiliki keturunan BSD meskipun).
Kusalananda
Jadi, dari apa yang saya kumpulkan tidak ada dokumentasi resmi untuk memahami pembentukan nilai-nilai ini selain dari sumber kernel itu sendiri, apakah benar? Sebelum sampai di sana, saya masih harus mengikat nilai yang disajikan dalam topfile procfs loadavg ...
Angelos Asonitis
7

Rata-rata beban biasanya dihitung oleh kernel. Aplikasi seperti topdan uptimedapat menggunakan getloadavg(3)panggilan perpustakaan untuk mengakses ini (itu dimaksudkan untuk portable di berbagai versi Unix). Di Linux ini biasanya menghasilkan membaca dari /proc/loadavg. Di FreeBSD itu adalah panggilan sistem.

Sebagai contoh:

#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>

int main()
{
  double ld[3];

  int i=getloadavg(ld,3);
  printf("Load %.2f %.2f %.2f\n",ld[0],ld[1],ld[2]);
}

uptimedan topkeduanya melakukan panggilan serupa untuk mendapatkan data mereka.

Sekarang rata-rata memuat 1/5/15 menit adalah jumlah proses pada antrian proses. Sistem operasi yang berbeda dapat menghitung ini dengan cara yang berbeda; perbedaan terbesar biasanya adalah apakah proses menunggu I / O (misalnya diblokir pada disk) dihitung sebagai runnable atau tidak. Di Linux mereka.

Jadi rata-rata beban 3,4 berarti ada rata-rata 3,4 proses pada antrian run dalam jendela sampel (1, 5, 15 menit).

Namun, rata-rata beban tinggi tidak berarti server kelebihan beban. Jika Anda memiliki 16 core maka rata-rata beban Anda dapat 16 tanpa stres. Anda juga dapat memiliki banyak fork()panggilan aplikasi yang dapat menghasilkan sejumlah besar proses yang dibuat / dihancurkan, yang mengarah ke rata-rata beban tinggi, tetapi tanpa secara besar-besaran memengaruhi kinerja server. Seharusnya hanya digunakan sebagai panduan, bersama dengan metrik lain seperti% CPU busy.

Stephen Harris
sumber
4

Rata-rata beban bukanlah sesuatu yang spesifik untuk alat atau distribusi tertentu, ini adalah pengukuran yang disediakan oleh Kernel, atau lebih tepatnya, penjadwal, oleh karena itu ini adalah pengukuran independen distribusi. Pengukuran direkam di dalam sistem file proc/proc

Ke interpretasi itu, metrik rata-rata memuat bukan indikasi seberapa keras CPU bekerja tetapi berapa banyak pekerjaan yang harus dilakukan. Saya tidak berpikir benar-benar ada kebutuhan untuk melipatgandakannya dengan apa pun karena ini merupakan pengukuran langsung dari jumlah proses baik dalam kondisi runnable atau uninterruptible.

Coba periksa dua halaman manual berikut: getloadavg(3)dan uptimeuntuk informasi lebih lanjut.

Metrik beban rata-rata bisa menjadi konsep yang sulit untuk dipahami pada awalnya, saya pikir banyak orang berpikir ini merupakan indikasi betapa sulitnya CPU bekerja, tetapi bukan itu yang sebenarnya.

pmyjavec
sumber
1
Ok, tetapi apakah kita benar-benar yakin bahwa rata-rata beban dijelaskan dalam getloadavg()deskripsi fungsi, apakah rata-rata beban yang sama dengan yang topdiperlihatkan oleh perintah di rhel? Saya menanyakan hal ini karena saya melakukan pencarian teks lengkap dalam isi un-tarred dari paket procps-3.2.8 (yang ditunjukkan oleh perintah top -v) dan tidak ada satupun yang menyebutkan fungsi getloadavg ()! Jadi, mungkin top menghitung rata-rata beban dengan cara yang berbeda ....
Angelos Asonitis