เราจะ จำกัด จำนวนแกนกลางของ CPU ที่ผู้ใช้แต่ละคนสามารถใช้ได้อย่างไร?


18

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


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

1
@ghellquist คุณควรตอบคำถามนั้น
slebetman

@ghellquist: คุณอาจต้องการบางสิ่งที่มีน้ำหนักเบาที่สุดเท่าที่จะเป็นไปได้เช่นคอนเทนเนอร์ Linux หากคุณต้องการให้ผู้ใช้ที่แตกต่างกันเห็น CPU บางตัวเท่านั้น (เช่นเมื่อพวกเขาเริ่ม OpenMP หรือโปรแกรมอื่นที่เริ่มเธรดจำนวนมากเท่าที่เห็นแกนมันจะเริ่มต้นจำนวนที่เหมาะสมสำหรับจำนวนคอร์ที่คุณให้ผู้ใช้แต่ละคนใช้จริง) การจำลองเสมือนแบบเต็มรูปแบบเช่น KVM มีค่าใช้จ่ายในการดำเนินการแม้จะรองรับฮาร์ดแวร์เช่น VT-X หรือ AMD-V จากระดับหน้าพิเศษของตารางแม้ในขณะที่หลีกเลี่ยงการออกจาก VM ในโค้ดที่ทำให้ TLB คิดถึงการสัมผัสหน่วยความจำจำนวนมาก
ปีเตอร์คอร์เดส

ฉันขอโทษ แต่มีความจำเป็นสำหรับสิ่งนี้หรือไม่? ในฐานะที่เป็นระบบที่มีผู้ใช้หลายคนโดยค่าเริ่มต้นของ Linux นั้นใช้มัลติทาสกิ้งแบบ preemptive ดังนั้นสถานการณ์ที่ผู้ใช้คนเดียว
Cubic

คำตอบ:


16

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

NAME
       nice - run a program with modified scheduling priority

SYNOPSIS
       nice [OPTION] [COMMAND [ARG]...]

DESCRIPTION
       Run  COMMAND  with an adjusted niceness, which affects process scheduling.  With
       no COMMAND, print the current niceness.  Niceness values range  from  -20  (most
       favorable to the process) to 19 (least favorable to the process).

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

โปรดทราบว่าค่า nice ที่สูงหมายถึงลำดับความสำคัญต่ำ นี่เป็นตัวชี้วัดว่าเราควรจะดีเพียงใดและเราดีกว่ามากเพียงใด

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


ขอบคุณสำหรับคำตอบ. มี "ผู้จัดการเวิร์กโหลด" เช่น SLURM แต่มีไว้สำหรับคอมพิวเตอร์ที่มีหลายโหนด ฉันเดาว่ามันสมเหตุสมผลแล้วที่ผู้คนไม่ได้พัฒนาแอพที่คล้ายกันสำหรับคอมพิวเตอร์โหนดเดี่ยวเนื่องจากมีความต้องการไม่มาก
Reza

@Reza ลองniceจากสิ่งที่คุณอธิบายนั่นเป็นสิ่งที่คุณต้องการจริงๆ
terdon

3
@Reza: นั่นเป็นเพราะระบบปฏิบัติการทำเช่นนั้นแล้ว มันจะแบ่งเวลา CPU ที่มีอยู่โดยอัตโนมัติให้กับเธรด / กระบวนการตามที่ต้องการ
BlueRaja - Danny Pflughoeft

13

TL : DR : จากการวิจัยสั้น ๆ ปรากฏว่ามีความเป็นไปได้ที่จะ จำกัด คำสั่งไปยังจำนวนคอร์เฉพาะอย่างไรก็ตามในทุกกรณีคุณต้องใช้คำสั่งที่บังคับใช้ข้อ จำกัด จริง ๆ

cgroups

ลีนุกซ์มีcgroupsการใช้บ่อยครั้งอย่างแม่นยำเพื่อจุดประสงค์ในการ จำกัด ทรัพยากรที่มีอยู่สำหรับกระบวนการ. จากการวิจัยสั้น ๆ คุณสามารถค้นหาตัวอย่างในการกำหนดค่าArch Wikiด้วย Matlab (ซอฟต์แวร์ทางวิทยาศาสตร์) ใน/etc/cgconfig.conf:

group matlab {
    perm {
        admin {
            uid = username;
        }
        task {
            uid = username;
        }
    }

    cpuset {
        cpuset.mems="0";
        cpuset.cpus="0-5";
    }
    memory {
        memory.limit_in_bytes = 5000000000;
    }
}

เพื่อให้การกำหนดค่าดังกล่าวมีผลคุณจะต้องเรียกใช้กระบวนการผ่านcgexecคำสั่งเช่นจากหน้าวิกิเดียวกัน:

$ cgexec -g memory,cpuset:matlab /opt/MATLAB/2012b/bin/matlab -desktop

taskset

คำถามที่เกี่ยวข้องใน Ask Ubuntu และวิธีการ จำกัด กระบวนการกับแกน CPU หนึ่งในลินุกซ์? [ซ้ำ]บนไซต์ Unix & Linux แสดงตัวอย่างของการใช้tasksetเพื่อ จำกัด CPU สำหรับกระบวนการ ในคำถามแรกมันทำได้โดยการแยกกระบวนการทั้งหมดสำหรับผู้ใช้เฉพาะ

$ ps aux | awk '/^housezet/{print $2}' | xargs -l taskset -p 0x00000001

ในคำถามอื่น ๆ กระบวนการเริ่มต้นด้วยtasksetตัวเอง:

$ taskset -c 0 mycommand --option  # start a command with the given affinity

ข้อสรุป

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

การใช้งานผ่านทางเลือกtasksetหรือcgexecต้องมีการติดต่อสื่อสารกับผู้ใช้ของคุณเพื่อให้พวกเขารู้ว่าสิ่งที่ใช้งานพวกเขาสามารถเรียกใช้หรือการสร้างเสื้อคลุมสคริปต์ซึ่งจะเปิดตัวแอพลิเคชันผ่านหรือtaskselcgexec

นอกจากนี้ให้พิจารณาการตั้งค่าจำนวนกระบวนการที่ผู้ใช้หรือกลุ่มสามารถวางไข่แทนที่จะตั้งค่า จำกัด จำนวนของ CPU นี้สามารถทำได้ผ่านทางไฟล์/etc/security/limits.conf

ดูสิ่งนี้ด้วย


1
ดีมีcgrulesengdและcgrules.confเพื่อย้ายกระบวนการไปยัง cgroup ที่เหมาะสมโดยอัตโนมัติตามผู้ใช้ / กลุ่มแทนที่จะอาศัยผู้ใช้ที่กำลังเรียกใช้กระบวนการของพวกเขาด้วย cgexec แต่ดูเหมือนว่าการตั้งค่าในอูบุนตูค่อนข้างไม่สำคัญ
Hans-Jakob

@ Hans-Jakob มันดูค่อนข้างซับซ้อนและต้องเพิ่มการตั้งค่าสถานะเคอร์เนลในด้วง อาจเป็นสำหรับระดับองค์กรของเครื่องที่คุณมีผู้ใช้จำนวนมากและไม่ต้องการให้ระบบล่มนั่นอาจจะคุ้มค่า แต่สำหรับเดสก์ท็อป - ทำงานมากเกินไป ขอบคุณสำหรับการเชื่อมโยงที่
Sergiy Kolodyazhnyy

2
sched_setaffinity(2)กล่าวว่าหน้ากากเป็นพี่น้องกันจะถูกรักษาไว้ข้ามexecve(2), และfork(2)ว่าเด็กสืบทอดบน ดังนั้นหากคุณมอบหมายให้เชลล์สำหรับผู้ใช้ (หรือเชลล์กราฟิกของพวกเขาสำหรับเซสชัน X) ทุกอย่างที่พวกเขาเริ่มต้นจากเชลล์นั้นจะเป็นค่าเริ่มต้นให้ใช้มาสก์ที่เกี่ยวข้องกัน
ปีเตอร์คอร์เดส

1
ข้อเสียอย่างหนึ่งที่เป็นไปได้คือโปรแกรมที่ตรวจสอบจำนวน CPU ที่เครื่องมีเมื่อตัดสินใจว่าจะเริ่มเธรดจำนวนเท่าใด พวกเขาจะมีเธรดจำนวนมากเกินไปสำหรับจำนวนของแกนประมวลผลที่พวกเขาจะได้รับตามกำหนด คุณทราบหรือไม่ว่ากลุ่ม cg อาจทำอะไรเกี่ยวกับเรื่องนั้นหรือไม่?
Peter Cordes

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