ทำไมฉันไม่สามารถใช้ renice เพื่อเพิ่มมูลค่าที่ดีของกระบวนการได้?


25

จากman renice:

ผู้ใช้รายอื่นนอกเหนือจากผู้ใช้ขั้นสูงอาจเปลี่ยนลำดับความสำคัญของกระบวนการที่พวกเขาเป็นเจ้าของและสามารถเพิ่มค่าที่ดี 'ของพวกเขา (เพื่อเหตุผลด้านความปลอดภัย)ภายในช่วง 0 ถึง PRIO_MAX (20) [... ]

ดังนั้นฉันสามารถทำreniceกระบวนการของตัวเองให้สูงขึ้น (ให้ลำดับความสำคัญต่ำกว่า) แต่ไม่เคยลง:

$ renice 10 22316
22316 (process ID) old priority 0, new priority 10
$ renice 9 22316
renice: failed to set priority for 22316 (process ID): Permission denied

ทำไมนี้ ฉันสามารถเข้าใจได้ว่าทำไมผู้ใช้ปกติไม่สามารถตั้งค่าที่ดีได้ต่ำกว่า 0 แต่เพราะเหตุใดฉันสามารถลดลำดับความสำคัญเป็น 10 ฉันไม่สามารถเพิ่มความสำคัญเป็น 9 อีกครั้งได้ "เหตุผลด้านความปลอดภัย" มีไว้เพื่ออะไร ฉันมีสิทธิ์ที่จะเปิดตัวโปรเซสที่คุ้มค่าเป็น 9 ดังนั้นทำไมฉันไม่สามารถเปลี่ยนเป็น 9 ได้


แก้ไข: ฉันควรเรียนรู้ที่จะเลื่อนลง ปรากฎนี้ถูกระบุว่าเป็นข้อผิดพลาดในman renice:

BUGS
     Non super-users can not increase scheduling priorities of their own
     processes, even if they were the ones that decreased the priorities 
     in the first place.

นั่นยิ่งทำให้สับสนมากขึ้น หากพวกเขาคิดว่าพฤติกรรมนี้เป็นข้อผิดพลาดทำไมไม่เปลี่ยนมัน? reniceคำสั่งที่ปรากฏใน 4.0BSD ซึ่งผมคิดว่าจากปี 1980 นี้ควรจะเป็นมากง่ายต่อการแก้ไขเพื่อให้บนมือข้างหนึ่งพวกเขาดูเหมือนจะได้เลือกที่จะปล่อยให้มันและที่อื่น ๆ พวกเขารายการว่ามันเป็นข้อผิดพลาด


เนื่องจากความสำคัญบางอย่างที่สูงกว่า 0 อาจถูกบังคับใช้โดยกระบวนการของระบบหรือโมดูลความปลอดภัยและไม่ควรถูกลดลงโดยผู้ใช้ (และไม่มีการควบคุมที่ดีพอที่จะกำหนดความดีที่น้อยที่สุดของกระบวนการผู้ใช้ที่กำหนดนอกเหนือจากค่าคงที่ 0) ? ไม่ใช่คำตอบที่ฉันไม่แน่ใจ แต่เป็นการเดา
lgeorget

คำตอบ:


19

ตั้งแต่ linux 2.6.12 นั่นขึ้นอยู่กับค่าของขีด จำกัด RLIMIT_NICE ( ulimit -e) ซึ่งสามารถรับค่าได้ตั้งแต่ 0 ถึง 40 ข้อ จำกัด นั้นเป็นข้อ จำกัด ในลำดับความสำคัญของกระบวนการมากขึ้น (ยิ่งจำนวนนั้นยิ่งมีความสำคัญสูงกว่าที่ผู้ใช้สามารถตั้งค่าสำหรับกระบวนการ)

คุณจะสังเกตเห็นค่าเริ่มต้นคือ 20 ใน ubuntu 10.04 และ 0 ใน Debian jessie เป็นต้น

ค่าnสำหรับขีด จำกัด นั้นหมายความว่ากระบวนการที่ไม่มีความสามารถ CAP_NICE สามารถเพิ่มระดับความสำคัญของกระบวนการให้สูงขึ้นได้nซึ่งหมายถึงการลดความสวยงามลงไปเป็นความ20 - nเหมาะสม ดังนั้นสำหรับค่า 0 หมายความว่าไม่มีผู้ใช้ที่ไม่มีสิทธิพิเศษสามารถลดความอ่อนโยนที่ต่ำกว่า 20 ได้ดังนั้นผู้ใช้ที่ไม่มีสิทธิพิเศษจะสามารถลดความสวยงามได้

ด้วยค่า 20 ผู้ใช้ที่ไม่มีสิทธิพิเศษสามารถลดความสวยงามกลับเป็น 0

ขึ้นอยู่กับผู้ดูแลระบบที่จะเลือกว่าจะอนุญาตให้ผู้ใช้ลดระดับความสำคัญของกระบวนการหรือไม่

ว่าทำไมผู้ดูแลระบบอาจจะไม่ต้องการให้ผู้ใช้ในการลดความสำคัญของกระบวนการของตนเองให้ดูคำตอบของ Flup


1
Ah! ดังนั้นมันจึงสามารถกำหนดค่าได้! ตกลงที่เหมาะสมมากขึ้นขอบคุณ
terdon

"ค่าจาก 0 ถึง 40 [... ] คุณจะสังเกตเห็นว่าค่าเริ่มต้นคือ 20 ใน ubuntu 10.04 และ 0 ใน Debian jessie เป็นต้น" -> ที่น่าสนใจ ulimits ยาก / นุ่มสำหรับฉันแน่นอน 0 เมื่อเจสซีเดเบียน ฉันสามารถเพิ่มได้ถึง 20 แต่นอกเหนือจากนั้นฉันจะได้รับ "bash: ulimit: ลำดับความสำคัญของการกำหนดเวลา: ไม่สามารถแก้ไขขีด จำกัด : อาร์กิวเมนต์ไม่ถูกต้อง" ค่าลบไม่ได้รับการยอมรับเช่นกัน
thomanski

20

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

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


1
ฉันเข้าใจได้ แต่มันก็ดูแปลก ๆ man reniceในความเป็นจริงผมก็รู้ว่ามันระบุไว้แม้ในขณะที่ข้อผิดพลาดใน
terdon

3
ฉันคิดว่าประเด็นของข้อผิดพลาดคือ 'ผู้ใช้ที่ไม่ใช่ผู้ใช้ขั้นสูงไม่สามารถเพิ่มลำดับความสำคัญของการกำหนดเวลาของกระบวนการของตัวเองแม้ว่าพวกเขาจะเป็นคนที่ลดลำดับความสำคัญในตอนแรก ' นั่นคือผลข้างเคียงของการบังคับใช้นี้ซึ่งreniceไม่สามารถย้อนกลับได้โดยไม่ได้ตั้งใจยกเว้นผู้ใช้ที่ได้รับสิทธิพิเศษ
Flup

7
เพราะระบบจำไม่ได้ว่าใครเป็นคนกำหนดลำดับความสำคัญ เป็นการดีถ้าคุณยกระดับที่ดีและต้องการลดระดับนั้นจะอนุญาต ... แต่ระบบกำหนดข้อห้ามแบบครอบคลุมอย่างแม่นยำเพราะมันไม่ได้เก็บบันทึกว่าใครเป็นคนทำอะไรที่ไม่ดีดังนั้นคุณไม่สามารถยกเลิกreniceที่rootทำ
Flup

1
@IwillnotexistIdonotexist นึกถึงระบบที่มีผู้ใช้จำนวนมาก ดูแลระบบอาจต้องการเพิ่มลำดับความสำคัญของกระบวนการของคุณเป็น 5 และลดระดับของฉันลงไปที่ 10 ที่ยังอยู่ในช่วงของผู้ใช้ปกติ แต่ฉันจะไม่สามารถเปลี่ยนได้และขโมยเวลา CPU ที่คุณสมควรได้รับ นั่นเป็นความคิดต่อไปตามที่ Flup อธิบาย อย่างไรก็ตามตามที่ StephaneChazelas อธิบายสิ่งนี้สามารถกำหนดค่าได้ดังนั้นจึงขึ้นอยู่กับดูแลระบบเพื่อเลือกสิ่งที่พวกเขาต้องการ
terdon

1
คำตอบของ“ ทำไม?” มักจะเป็น“ เพราะไม่มีใครต้องการมันมากพอที่จะเขียนรหัสเพื่อแก้ไข” เมื่อ Unix ถูกเขียนขึ้นครั้งแรกการติดตามผู้ที่กำหนดลำดับความสำคัญของกระบวนการอาจมีราคาแพงในแง่ของ การใช้งานหน่วยความจำและทำงานเพื่ออัปเดต แต่ในเครื่องที่ทันสมัยนั้นเล็กน้อยเพียงแค่ขาดแรงจูงใจในการเขียนโค้ดเพื่อติดตามสิ่งนี้สำหรับเว็บไซต์ที่ต้องการรักษานโยบายดั้งเดิมของ“ ผู้ใช้ไม่สามารถแทนที่ระบบดูแลระบบ”
alanc

-1

แปลก ๆ มันใช้งานได้สำหรับฉัน

Linux clafujiu 2.6.32-57-generic #119-Ubuntu \
 SMP Wed Feb 19 01:04:55 UTC 2014 i686 GNU/Linux

ตัวอย่าง

$ renice 8 --pid 21122
21122: old priority 9, new priority 8
christian@clafujiu:~/tmp$ ps eo "%p %n"
  PID  NI
 4190   0
 8594   0
14684   0
21122   8
21146   0
21155   0
21209   0
christian@clafujiu:~/tmp$ renice 15 --pid 21122
21122: old priority 8, new priority 15
christian@clafujiu:~/tmp$ ps eo "%p %n"
  PID  NI
 4190   0
 8594   0
14684   0
21122  15
21146   0
21155   0
21211   0
christian@clafujiu:~/tmp$ renice 10 --pid 21122
21122: old priority 15, new priority 10
christian@clafujiu:~/tmp$ ps eo "%p %n"
  PID  NI
 4190   0
 8594   0
14684   0
21122  10
21146   0
21155   0
21213   0

การแก้ไขครั้งที่ 2

$ cat /etc/lsb-release 
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=10.04
DISTRIB_CODENAME=lucid
DISTRIB_DESCRIPTION="Ubuntu 10.04.4 LTS"

กำหนดค่าการเปลี่ยนแปลง

/etc/security/limits.conf

@audio          -       rtprio          100
@audio          -       nice            -10

และฉันเป็นสมาชิกของกลุ่มเสียงนี่คือการลดความหน่วงแฝงด้วยแจ็ค / ardor และบัฟเฟอร์ xruns เมื่อทำการบันทึก

renice

$ renice --version
renice from util-linux-ng 2.17.2

คุณอยู่ที่ distro ไม่ได้อยู่ใน AIX 6.2
Kiwy

โปรดโพสต์ผลลัพธ์ของcat /etc/lsb*และrenice --versionเช่นกัน
terdon

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