ความแตกต่างระหว่างค่า nice และระดับความสำคัญในเอาต์พุตสูงสุด


11

ด้านบนโดยค่าเริ่มต้นรายการทั้งสองคอลัมน์ ฉันอยากรู้ว่าอะไรคือความแตกต่าง ฉันลองดู man pages และไม่สามารถหาได้:

ลำดับความสำคัญ:

   h: PR  --  Priority
      The priority of the task.

ค่าที่ดี:

   i: NI  --  Nice value
      The nice value of the task.  A negative nice value means higher  priority,
      whereas  a  positive  nice value means lower priority.  Zero in this field
      simply means priority will not be adjusted in determining  a  task’s  dis-
      patchability.

ฉันเข้าใจว่าค่าที่ดีเกี่ยวข้องกับคิวตัวกำหนดตารางเวลา CPU ของเคอร์เนล ดังนั้นลำดับความสำคัญบ่งชี้อะไร มีบางอย่างเกี่ยวกับ I / O ใช่ไหม

คำตอบ:


8

มูลค่าที่ดีคือกลไก "ทั่วโลก" ในขณะที่มีความสำคัญเกี่ยวข้องกับการสลับงานในขณะนี้


คุณหมายถึงอะไรโดย task switcher?
Belmin Fernandez

1
ตัวสลับงาน (เรียกว่า "ตัวกำหนดตารางเวลา") เป็นโค้ดเล็กน้อยภายในเคอร์เนลที่ตัดสินใจว่างานใดจะทำงานต่อไป
Ignacio Vazquez-Abrams

25

ความแตกต่างคือPRเป็นลำดับความสำคัญที่แท้จริงของกระบวนการในขณะนี้ภายในเคอร์เนลและNIเป็นเพียงคำแนะนำสำหรับเคอร์เนลสิ่งที่กระบวนการสำคัญควรมี

ในกรณีส่วนใหญ่ประชาสัมพันธ์ค่าสามารถคำนวณได้จากสูตรต่อไปนี้: PR = 20 + NI ดังนั้นกระบวนการที่มีความนุ่มนวล 3 จึงมีลำดับความสำคัญ 23 (20 + 3) และกระบวนการที่มีความสวยงาม -7 มีลำดับความสำคัญ 13 (20 - 7) nice -n 3 topคุณสามารถตรวจสอบครั้งแรกโดยใช้คำสั่ง มันจะแสดงให้เห็นว่าด้านบนกระบวนการมีNI 3และประชาสัมพันธ์ 23 แต่สำหรับการใช้งานnice -n -7 topในระบบ Linux ส่วนใหญ่คุณต้องมีสิทธิ์ใช้งานรูทเพราะที่จริงแล้วค่าPR ที่ต่ำกว่านั้นคือลำดับความสำคัญที่แท้จริงที่สูงกว่าคือ ดังนั้นกระบวนการที่มีPR 13จึงมีความสำคัญสูงกว่ากระบวนการที่มีลำดับความสำคัญมาตรฐานPR 20. นั่นเป็นสาเหตุที่คุณต้องรูท แต่ค่าความอ่อนโยนต่ำสุดที่อนุญาตสำหรับกระบวนการที่ไม่ใช่รากสามารถกำหนดค่าใน/etc/security/limits.conf

ในทางทฤษฎีเคอร์เนลสามารถเปลี่ยนค่าPR (แต่ไม่ใช่NI ) ด้วยตัวเอง ตัวอย่างเช่นอาจลดระดับความสำคัญของกระบวนการหากใช้ CPU มากเกินไปหรืออาจเพิ่มระดับความสำคัญของกระบวนการหากกระบวนการนั้นไม่มีโอกาสทำงานเป็นเวลานานเนื่องจากกระบวนการลำดับความสำคัญสูงกว่าอื่น ๆ ในกรณีเหล่านี้ค่าPRจะถูกเปลี่ยนโดยเคอร์เนลและNIจะยังคงเหมือนเดิมดังนั้นสูตร"PR = 20 + NI"จะไม่ถูกต้อง ดังนั้นค่าNIสามารถตีความได้ว่าเป็นคำแนะนำสำหรับเคอร์เนลสิ่งที่กระบวนการสำคัญควรมี แต่เคอร์เนลสามารถเลือกลำดับความสำคัญจริง ( ค่าPR ) ด้วยตัวเองขึ้นอยู่กับสถานการณ์ แต่มักจะเป็นสูตร"PR = 20 + NI"ถูกต้อง

กฎที่แน่นอนว่าเคอร์เนลเปลี่ยนลำดับความสำคัญไม่ชัดเจน setpriority (ฟังก์ชันที่เปลี่ยนค่าที่ดี) คู่มือพูดว่า:

ผลของการเปลี่ยนค่า nice อาจแตกต่างกันไปขึ้นอยู่กับอัลกอริทึมการจัดตารางกระบวนการในลักษณะพิเศษ

คู่มือ Pthreadกล่าวว่าต่อไปนี้:

ลำดับความสำคัญแบบไดนามิกขึ้นอยู่กับค่า nice (กำหนดโดย nice (2), setpriority (2) หรือ sched_setattr (2)) และเพิ่มขึ้นสำหรับควอนตัมแต่ละครั้งที่เธรดพร้อมทำงาน แต่ปฏิเสธที่จะเรียกใช้โดยตัวกำหนดตารางเวลา

ดูเหมือนว่าค่าPRสอดคล้องกับลำดับความสำคัญแบบไดนามิก

ช่วงของNIค่า-20..19 ดังนั้นค่าPRสามารถมีค่าตั้งแต่0 (20 - 20) ถึง39 (20 + 19) แต่ถูกต้องเฉพาะสำหรับกระบวนการที่มีนโยบายการตั้งเวลาเริ่มต้น ( SHED_OTHER ) อาจมีกระบวนการที่เรียกว่านโยบายการตั้งเวลา"แบบเรียลไทม์" นโยบายเหล่านี้SCHED_RRและSCHED_FIFO กระบวนการดังกล่าวมีค่าPRน้อยกว่า 0 คุณสามารถตรวจสอบสิ่งนี้ได้โดยการรันchrt -r 1 topคำสั่ง (จำเป็นต้องเป็นรูท) ด้านบนขั้นตอนจะมีการประชาสัมพันธ์ -2 คุณยังสามารถเรียกใช้chrt -r 90 topในกรณีที่ด้านบนกระบวนการจะมีการประชาสัมพันธ์ -91

ดูเหมือนว่าสำหรับกระบวนการSCHED_RRค่าPRสามารถคำนวณได้จากสูตร:

PR = - 1 - sched_rr_priority

ดังนั้นSCHED_RRกระบวนการมีอย่างน้อยPR -1ซึ่งหมายความว่าการใด ๆSCHED_RRกระบวนการมีลำดับความสำคัญสูงกว่าใด ๆSCHED_OTHER สิ่งนี้สอดคล้องกับคู่มือ pthread:

SCHED_FIFO สามารถใช้ได้เฉพาะกับลำดับความสำคัญคงที่สูงกว่า 0 ซึ่งหมายความว่าเมื่อเธรด SCHED_FIFO สามารถรันได้เธรดนั้นจะยึดเอาทันทีทุกครั้งที่มีการรันเธรด SCHED_OTHER, SCHED_BATCH หรือ SCHED_IDLE นี้ทันที

SCHED_RR เป็นการปรับปรุงอย่างง่ายของ SCHED_FIFO ทุกอย่างที่อธิบายไว้ข้างต้นสำหรับ SCHED_FIFO ยังนำไปใช้กับ SCHED_RR ด้วย

ลำดับความสำคัญของกระบวนการเรียลไทม์เรียกว่าลำดับความสำคัญแบบคงที่ที่ไม่สามารถเปลี่ยนแปลงได้โดยเคอร์เนล ดังนั้นค่าPRเชิงบวกสามารถถือว่าเป็นลำดับความสำคัญแบบไดนามิกสำหรับกระบวนการที่ไม่ใช่เรียลไทม์ ( SCHED_OTHER , SCHED_BATCH ) และค่าPRเชิงลบเป็นลำดับความสำคัญแบบคงที่สำหรับกระบวนการเรียลไทม์ ( SCHED_RR , SCHED_FIFO )

ฉันยังพยายามเรียกใช้nice -n 10 chrt -r 50 top(และchrt -r 50 nice -n 10 top) NIค่าเป็น 10 แต่พีอาร์ยังคงเป็น-51 ดังนั้นดูเหมือนว่าค่าNIจะไม่ส่งผลกระทบต่อลำดับความสำคัญของกระบวนการSCHED_RR สิ่งนี้สอดคล้องกับคู่มือsetpriority :

กระบวนการหรือเธรดใด ๆ ที่ใช้ SCHED_FIFO หรือ SCHED_RR จะไม่ได้รับผลกระทบจากการเรียกไปยัง setpriority () นี่ไม่ใช่ข้อผิดพลาด กระบวนการที่เปลี่ยนกลับเป็น SCHED_OTHER ไม่จำเป็นต้องมีลำดับความสำคัญที่ได้รับผลกระทบจากการเรียก setpriority () ดังกล่าว

หมายเหตุหนึ่งที่ตลก หากคุณเรียกใช้chrt -r 99 topคุณจะเห็นค่าRTแทนตัวเลขในคอลัมน์PR

  PID ผู้ใช้ PR NI VIRT RES SHR S% CPU% MEM TIME + คำสั่ง
28489 รูท RT 0 2852 1200 896 R 0 0.1 0: 00.01

ฉันไม่คิดว่านี่หมายความว่ากระบวนการนี้พิเศษแล้ว ฉันคิดว่านี่หมายความว่าส่วนบนไม่พิมพ์-100เพราะมันต้องใช้อักขระ 4 ตัวในการพิมพ์

นอกจากนี้คุณยังสามารถใช้htopแทนด้านบนในตัวอย่างทั้งหมดซึ่งสะดวกกว่า ps -lสามารถใช้งานได้เช่นกัน แต่เป็นจุดฐานที่แยกลำดับความสำคัญแบบเรียลไทม์และไม่ใช่เรียลไทม์ไม่ใช่ 0 แต่เป็น 60 ดังนั้นnice -n -20 ps -lจะพิมพ์

FS UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 R 0 28983 28804 0 60 -20 - 1176 - pts / 6 00:00:00 ps

ถ้าฉันใช้ลูปไม่ จำกัด 5 ลูป (int main {while (1);}) บน 2 แกนไฮเปอร์เธรดที่ถูก i3 การจัดลำดับความสำคัญของพวกเขายังคงไม่เปลี่ยนแปลง นี้ในการทดสอบเดเบียน sid
Vorac

1
@BelminFernandez ฉันคิดว่ามันยุติธรรมที่จะทำให้คำตอบนี้ "ยอมรับ"
z0lupka

1

คำตอบสั้น ๆ

PR เป็นระดับความสำคัญ ยิ่งประชาสัมพันธ์มีความสำคัญน้อยกว่ากระบวนการก็จะยิ่งสูงขึ้น

PR คำนวณดังนี้:

  • สำหรับกระบวนการปกติ: PR = 20 - NI (NI ดีและอยู่ในช่วงตั้งแต่ -20 ถึง 19)
  • สำหรับกระบวนการตามเวลาจริง: PR = - 1 - real_time_priority (real_time_priority มีช่วงตั้งแต่ 1 ถึง 99)

คำตอบยาว ๆ

กระบวนการมี 2 ประเภทกระบวนการปกติและแบบเรียลไทม์ สำหรับกระบวนการปกติ (และเฉพาะกระบวนการเหล่านั้น) จะมีการนำ Nice ไปใช้ดังนี้:

ดี

ระดับ "ความดี" จะอยู่ที่ -20 ถึง 19 ในขณะที่ -20 เป็นลำดับความสำคัญสูงสุดและ 19 เป็นลำดับความสำคัญต่ำสุด ระดับความสำคัญจะถูกคำนวณดังนี้:

PR = 20 + NI

ที่ NI เป็นระดับที่ดีและ PR คือระดับความสำคัญ อย่างที่เราเห็นจริง ๆ แล้ว -20 แมปกับ 0 ในขณะที่ 19 แผนที่ถึง 39

โดยค่าเริ่มต้นค่าโปรแกรมที่ดีคือ 0 บิตเป็นไปได้สำหรับผู้ใช้รูตไปยังโปรแกรมอาหารกลางวันที่มีค่า nice ที่ระบุโดยใช้คำสั่งต่อไปนี้:

nice -n <nice_value> ./myProgram 

ตามเวลาจริง

เราสามารถไปได้ไกลกว่านี้ ลำดับความสำคัญที่ดีจะใช้จริงสำหรับโปรแกรมผู้ใช้ ในขณะที่ลำดับความสำคัญโดยรวมของ UNIX / LINUX มีช่วงของค่า 140 ค่าที่ดีช่วยให้กระบวนการแมปไปยังส่วนสุดท้ายของช่วง (จาก 100 ถึง 139) สมการนี้จะทิ้งค่าตั้งแต่ 0 ถึง 99 ไม่สามารถเข้าถึงซึ่งจะสอดคล้องกับระดับ PR เชิงลบ (จาก -100 ถึง -1) เพื่อให้สามารถเข้าถึงค่าเหล่านั้นกระบวนการควรระบุว่า "เรียลไทม์"

นโยบายการกำหนดตารางเวลา 5 นโยบายในสภาพแวดล้อม LINUX ที่สามารถแสดงได้ด้วยคำสั่งต่อไปนี้:

chrt -m 

ซึ่งจะแสดงรายการต่อไปนี้:

1. SCHED_OTHER   the standard round-robin time-sharing policy
2. SCHED_BATCH   for "batch" style execution of processes
3. SCHED_IDLE    for running very low priority background jobs.
4. SCHED_FIFO    a first-in, first-out policy
5. SCHED_RR      a round-robin policy

กระบวนการจัดตารางเวลาสามารถแบ่งออกเป็น 2 กลุ่มคือนโยบายการตั้งเวลาปกติ (1 ถึง 3) และนโยบายการตั้งเวลาแบบเรียลไทม์ (4 และ 5) กระบวนการตามเวลาจริงจะมีลำดับความสำคัญสูงกว่ากระบวนการปกติเสมอ กระบวนการแบบเรียลไทม์สามารถเรียกใช้โดยใช้คำสั่งต่อไปนี้ (ตัวอย่างคือวิธีประกาศนโยบาย SCHED_RR):

chrt --rr <priority between 1-99> ./myProgram

ในการรับค่า PR สำหรับกระบวนการเรียลไทม์จะใช้สมการต่อไปนี้:

PR = -1 - rt_prior

โดยที่ rt_prior สอดคล้องกับลำดับความสำคัญระหว่าง 1 ถึง 99 ด้วยเหตุนี้กระบวนการที่จะมีลำดับความสำคัญสูงกว่ากระบวนการอื่นจะเป็นสิ่งที่ถูกเรียกด้วยหมายเลข 99

เป็นสิ่งสำคัญที่ต้องทราบว่าสำหรับกระบวนการแบบเรียลไทม์จะไม่มีการใช้ค่า nice

หากต้องการดู "niceness" และค่า PR ปัจจุบันของกระบวนการสามารถดำเนินการคำสั่งต่อไปนี้ได้:

top

มันเป็นการดีที่จะทราบว่ากระบวนการที่มีค่า PR -51 เช่นสอดคล้องกับค่าเรียลไทม์ นอกจากนี้ยังมีบางกระบวนการที่ค่า PR ระบุไว้ว่า "rt" ค่านี้สอดคล้องกับค่า PR ของ -100

(PS: ฉันจะโพสต์ภาพที่แสดงผลลัพธ์สูงสุด แต่ฉันไม่มีชื่อเสียงที่จะทำ)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.