การใช้และทำความเข้าใจกับตัวเลือกที่เกี่ยวข้องกับการตั้งเวลา systemd ในบริบทเดสก์ท็อป


14

ในไฟล์บริการ systemd หนึ่งสามารถตั้งค่าตัวเลือกที่เกี่ยวข้องกับการจัดตารางเวลาต่อไปนี้ (จากsystemd.execหน้าคนแก้ไขฉันถ้าฉันผิด):

Nice ตั้งค่าระดับ nice เริ่มต้น (ลำดับความสำคัญตามกำหนดเวลา) สำหรับกระบวนการที่ดำเนินการ ใช้จำนวนเต็มระหว่าง -20 (ลำดับความสำคัญสูงสุด) ถึง 19 (ลำดับความสำคัญต่ำสุด) ดูsetpriority (2)สำหรับรายละเอียด

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

CPUSchedulingPolicy ตั้งค่านโยบายการกำหนดเวลา CPU สำหรับกระบวนการที่ดำเนินการ ใช้เวลาหนึ่งอื่นแบทช์ไม่ได้ใช้งาน fifo หรือ rr ดูsched_setscheduler (2)เพื่อดูรายละเอียด

CPUSchedulingPriority ตั้งค่าลำดับความสำคัญการกำหนดเวลา CPU สำหรับกระบวนการที่ดำเนินการ ช่วงลำดับความสำคัญที่มีอยู่จะขึ้นอยู่กับนโยบายการตั้งเวลา CPU ที่เลือก (ดูด้านบน) สำหรับนโยบายการจัดตารางเวลาแบบเรียลไทม์สามารถใช้จำนวนเต็มระหว่าง 1 (ลำดับความสำคัญต่ำสุด) และ 99 (ลำดับความสำคัญสูงสุด) ได้ ดูsched_setscheduler (2)เพื่อดูรายละเอียด

CPUSchedulingResetOnFork ใช้อาร์กิวเมนต์แบบบูล หากเป็นจริงลำดับความสำคัญของการกำหนดเวลา CPU ที่สูงขึ้นและนโยบายจะถูกรีเซ็ตเมื่อกระบวนการประมวลผลแยกกันและอาจไม่รั่วไหลไปสู่กระบวนการลูก ดูsched_setscheduler (2)เพื่อดูรายละเอียด ค่าเริ่มต้นเป็นเท็จ

ฉันเข้าใจตัวเลือกสุดท้าย ฉันรวบรวมจากคำอธิบายของสองข้อแรกที่ฉันสามารถเลือกนโยบายการกำหนดเวลาจากนั้นตามลำดับความสำคัญ ไม่ชัดเจนสำหรับฉันว่าฉันควรเลือกงานประเภทใด ตัวอย่างเช่นจะปลอดภัยหรือไม่ที่จะเลือก 'ไม่ใช้งาน' สำหรับงานสำรองข้อมูล (ค่อนข้างใช้งาน CPU สูงเนื่องจากการขจัดข้อมูลซ้ำซ้อน) หรือเหมาะสมกว่าหรือไม่

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

ถัดจากการกำหนดตารางเวลาของ CPU จะมีการตั้งเวลา IO ฉันเดาว่าสิ่งนี้สอดคล้องกับionice(แก้ไขฉันหากฉันผิด)

IOSchedulingClass ตั้งค่าคลาสการกำหนดตารางเวลา I / O สำหรับกระบวนการที่ดำเนินการ ใช้จำนวนเต็มระหว่าง 0 ถึง 3 หรือหนึ่งในสตริงที่ไม่มีแบบเรียลไทม์ความพยายามที่สุดหรือไม่ได้ใช้งาน ดูioprio_set (2)สำหรับรายละเอียด

IOSchedulingPriority ตั้งค่าลำดับความสำคัญการกำหนดตารางเวลา I / O สำหรับกระบวนการที่ดำเนินการ ใช้จำนวนเต็มระหว่าง 0 (ลำดับความสำคัญสูงสุด) และ 7 (ลำดับความสำคัญต่ำสุด) ลำดับความสำคัญที่มีอยู่ขึ้นอยู่กับคลาสการกำหนดตารางเวลา I / O ที่เลือก (ดูด้านบน) ดูioprio_set (2)สำหรับรายละเอียด

เราจะเห็นโครงสร้างเดียวกันกับการตั้งเวลา CPU ฉันกำลังมองหาข้อมูลประเภทเดียวกันเช่นกัน

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


2
คุณกำลังพยายามแก้ไขปัญหาด้านประสิทธิภาพเฉพาะด้านใด มีบางสิ่งทำงานช้าเกินไปหรือช้าเกินไปสำหรับคุณหรือไม่ ฉันใช้ Ubuntu 16.04 กับ systemd เป็นเดสก์ท็อปด้วยการสำรองข้อมูลที่ทำงานในพื้นหลังและไม่มีปัญหาด้านประสิทธิภาพที่เกี่ยวข้องกับลำดับความสำคัญที่เกี่ยวข้อง
Mark Stosberg

@ MarkStosberg คำถามได้รับแจ้งจากงานแบ็คกราวด์สำรองที่ทำงานในขณะที่ทำงานเบื้องหน้าการคำนวณบนระบบ dual-core ทำให้อินเตอร์เฟสไม่ตอบสนอง ฉันเพิ่มตัวเลือก Nice ลงในสคริปต์สำรองแล้วในเวลาเดียวกันก็เห็นตัวเลือกอื่น ๆ พวกเขาอาจเกี่ยวข้องกับปัญหาที่เกิดจากการสำรองข้อมูลหรือปัญหาอื่น ๆ ที่ฉันพบในอนาคต ดังนั้นฉันต้องการเรียนรู้เพิ่มเติมเกี่ยวกับตัวเลือกอื่น ๆ เหล่านั้นโดยไม่เกี่ยวข้องกับประเด็นที่เป็นรูปธรรม
equaeghe

เอกสารแต่ละบิตอ้างอิงถึงหน้าคนที่คุณสามารถค้นหาเอกสารเพิ่มเติมหากคุณสนใจ การอ่านคู่มืออ้างอิงสำหรับ ioprio_set (2) และ sched_setscheduler (2) ช่วยตอบคำถามของคุณหรือไม่
Mark Stosberg

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

ฉันเพิ่งสะดุดกับคำสั่งเหล่านี้ในบริบทเดียวกันมาก (การสำรองข้อมูลพื้นหลังทำให้เกิดความล่าช้า) ฉันพบว่าman scheduler (7)มีคำอธิบายที่ครอบคลุมมากขึ้นของอีกสอง man pages (นอกจากนี้ยังกล่าวถึงเมื่อniceใช้ค่า)
Wisperwind

คำตอบ:


5

CPUScheduling {นโยบาย | ลำดับความสำคัญ}

ลิงค์จะบอกคุณว่าCPUSchedulingPriorityควรจะตั้งค่าสำหรับงานfifoหรือrr("เรียลไทม์") เท่านั้น คุณไม่ต้องการบังคับให้ตั้งเวลาตามเวลาจริงในบริการ

CPUSchedulingPolicy=other เป็นค่าเริ่มต้น

ที่ใบและbatch idleความแตกต่างระหว่างสิ่งเหล่านี้จะเกี่ยวข้องถ้าคุณมีงานที่มีลำดับความสำคัญที่ไม่ได้ใช้งานจำนวนมากที่ใช้ CPU ในเวลาเดียวกัน ในทางทฤษฎีbatchให้ปริมาณงานที่สูงขึ้น (เพื่อแลกกับเวลาในการตอบสนองที่นานขึ้น) แต่มันไม่ใช่การชนะครั้งใหญ่ดังนั้นจึงไม่เกี่ยวข้องกันในกรณีนี้

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

อย่างไรก็ตามเดสก์ท็อปส่วนใหญ่ไม่มีการใช้งานส่วนใหญ่ และเมื่อคุณมีซีพียูหมูที่เตรียมงานพื้นหลังไว้ล่วงหน้ามันเป็นเรื่องธรรมดาที่หมูจะใช้ซีพียูตัวใดตัวหนึ่งของคุณเท่านั้น โดยที่ในใจฉันจะไม่รู้สึกเสี่ยงเกินไปidleในการใช้งานเดสก์ท็อปหรือแล็ปท็อปโดยเฉลี่ย นอกจากจะมี Atom / Celeron / ARM CPU จัดอันดับที่หรือต่ำกว่าประมาณ 15 วัตต์ ; จากนั้นฉันอยากจะดูสิ่งต่าง ๆ ให้ดีขึ้นอย่างระมัดระวัง

ระดับที่ดี 'ล้มเหลว' โดยคุณสมบัติเคอร์เนล 'กลุ่มอัตโนมัติ' หรือไม่

ใช่.

การจัดกลุ่มอัตโนมัติค่อนข้างแปลก ผู้เขียนsystemdไม่ชอบฮิวริสติกแม้แต่กับเดสก์ท็อป หากคุณต้องการที่จะทดสอบการปิดใช้งาน autogrouping คุณสามารถตั้งค่าsysctl ไปkernel.sched_autogroup_enabled 0ฉันเดาว่าดีที่สุดในการทดสอบโดยการตั้งค่า sysctl ในการกำหนดค่าถาวรและการรีบูตเครื่องเพื่อให้แน่ใจว่าคุณได้กำจัดกลุ่มอัตโนมัติทั้งหมด

จากนั้นคุณควรจะมีระดับที่ดีสำหรับบริการของคุณโดยไม่มีปัญหาใด ๆ อย่างน้อยใน systemd เวอร์ชันปัจจุบัน - ดูหัวข้อถัดไป

เช่นระดับดี 10 จะลดน้ำหนักที่เธรดแต่ละตัวมีในตัวกำหนดเวลา CPU Linux ลงประมาณ 10% นีซระดับ 14 ต่ำกว่า 5% (ลิงก์: สูตรเต็มรูปแบบ )

ภาคผนวก: ระดับที่ดีคือ 'subverted' โดย systemd cgroups หรือไม่

การDefaultCPUAccounting= ตั้งค่าปัจจุบันจะใช้ค่าเริ่มต้นเป็นปิดยกเว้นว่าจะสามารถเปิดใช้งานได้โดยไม่ต้องเปิดใช้งานการควบคุม CPU บนพื้นฐานต่อบริการ ดังนั้นควรปรับ คุณสามารถตรวจสอบได้ในเอกสารปัจจุบันของคุณ:man systemd-system.conf

โปรดทราบว่าการควบคุม CPU ต่อบริการจะถูกเปิดใช้งานด้วยเมื่อบริการใด ๆตั้งค่า CPUAccounting / CPUWeight / StartupCPUWeight / CPUShares / StartupCPUShares

สารสกัดจากบล็อกต่อไปนี้ล้าสมัย (แต่ยังออนไลน์อยู่) พฤติกรรมเริ่มต้นมีการเปลี่ยนแปลงตั้งแต่และเอกสารอ้างอิงได้รับการปรับปรุงให้สอดคล้อง

เป็นค่าเริ่มต้นที่ดีถ้าตัวควบคุม cpu เปิดใช้งานในเคอร์เนล systemd จะสร้าง cgroup สำหรับแต่ละบริการเมื่อเริ่มต้น หากไม่มีการกำหนดค่าเพิ่มเติมสิ่งนี้มีผลดีอย่างหนึ่ง: บนระบบ systemd ทุกบริการของระบบจะได้รับ CPU จำนวนเท่า ๆ กันไม่ว่าจะมีกระบวนการจำนวนเท่าใดก็ตาม หรือกล่าวอีกนัยหนึ่ง: บนเว็บเซิร์ฟเวอร์ของคุณ MySQL จะได้รับซีพียู Apache ในปริมาณที่เท่า ๆ กันแม้ว่าในภายหลังจะมีกระบวนการสคริปต์ CGI 1,000 ตัว แต่ในอดีตเป็นเพียงงานไม่กี่งานเท่านั้น (พฤติกรรมนี้สามารถปิดได้โปรดดูที่ DefaultControllers = ใน /etc/systemd/system.conf)

ด้านบนของค่าเริ่มต้นนี้เป็นไปได้ที่จะกำหนดค่า CPU ที่แชร์บริการที่ได้รับอย่างชัดเจนด้วยการตั้งค่า CPUShares = ค่าเริ่มต้นคือ 1024 หากคุณเพิ่มจำนวนนี้คุณจะกำหนด CPU ให้กับบริการมากกว่าหนึ่งที่ไม่เปลี่ยนแปลงที่ 1024 หากคุณลดจำนวนลงให้น้อยลง

http://0pointer.de/blog/projects/resources.html


-3

คำแนะนำในการปรับแต่งแบบคลาสสิคคือ "Don't Optimize, Benchmark"

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

เดสก์ท็อปสมัยใหม่มักจะทำงานเร็วมากโดยไม่ต้องจูนเลย


3
ขออภัย แต่นี่ไม่ใช่คำตอบสำหรับคำถาม ประเด็นทั้งหมดคือการพยายามทำสิ่งต่าง ๆ เป็นเรื่องยากหากไม่เข้าใจผลกระทบ และคำถามนี้ได้รับแจ้งจาก (แต่ไม่เกี่ยวกับ!) ปัญหาด้านประสิทธิภาพบนเดสก์ท็อปสมัยใหม่
equaeghe

1
ใช้เวลาเพียงไม่กี่นาทีในการลองใช้ตัวเลือกใด ๆ หากคุณมีเกณฑ์มาตรฐานและเป้าหมายด้านประสิทธิภาพคุณสามารถตรวจสอบได้อย่างง่ายดายว่าตัวเลือกที่คุณพยายามย้ายคุณไปในทิศทางที่คุณต้องการ
Mark Stosberg

@equaeghe, frobbing สุ่มลูกบิดโดยไม่รู้ว่าสิ่งที่พวกเขาทำจะไม่แก้ปัญหาอย่างใดอย่างหนึ่ง
vonbrand

คำแนะนำที่เพียงพอ แต่ไม่ใช่คำตอบ นี่ควรจะเป็นความคิดเห็น บางครั้งความรู้สึกของ "นี่คือ waaay ช้าเกินไป" เป็นมาตรฐานเพียงพอที่จะกระตุ้นให้เกิดการกระทำ ตัวอย่างเช่นการใช้systemd-analyzeกับblameและplotฉันสามารถลดเวลาบูตใน RPi รุ่นเก่าลงได้มากกว่าหนึ่งนาที แน่นอนว่าเมื่อพูดถึงการวิเคราะห์ปัญหาแล้วจำเป็นต้องวัดผลแทนที่จะเริ่มต้น "การเพิ่มประสิทธิภาพ" ก่อนกำหนด
0xC0000022L
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.