ตีความว่า "โหลดเฉลี่ย" ในเอาต์พุต "ด้านบน" อย่างไร มันเหมือนกันสำหรับการแจกแจงทั้งหมดหรือไม่


12

ฉันอยากจะรู้ว่าการส่งออกของลินุกซ์ที่ใช้ Red-Hat สามารถตีความแตกต่างกันโดยลินุกซ์ที่ใช้ Debian

เพื่อทำให้คำถามมีความเฉพาะเจาะจงมากขึ้นสิ่งที่ฉันเป็นคือทำความเข้าใจว่า "ค่าเฉลี่ยการโหลด" จากบรรทัดแรกของtopคำสั่งในระบบ Red-Hat ถูกตีความและวิธีการตรวจสอบโดยรหัส ro เอกสารอย่างเป็นทางการ

[มีหลายวิธีในการเข้าถึงหัวข้อนี้ซึ่งทั้งหมดเป็นคำตอบที่ยอมรับได้สำหรับคำถาม]

แนวทางหนึ่งที่เป็นไปได้คือค้นหาว่าข้อมูลนี้ได้รับการบันทึกไว้ที่ใด
อีกอันหนึ่งก็คือการค้นหารุ่นของรหัสที่topสร้างขึ้นจากการแจกจ่ายเฉพาะและรุ่นที่ฉันกำลังทำงานอยู่

เอาต์พุตคำสั่งที่ฉันได้รับคือ:

    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


ในกรณีนี้ฉันจะตีความค่าเฉลี่ยการโหลดได้อย่างไร
ฉันมีการจัดการเพื่อค้นหาว่าโหลดเฉลี่ยประมาณนาทีสุดท้ายจากแหล่งเอกสารหนึ่งและมันควรจะตีความหลังจากถูกคูณด้วย 100 โดยแหล่งเอกสารอื่น
ดังนั้นคำถามคือ:
โหลด 0.02% หรือ 2% หรือไม่
แหล่งที่มาเอกสารและเวอร์ชัน:

1) ดาวดวงแรกที่มี

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

    NAME
           top - display Linux tasks

ที่มา: man topในการแจกจ่าย RedHat ของฉัน
Ubuntu ยังมีรุ่นที่มี "งาน" ที่ไม่ได้อธิบายค่าเฉลี่ยการโหลดใน:
http://manpages.ubuntu.com/manpages/precise/man1/top.1.html

2) อันที่สองเริ่มต้นด้วย

    TOP(1)                          User Commands                         TOP(1)

   NAME         top

   top - display Linux processes

ที่มา:
http://man7.org/linux/man-pages/man1/top.1.htm

3) อันนี้เริ่มต้นด้วย:

   TOP(1)

   NAME

   top - display and update information about the top cpu processes

แหล่งที่มา: http://www.unixtop.org/man.shtml

อันแรกสามารถเห็นได้man topในRHELหรือในonline ubuntu documentationและมันไม่มีคำอธิบายใด ๆ สำหรับรูปแบบผลลัพธ์ (หรือเกี่ยวกับค่าเฉลี่ยการโหลดที่ฉันสนใจ) .

ข้อที่สองมีคำอธิบายสั้น ๆ ชี้ให้เห็นว่าค่าเฉลี่ยของการโหลดเกี่ยวข้องกับ 1 นาทีที่ผ่านมา แต่ไม่มีอะไรเกี่ยวกับการตีความค่าของมัน!

ฉันพูดโดยตรงจากแหล่งที่สอง:

2a ค่าเฉลี่ย UPTIME และ LOAD
ส่วนนี้ประกอบด้วยบรรทัดเดียวที่มี:
ชื่อโปรแกรมหรือหน้าต่างขึ้นอยู่กับ
เวลาและระยะเวลาปัจจุบันของโหมดการแสดงผลตั้งแต่การบู๊ตครั้งสุดท้าย
จำนวนผู้ใช้ทั้งหมดที่
ระบบโหลด avg ในช่วง 1, 5 และ 15 นาที

ดังนั้นหากคำอธิบายนี้ถูกต้องแน่นอนมันก็เพียงพอที่จะเข้าใจว่าค่าเฉลี่ยการโหลดประมาณ 1 นาทีสุดท้าย
แต่มันไม่ได้อธิบายรูปแบบของตัวเลข

ในคำอธิบายที่สามมันบอกว่า:

เมื่อระบุหมายเลขสำหรับค่าเฉลี่ยของการโหลดควรจะคูณด้วย 100

คำอธิบายนี้แสดงให้เห็นว่า 0.02 หมายถึง 2% และไม่ 0.02% แต่ถูกต้องหรือไม่ นอกจากนี้มันถูกต้องสำหรับการแจกแจงทั้งหมดของ linux และการใช้งานที่แตกต่างกันของtop?
เพื่อหาคำตอบสำหรับคำถามนี้ฉันพยายามอ่านรหัสโดยค้นหาทางออนไลน์ แต่ฉันพบว่าอย่างน้อยก็มีสองเวอร์ชั่นที่แตกต่างกันซึ่งtopเกี่ยวข้องกับ RHEL! builtin-top.cและ top.crefactored ทั้งสองลิขสิทธิ์โดย Red-Hat ตามที่แจ้งไว้ในตอนต้นของรหัสและดูเหมือนว่าตรรกะที่ RHEL ใช้หนึ่งในนั้น
http://lxr.free-electrons.com/source/tools/perf/builtin-top.c
http://lxr.free-electrons.com/source/tools/perools/perf/util/top.c

ดังนั้นก่อนที่จะเจาะลึกลงไปในรหัสที่มากฉันต้องการความคิดเห็นเกี่ยวกับที่จะมุ่งเน้นไปที่รูปแบบความเข้าใจที่ถูกต้องเกี่ยวกับวิธีการตีความโหลดซีพียู?

จากข้อมูลที่ให้ไว้ในคำตอบด้านล่างนอกเหนือจากการค้นหาส่วนตัวแล้วฉันพบว่า:

1 - สิ่งtopที่ฉันกำลังใช้อยู่มีอยู่ในแพ็คเกจ procps-3.2.8 top -vซึ่งสามารถตรวจสอบได้โดยใช้
2 - ในเวอร์ชั่นprocps-3.2.8ที่ฉันดาวน์โหลดจากเว็บไซต์ทางการดูเหมือนว่าเครื่องมือuptimeจะรับข้อมูลจากprocfsไฟล์/proc/loadavgโดยตรง (ไม่ใช่การใช้ฟังก์ชัน linux getloadavg())
3 - ตอนนี้สำหรับคำสั่งก็ยังไม่ได้ใช้ฟังก์ชั่นtop getloadavg()ฉันพยายามที่จะตรวจสอบว่าสิ่งที่topทำจริงเช่นเดียวกับuptimeเครื่องมือเพื่อแสดงค่าเฉลี่ยของโหลด มันจริงเรียกuptimeฟังก์ชั่นของเครื่องมือที่ได้รับข้อมูลจากไฟล์procfs ดังนั้นทุกอย่างชี้ไปที่ไฟล์! ดังนั้นในการสร้างความเข้าใจที่ถูกต้องเกี่ยวกับการผลิตโดยหนึ่งจะต้องอ่านรหัสเคอร์เนลเพื่อดูวิธีการเขียนไฟล์ นอกจากนี้ยังมีบทความดีชี้ให้เห็นในหนึ่งในคำตอบที่ให้คนธรรมดาของคำคำอธิบายในสามของค่านิยมของ ดังนั้นแม้ว่าความจริงที่ว่าคำตอบทั้งหมดมีประโยชน์และเป็นประโยชน์เท่า ๆ กัน แต่ฉันจะทำเครื่องหมายคำที่ชี้ไปที่บทความ http://www.linuxjournal.com//article/9001ว่า "คำตอบ" สำหรับคำถามของฉัน ขอบคุณสำหรับการสนับสนุนของคุณ!/proc/loadavg

/proc/loadavgload averagetoploadavg
loadavg


นอกจากนี้จากคำถามการทำความเข้าใจค่าเฉลี่ยสูงสุดและโหลดฉันพบลิงก์ไปยังซอร์สโค้ดของเคอร์เนลที่ชี้ไปยังจุดที่loadavgถูกคำนวณ ดูเหมือนว่ามีความคิดเห็นมากมายที่อธิบายถึงวิธีการทำงานรหัสนี้เป็นส่วนหนึ่งด้วยC!
ลิงก์ไปยังรหัสคือhttp://lxr.free-electrons.com/source/kernel/sched/loadavg.c
อีกครั้งฉันไม่ได้พยายามที่จะมีส่วนร่วมในการลอกเลียนแบบใด ๆ ฉันแค่เพิ่มสิ่งนี้เพื่อความสมบูรณ์ ดังนั้นฉันซ้ำแล้วซ้ำอีกว่าการเชื่อมโยงไปยังรหัสเคอร์เนลถูกพบจากคำตอบข้อใดข้อหนึ่งในการทำความเข้าใจค่าเฉลี่ยการโหลดสูงสุด ...


รุ่นใดบอกคุณ ( top -v)
Fiximan

top: procps เวอร์ชั่น 3.2.8
Angelos Asonitis

ที่เกี่ยวข้อง: unix.stackexchange.com/questions/8895/…
BowlOfRed

คำตอบ:


19

โหลด CPU คือความยาวของคิวการทำงานนั่นคือความยาวของคิวกระบวนการที่รอให้ทำงาน

uptimeคำสั่งอาจถูกใช้เพื่อดูความยาวเฉลี่ยของคิวการทำงานในช่วงนาทีสุดท้ายในช่วงห้านาทีและ 15 topนาทีสุดท้ายเช่นเดียวกับสิ่งที่มักจะแสดงโดย

ค่าโหลดสูงหมายถึงคิวการรันมีความยาว ค่าต่ำหมายความว่ามันสั้น ดังนั้นหากค่าเฉลี่ยการโหลดหนึ่งนาทีคือ 0.05 นั่นหมายความว่าโดยเฉลี่ยในช่วงนาทีนั้นมีกระบวนการ 0.05 ที่รอให้ทำงานในคิวการทำงาน มันไม่ได้เป็นเปอร์เซ็นต์ นี่คือ AFAIK ซึ่งเหมือนกันกับ Unices ทั้งหมด (แม้ว่า Unices บางอันอาจไม่นับกระบวนการที่รอ I / O ซึ่งฉันคิดว่า Linux ทำ; OpenBSD ชั่วขณะหนึ่งเท่านั้นที่นับเธรดเคอร์เนลด้วยเพื่อให้โหลดได้เสมอ 1 หรือ มากกว่า).

ลินุกซ์ยูทิลิตี้ได้รับค่าโหลดจากเมล็ดซึ่งเขียนให้พวกเขาtop /proc/loadavgดูที่แหล่งข้อมูลprocps-3.2.8เราจะเห็นว่า:

  1. ในการแสดงค่าเฉลี่ยของโหลดsprint_uptime()ฟังก์ชันจะถูกเรียกtop.cใช้
  2. ฟังก์ชั่นนี้อาศัยอยู่ในproc/whattime.cและบริการโทรในloadavg()proc/sysinfo.c
  3. ฟังก์ชั่นนั้นเปิดขึ้นLOADAVG_FILEเพื่ออ่านค่าเฉลี่ยของโหลด
  4. LOADAVG_FILE"/proc/loadavg"ถูกกำหนดไว้ก่อนหน้านี้เป็น

ขอบคุณมากสำหรับคำตอบของคุณนี่เป็นเอกสารอย่างเป็นทางการหรือเปล่า
Angelos Asonitis

1
@AgelosAssonitis บทความ LinuxJournal จากปี 2549 อาจน่าสนใจ มันชี้ไปที่ไฟล์ต้นฉบับสองไฟล์ในแผนผังซอร์ส Linux Kernel ที่คุณอาจต้องการดู ฉันไม่ใช่ผู้ใช้ Linux ดังนั้นฉันจึงไม่สามารถบอกได้ว่าไฟล์เหล่านั้นยังคงอยู่ในการแปลงล่าสุดของเคอร์เนล: linuxjournal.com/article/9001
Kusalananda

บทความที่น่าสนใจแน่นอน! ฉันแค่มองเข้าไปในแพ็กเกจ procps เพื่อดูว่าคำสั่ง top ใช้ค่าของมันจากไฟล์ / proc / loadavg หรือไม่และนี่เป็นผลลัพธ์ของฟังก์ชัน getloadavg () หรือไม่
Angelos Asonitis

@AgelosAssonitis สถานที่ที่แน่นอนสำหรับการจัดทำเอกสารค่าเฉลี่ยการโหลดคือแผนผังแหล่งเคอร์เนลของคุณ POSIX ไม่ได้กำหนดว่าโหลดของ CPU คืออะไรและไม่พูดถึงคำว่า "โหลดเฉลี่ย" ที่ใดก็ได้ topและuptimeสาธารณูปโภคไม่ได้ POSIX สาธารณูปโภคและgetloadavg()ฟังก์ชั่นห้องสมุดนี้ยังไม่ได้กำหนดใน POSIX (มันมีเชื้อสาย BSD แม้ว่า)
Kusalananda

ดังนั้นจากสิ่งที่ฉันรวบรวมไม่มีเอกสารอย่างเป็นทางการที่จะเข้าใจการก่อตัวของค่าเหล่านี้นอกเหนือจากแหล่งเคอร์เนลตัวเองมันถูกต้องหรือไม่ ก่อนที่จะถึงที่นั่นฉันยังคงต้องผูกค่าที่แสดงในtoploadcg ของไฟล์ procfs ...
Angelos Asonitis

7

โดยทั่วไปค่าเฉลี่ยการโหลดจะคำนวณโดยเคอร์เนล แอปพลิเคชันเช่นtopและuptimeอาจใช้การgetloadavg(3)เรียกไลบรารี่เพื่อเข้าถึงสิ่งนี้ (หมายถึงพกพาได้ในเวอร์ชัน Unix ที่แตกต่างกัน) บน Linux สิ่งนี้มักส่งผลให้อ่าน/proc/loadavgได้ บน FreeBSD เป็นการเรียกของระบบ

ตัวอย่างเช่น:

#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]);
}

uptimeและtopทั้งคู่โทรคล้ายกันเพื่อรับข้อมูล

ตอนนี้ค่าเฉลี่ยการโหลด 1/5/15 นาทีคือจำนวนกระบวนการในคิวการทำงาน ระบบปฏิบัติการที่แตกต่างกันอาจคำนวณสิ่งนี้ด้วยวิธีที่ต่างกัน ความแตกต่างที่ใหญ่ที่สุดคือว่ากระบวนการที่รอ I / O (เช่นถูกบล็อกบนดิสก์) นับเป็น runnable หรือไม่ บน Linux พวกเขาคือ

ดังนั้นค่าเฉลี่ยการโหลด 3.4 หมายถึงมีกระบวนการเฉลี่ย 3.4 กระบวนการในคิวการทำงานภายในหน้าต่างตัวอย่าง (1, 5, 15 นาที)

ค่าเฉลี่ยการโหลดสูงไม่ได้แปลว่าเซิร์ฟเวอร์โอเวอร์โหลด แต่อย่างใด หากคุณมี 16 คอร์ค่าเฉลี่ยการโหลดของคุณอาจเท่ากับ 16 โดยไม่ต้องเครียด คุณอาจมีการfork()เรียกใช้แอปพลิเคชันจำนวนมากซึ่งอาจส่งผลให้เกิดกระบวนการจำนวนมากที่ถูกสร้าง / ทำลายซึ่งนำไปสู่ค่าเฉลี่ยการโหลดสูง แต่ไม่ส่งผลกระทบอย่างมากต่อประสิทธิภาพของเซิร์ฟเวอร์ ควรใช้เป็นแนวทางเท่านั้นพร้อมกับตัวชี้วัดอื่น ๆ เช่น% CPU ไม่ว่าง


4

ค่าเฉลี่ยการโหลดไม่ใช่สิ่งที่เฉพาะเจาะจงสำหรับเครื่องมือหรือการกระจายโดยเฉพาะมันเป็นการวัดที่จัดทำโดยเคอร์เนลหรือแม่นยำกว่าตัวกำหนดตารางเวลาดังนั้นจึงเป็นการวัดแบบอิสระการกระจาย การวัดจะถูกบันทึกไว้ในระบบไฟล์ proc/proc

บนการตีความของมันตัวชี้วัดค่าเฉลี่ยการโหลดไม่ได้บ่งบอกว่า CPU ทำงานหนักแค่ไหน แต่ต้องทำงานมากแค่ไหน ฉันไม่คิดว่ามีความจำเป็นที่จะต้องคูณมันด้วยอะไรเพราะมันเป็นการวัดโดยตรงของจำนวนกระบวนการในสถานะที่รันได้หรือไม่หยุดชะงัก

ลองตรวจสอบคู่มือสองหน้าต่อไปนี้: getloadavg(3)และuptimeสำหรับข้อมูลเพิ่มเติม

ตัวชี้วัดค่าเฉลี่ยการโหลดอาจเป็นแนวคิดที่เข้าใจยากในตอนแรกฉันคิดว่าหลายคนคิดว่ามันเป็นตัวบ่งชี้ว่า CPU ทำงานหนักแค่ไหน แต่นั่นไม่จริง


1
ตกลง แต่เรามั่นใจอย่างแน่นอนว่าค่าเฉลี่ยของโหลดที่อธิบายในgetloadavg()คำอธิบายฟังก์ชั่นเป็นค่าเฉลี่ยของโหลดเดียวกันกับที่topคำสั่งใน rhel แสดงหรือไม่ ฉันถามสิ่งนี้เพราะฉันทำการค้นหาข้อความแบบเต็มในเนื้อหาที่ไม่ได้ tarred ของแพ็กเกจ procps-3.2.8 (ซึ่งระบุโดยคำสั่งtop -v) และไม่มีการเอ่ยถึงฟังก์ชั่น getloadavg () เพียงอย่างเดียว! คำนวณดังนั้นด้านบนอาจจะโหลดเฉลี่ยในลักษณะที่แตกต่างกัน ....
Angelos Asonitis
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.