กระบวนการ 'ความดี' และ 'ลำดับความสำคัญ'


104

เมื่อทำงานtopฉันจะเห็นผลลัพธ์ตัวอย่าง (สั้นลง) นี้:

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
 4586 ipc-adm+  20   0 1303900 605152  92844 S  30,6 29,3   3:52.88 firefox
 3985 ipc-adm+  20   0  258588 124508  63072 S  12,2  6,0   0:40.04 compiz
 3092 root      20   0  172392  56164  25980 S   6,1  2,7   0:30.13 Xorg

มีสองค่าที่ฉันสนใจ: PR(ระดับความสำคัญ) และNI(ความดี)

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

คุณช่วยอธิบายวิธีจัดการค่าเหล่านั้นของกระบวนการและภายใต้สถานการณ์เช่นนี้ที่อาจมีประโยชน์ได้หรือไม่?

คำตอบ:


103

ค่าที่ดีคือพื้นที่ผู้ใช้และลำดับความสำคัญ PR คือลำดับความสำคัญที่แท้จริงของกระบวนการที่ใช้โดยเคอร์เนล Linux ในลำดับความสำคัญของระบบลินุกซ์คือ 0 ถึง 139 ซึ่ง 0 ถึง 99 ตามเวลาจริงและ 100 ถึง 139 สำหรับผู้ใช้ ช่วงค่าที่ดีคือ -20 ถึง +19 โดยที่ -20 สูงที่สุด, 0 เป็นค่าเริ่มต้นและ +19 ต่ำสุด ความสัมพันธ์ระหว่างคุณค่าที่ดีและลำดับความสำคัญคือ:

PR = 20 + NI

ดังนั้นค่าPR = 20 + (-20 to +19)0 ถึง 39 ที่แมป 100 ถึง 139

ตามคู่มือยอดนิยม:

PR - ลำดับความสำคัญลำดับความสำคัญการจัดตารางเวลาของงาน หากคุณเห็น 'rt' ในฟิลด์นี้แสดงว่างานกำลังทำงานภายใต้ลำดับความสำคัญตามเวลาจริง

NI เป็นงานที่มีคุณค่า

NI - ค่าที่ดีมูลค่าที่ดีของงาน ค่า nice เชิงลบหมายถึงลำดับความสำคัญสูงกว่าในขณะที่ค่า nice ที่ดีหมายถึงระดับความสำคัญต่ำกว่าศูนย์ในฟิลด์นี้ก็หมายความว่าระดับความสำคัญจะไม่ถูกปรับในการกำหนดความสามารถในการจัดส่งของงาน

แก้ไข: ตามค่าเริ่มต้นเมื่อเปิดตัวโปรแกรมใน Linux โปรแกรมจะเริ่มทำงานโดยมีระดับความสำคัญเป็น '0' อย่างไรก็ตามคุณสามารถเปลี่ยนลำดับความสำคัญของโปรแกรมของคุณด้วยวิธีใดวิธีหนึ่งต่อไปนี้

  1. คุณสามารถเปิดโปรแกรมที่มีลำดับความสำคัญตามที่คุณต้องการโดยใช้

    nice -n nice_value program_name
    
  2. คุณยังสามารถเปลี่ยนลำดับความสำคัญของกระบวนการที่กำลังทำงานอยู่โดยใช้

    renice -n nice_value -p process_id
    

1
คุณกำลังพูดว่าพวกเขาเกือบจะเหมือนกันในสิ่งที่ตรงกันข้าม (ทั้งสองลำดับความสำคัญแทน) แต่nicenessสามารถใช้เพื่อให้ความสำคัญเชิงลบเพื่อให้งานที่nicenessได้รับจากทางของงานลำดับความสำคัญสูง? (เช่นมันเป็นniceและให้ทรัพยากรการเข้าถึงอื่น ๆ หรือไม่หรือเพียงแค่ทำให้ฉันสับสนได้อย่างไร
Mark Kirby

1
ตัวอย่างของสิ่งที่ฉันหมายถึงสองงานทั้งสองมีpr20 เท่ากันงานหนึ่งมีni0 และงานสองมีni20 ดังนั้นนี่หมายความว่างานสองจะให้ทรัพยากรสำหรับงานหนึ่งเพราะมันคือnicer
Mark Kirby

1
เท่าที่ฉันรู้ลำดับความสำคัญคำนวณเป็น PR = 20 + NI ดังนั้นภารกิจหนึ่งที่มีความสำคัญ = 20 +0 ค่าสูงสุดของความประสงค์ที่ดีคือ +19
pl_rock

3
PR = 20 + NI ค่าสูงสุดสามารถเป็น 39 ที่จริงแล้วในระบบ linux นั้นมี 139 ลำดับความสำคัญซึ่ง 0 ถึง 99 เป็นลำดับความสำคัญตามเวลาจริงและสำหรับผู้ใช้ที่มี 100 ถึง 139 ดังนั้นแผนที่ NI ค่า -20 ถึง +19 ถึงลำดับความสำคัญ 100 ถึง 139 ที่คุณสามารถปรับ แต่เคอร์เนลยังไม่แน่ใจว่าถ้าคุณเปลี่ยนค่า NI แล้วมันจะเปลี่ยนลำดับความสำคัญค่า NI เป็นคำแนะนำเพียงเพื่อเคอร์เนล เคอร์เนลบางครั้งไม่สนใจมัน
pl_rock

1
ดังนั้น PR และ NI จึงเทียบเท่ากันจริง ๆ เพราะพวกเขามีค่าชดเชยต่างกันหรือไม่ ทำไมเราถึงมีค่าทั้งสอง? และคุณสามารถเพิ่มการตั้งค่าความเหมาะสมของกระบวนการ <0 ต้องใช้สิทธิ์รูท
ผู้บัญชาการไบต์

26

ลำดับความสำคัญคืออะไรและทำไมฉันถึงต้องแคร์?

เมื่อพูดถึงลำดับความสำคัญของกระบวนการคือการจัดการเวลาของตัวประมวลผล หน่วยประมวลผลหรือซีพียูเปรียบเสมือนมนุษย์ที่เล่นกลหลาย ๆ งานในเวลาเดียวกัน บางครั้งเราสามารถมีพื้นที่มากพอที่จะทำหลายโครงการ บางครั้งเราสามารถมุ่งเน้นที่สิ่งเดียวในเวลา บางครั้งสิ่งสำคัญปรากฏขึ้นและเราต้องการอุทิศพลังงานทั้งหมดของเราในการแก้ปัญหานั้นในขณะที่ทำงานที่สำคัญน้อยลงในเครื่องเขียนหลัง

ในลีนุกซ์เราสามารถกำหนดแนวทางให้ซีพียูปฏิบัติตามเมื่อมันดูงานทั้งหมดที่ต้องทำ แนวทางเหล่านี้เรียกว่าความดีหรือความคุ้มค่า ระดับความละเอียดของ Linux เริ่มจาก -20 ถึง 19 ตัวเลขยิ่งมีความสำคัญน้อยกว่าที่จะได้รับงาน หากค่าความละเอียดเป็นจำนวนสูงเช่น 19 งานจะถูกกำหนดเป็นลำดับความสำคัญต่ำสุดและ CPU จะประมวลผลงานนั้นเมื่อใดก็ตามที่มีโอกาส ค่า nice เริ่มต้นคือศูนย์

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

แหล่ง

กำหนดลำดับความสำคัญสำหรับกระบวนการใหม่ด้วยniceเช่น

nice -n 10 firefox

สำหรับกระบวนการที่มีอยู่

renice 10 -p $(pgrep firefox)

ในการตั้งค่าลำดับความสำคัญที่<0คุณต้องการsudoเช่น:

renice -1 -p $(pgrep firefox)
renice: failed to set priority for 2769 (process ID): Permission denied

แต่ไม่ใช่สำหรับลำดับความสำคัญ >=0


ตัวอย่าง

% ps -o pid,comm,pri,nice -p $(pgrep firefox)
  PID COMMAND         PRI  NI
 2769 firefox          19   0

% renice 10 -p 2769     # note, we don't need sudo here
2769 (process ID) old priority 0, new priority 10

% ps -o pid,comm,pri,nice -p $(pgrep firefox)
  PID COMMAND         PRI  NI
 2769 firefox           9  10

% sudo renice -19 -p 2769                    
 2769 (process ID) old priority 10, new priority -19

% ps -o pid,comm,pri,nice -p $(pgrep firefox)
  PID COMMAND         PRI  NI
 2769 firefox          38 -19

ตัวอย่างอื่น ๆ

เมื่อต้องการยกเลิกกระบวนการที่กำลังทำงานทั้งหมดสำหรับผู้ใช้ที่ระบุ

renice 20 -u user_name

ในตัวอย่างของคุณการrenice 10ทำงานโดยไม่ต้องsudoใช่มั้ย และคุณสามารถเพิ่มตัวอย่างเพื่อทำให้กระบวนการทั้งหมดของผู้ใช้เฉพาะคนดีขึ้นได้หรือไม่? ซึ่งจะมีประโยชน์มากหากมีคนอื่นเข้าสู่ระบบในเวลาเดียวกันและมีกระบวนการที่ไม่จำเป็น แต่การกินทรัพยากรทำงาน (เช่นเกมแฟลชที่หยุดชั่วคราวใน Firefox น้องชายตัวเล็กทำสิ่งเหล่านี้ ... : - /)
Byte ผู้บัญชาการ

@ByteCommander Done =)
AB

ฉันจะคืนค่าความสวยงามเดิมของผู้ใช้หลังจากผ่านไประยะหนึ่งได้อย่างไร ตั้งค่ากลับเป็น 0 หรือไม่ แต่นั่นไม่ได้คำนึงถึงว่ากระบวนการบางอย่างอาจมีคุณค่าที่แตกต่างกันมาก่อน มีความเป็นไปได้ง่าย ๆ ในการทำเช่นนี้?
ผู้บัญชาการไบต์

@ ByteCommander ไม่มันไม่ง่ายเลย ไม่ว่าคุณจะใช้0หรือ ... มีปัญหา;)
AB

2
หลังจาก renice -19 ผลด้วยpsคือPRI: 38, NI: -19อย่างไรกับtopมันจะPR:1, NI -19เป็นเหตุผลที่?
wakeup

14

คำตอบสั้น ๆ

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

ตามค่าดีฟอลต์แล้วค่า nice ของโปรแกรมคือ 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 และ NI จะปรากฏขึ้น มันเป็นการดีที่จะทราบกระบวนการที่มีค่า PR -51 ที่สอดคล้องกับค่าเรียลไทม์ นอกจากนี้ยังมีบางกระบวนการที่ค่า PR ระบุไว้ว่า "rt" ค่านี้สอดคล้องกับค่า PR ของ -100

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