ปิดใช้งาน cpu cores บน quad core processor บน linux


14

ฉันต้องการที่จะปิดการใช้งาน 3 คอร์ CPU และเรียกใช้โปรเซสเซอร์ของฉันในแกนเดียว ฉันได้ใช้คำสั่ง: maxcpus=1. แต่หลังจากนี้ฉันรันคำสั่งls /sys/devices/system/cpuนี้ cpu0,cpu1,cpu2,cpu3มันก็ยังคงแสดงให้เห็นว่า

ฉันพยายามด้วย: echo 0 > /sys/devices/system/cpu3/onlineแต่ฉันได้รับข้อผิดพลาดต่อไปนี้: no such file or directory.


มันไม่ชัดเจนที่คุณใส่maxcpus=1 commmand ? คุณใส่สตริงนั้นgrub.cfgเป็นตัวเลือกการบูตหรือไม่? (โปรดอัปเดตคำถามของคุณแทนที่จะตอบในความคิดเห็น)
Anthon

ฉันกำลังใช้บอร์ด freescale IMx6 sabreauto บน linux OS ฉันสั่งคำสั่งบนเครื่องจำลองเทอร์มินัล "gtkterm"
3818847

ด้วยคำสั่งนี้ echo 0> / sys / devices / system / cpu3 / online ฉันสามารถเห็นการปิดระบบ cpu3 ตอนนี้สิ่งที่ฉันต้องการทราบคือฉันควรรีบูตระบบเพื่อให้การเปลี่ยนแปลงมีผลหรือฉันสามารถดำเนินการต่อโดยไม่ต้องรีบูต
3818847

AFAIK คุณควรระบุ maxcpus = 1 เป็นพารามิเตอร์สำหรับเคอร์เนล (เช่นเมื่อคุณอยู่ในด้วง) แก้ไข '/ etc / defaults / grub' เพื่อเพิ่มพารามิเตอร์เคอร์เนลเรียกใช้ 'update-grub' และรีบูต ที่จะทำให้สิ่งต่าง ๆ คงอยู่นั่นคือมีเพียงหนึ่ง CPU ในการเริ่มต้น Linux
Anthon

2
@ user3818847 คุณใช้ distro อะไร การแก้ไขพารามิเตอร์การบู๊ต (เพื่อส่งmaxcpus=1) จะแตกต่างกันไปตาม distro นอกจากนี้ยังมีเส้นทางที่คุณมีเป็นเพียงผิดหนึ่งเส้นทางที่ถูกต้อง/sys /sys/devices/system/cpu/cpu3/online
แพทริค

คำตอบ:


28

ในฐานะที่เป็นแพทริคได้ระบุไว้ในความคิดเห็นที่คุณได้รับเส้นทางที่/sysผิด

echo 0 > /sys/devices/system/cpu/cpu3/online

หากคุณต้องการปิด CPU ทั้งหมดยกเว้นcpu0:

for x in /sys/devices/system/cpu/cpu[1-9]*/online; do
  echo 0 >"$x"
done

การพิมพ์maxcpus=1ที่ shell prompt ไม่มีผลใด ๆ ยิ่งไปกว่านั้นมันตั้งค่าตัวแปรmaxcpusให้กับค่า1ในเชลล์นั้นซึ่งไม่มีผลกระทบใด ๆ คุณสามารถกำหนดจำนวนของซีพียูในเวลาบูตโดยผ่านmaxcpusเป็นพารามิเตอร์เคอร์เนล สำหรับสิ่งนั้นคุณต้องเปลี่ยนการกำหนดค่า bootloader ของคุณ (เช่นการเปลี่ยนบรรทัดคำสั่งเคอร์เนลใน U-Boot)


ขอบคุณสำหรับคำแนะนำ มันทำงานร่วมกับคำสั่งที่คุณแนะนำ
user3818847

นี่เป็นเคอร์เนลที่เจาะจงอย่างน้อย ฉันใช้เคอร์เนล 3.6.6 และไม่มีไฟล์ดังกล่าว คุณแทนที่จะใช้ไฟล์เดี่ยว/sys/devices/system/cpu/onlineและ./offlineไฟล์เพื่อควบคุมแกนทั้งหมด
Daniel Griscom

@Gilles - มีวิธีที่จะรู้ว่าต้องใช้เวลานานเท่าใดในการเปิดcoreและปิด?
Chetan Arvind Patil

@ChetanArvindPatil ได้เวลาแล้ว ฉันคิดว่าเวลาจะถูกครอบงำโดยการเข้าถึง RAM หากรหัสที่เกี่ยวข้องไม่ได้อยู่ในแคช L2 และตามเวลาที่จะปิดการทำงานหลัก แต่อย่างใดขึ้นอยู่กับ CPU และระบบปฏิบัติการ
Gilles 'หยุดชั่วร้าย'

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

1

คุณไม่จำเป็นต้องปิดหรือปิดการใช้งานคอร์

คุณจะใช้cpusetsและtasket

http://man7.org/linux/man-pages/man7/cpuset.7.html

cpuset กำหนดรายการของ CPU และโหนดหน่วยความจำ ...

ระบบไฟล์ cpuset เป็นอินเตอร์เฟสระบบไฟล์หลอกไปยังกลไกเคอร์เนล cpuset ซึ่งใช้ในการควบคุมการวางโปรเซสเซอร์และการจัดวางหน่วยความจำของกระบวนการ มันเป็นเรื่องปกติที่ / dev / cpuset

บนระบบที่มีเมล็ดที่คอมไพล์ด้วยตัวสนับสนุน cpusets กระบวนการทั้งหมดจะเชื่อมต่อกับ cpuset และ cpusets จะปรากฏอยู่เสมอ หากระบบรองรับ cpusets ระบบจะมีรายการ nodev cpuset ในไฟล์ / proc / filesystems โดยการติดตั้งระบบไฟล์ cpuset (ดูหัวข้อ EXAMPLE ด้านล่าง) ผู้ดูแลระบบสามารถกำหนดค่า cpusets บนระบบเพื่อควบคุมตัวประมวลผลและการจัดวางหน่วยความจำของกระบวนการในระบบนั้น โดยค่าเริ่มต้นหากการกำหนดค่า cpuset บนระบบไม่ได้ถูกแก้ไขหรือหากระบบไฟล์ cpuset ไม่ได้ติดตั้งอยู่กลไกของ cpuset จะยังไม่ส่งผลกระทบต่อพฤติกรรมของระบบ

ซีพียูของระบบรวมหน่วยการประมวลผลแบบลอจิคัลทั้งหมดที่กระบวนการสามารถดำเนินการได้รวมถึงหากมีหลายคอร์โปรเซสเซอร์ภายในแพ็คเกจและ Hyper-Threads ภายในโปรเซสเซอร์หลัก โหนดหน่วยความจำประกอบด้วยธนาคารที่แตกต่างกันทั้งหมดของหน่วยความจำหลัก โดยทั่วไประบบขนาดเล็กและ SMP จะมีโหนดหน่วยความจำเพียงโหนดเดียวที่มีหน่วยความจำหลักทั้งหมดของระบบในขณะที่ระบบ NUMA (การเข้าถึงหน่วยความจำที่ไม่ใช่เครื่องแบบ) มีโหนดหน่วยความจำหลายโหนด

กล่าวโดยย่อถ้าคุณมี 1 cpu ที่มี 6 คอร์คุณจะต้องกำหนดค่า cpusets และเปิดใช้งานกระบวนการของคุณในcpusetที่กำหนดค่าไว้ในแกนเดียวตัวอย่างเช่น core # 3 ถ้ามันเป็นกระบวนการแบบขนานมันทั้งหมดจะถูก จำกัด อยู่ที่หนึ่งคอร์นั้นถ้าคุณเปิดตัว 4 โพรเซสใน cpuset ที่กำหนดโดยมีเพียงหนึ่งคอร์ที่กำหนดไว้ดังนั้นโพรเซสทั้งสี่นั้นจะได้รับประโยชน์ 25% cpu บนแกน # 3

สิ่งที่มักจะเกิดขึ้นคือcpusetถูกกำหนดค่าเช่นนั้น

  • ในระบบหลัก 200+ cpusetA คือแกน 0..60 ไม่ว่าจะอยู่ที่ไหน cpusetB คือแกน 61 .. 70; cpusetC เป็นแกน 71 .. 80; อย่างไรก็ตามผู้ดูแลระบบ / สถาปนิกเลือกที่จะกำหนดค่า
  • cpusetA ถูกจัดสรรให้กับผู้ใช้และ / หรือโปรแกรมซอฟต์แวร์เฉพาะ cpusetB ถูกจัดสรรให้กับผู้ใช้ / โปรแกรมที่แตกต่างกัน และอื่น ๆ
  • ผู้ใช้เรียกใช้งาน (โปรเซส) ซึ่งจะร้องขอN cores ... ภายใน cpuset ที่กำหนดและตอนนี้กระบวนการหลาย ๆ (ขนาน) จะถูก จำกัด ไว้ที่ cpuset ที่กำหนด และสำหรับNขนานเหล่านั้นถูก จำกัด อยู่ที่ cpuset ที่กำหนดแต่ละกระบวนการเหล่านั้นจะ / ควรใช้ประโยชน์จากความสัมพันธ์ของตัวประมวลผลหรือความสัมพันธ์ของซีพียูเพื่อให้กระบวนการแบบขนานเหล่านั้นไม่ได้ฟาดไปมาบนแกนต่าง ๆ ภายใน cpuset

ยัง: https://linux.die.net/man/1/taskset

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