คุณมีการกำหนดค่าตัวเลือกเคอร์เนลที่ CPU จะไม่ถูกนำมาใช้โดย OS isolcpus
ก็จะเรียกว่า
isolcpus - แยก CPUs จากเคอร์เนลตัวกำหนดเวลา
เรื่องย่อ isolcpus = cpu_number [, cpu_number, ... ]
คำอธิบายลบ CPU ที่ระบุตามที่กำหนดโดยค่า cpu_number จากเคอร์เนลทั่วไป SMP การปรับสมดุลและ algroithms ตัวกำหนดตารางเวลา วิธีเดียวที่จะย้ายกระบวนการไปยังหรือปิดซีพียู "ที่แยกได้" คือผ่าน syscalls ที่เกี่ยวข้อง cpu_number เริ่มต้นที่ 0 ดังนั้นค่าสูงสุดคือ 1 น้อยกว่าจำนวนของ CPU ในระบบ
การกำหนดค่านี้ฉันกำลังจะอธิบายวิธีการตั้งค่าสามารถใช้ประโยชน์ได้มากกว่าการทดสอบ
ตัวอย่างเช่น Meru ใช้เทคโนโลยีนี้ในตัวควบคุม AP ที่ใช้ Linux ของพวกเขาเพื่อป้องกันการรับส่งข้อมูลเครือข่ายจากการรบกวนการทำงานภายในของระบบปฏิบัติการนั่นคือการดำเนินงาน I / O
ฉันยังใช้มันในส่วนหน้าเว็บที่ยุ่งมากด้วยเหตุผลเดียวกัน: ฉันได้พบจากประสบการณ์ชีวิตที่ฉันสูญเสียการควบคุมเป็นประจำเกินไปสำหรับรสชาติของเซิร์ฟเวอร์นั้น ต้องทำการบูทใหม่อย่างแรงจนกระทั่งฉันแยก front end daemon บน CPU เฉพาะของตัวเอง
เนื่องจากคุณมี 8 CPU คุณสามารถตรวจสอบกับเอาต์พุตของคำสั่ง:
$ grep -c proc /proc/cpuinfo
8
หรือ
$ lscpu | grep '^CPU.s'
CPU(s): 8
เพิ่มใน Debian / Ubuntu ในไฟล์/etc/default/grub
ไปยังตัวเลือกGRUB_CMDLINE_LINUX
:
GRUB_CMDLINE_LINUX="isolcpus=7"
(มันคือ 7 เพราะมันเริ่มต้นที่ 0 และคุณมี 8 คอร์)
จากนั้นเรียกใช้
sudo update-grub
นี่เป็นการบอกเคอร์เนลว่าจะไม่ใช้หนึ่งในคอร์ของคุณ
รีบูทระบบ
จากนั้นเริ่มกระบวนการของคุณ
ทันทีที่เริ่มต้นคุณสามารถเปลี่ยน CPU ตัวที่ 8 (7 เพราะ 0 คืออันที่ 1) และค่อนข้างแน่ใจว่าคุณเป็นคนเดียวที่ใช้ CPU ตัวนั้น
สำหรับสิ่งนั้นให้ใช้คำสั่ง:
taskset -cp 7 PID_number
tasket - ดึงหรือตั้งค่าความสัมพันธ์ซีพียูของกระบวนการ
สรุป
taskset [options] [mask | list ] [pid | command [arg]...]
รายละเอียด
tasket ถูกใช้เพื่อตั้งค่าหรือดึงความสัมพันธ์ของ CPU ของโปรเซสที่กำลังรันที่ระบุ PID หรือเพื่อเรียกใช้คำสั่งใหม่ด้วย CPU affinity ที่กำหนด CPU affinity เป็นคุณสมบัติตัวกำหนดตารางเวลาที่ "เชื่อมโยง" กระบวนการให้กับชุดของ CPU ที่ระบุบนระบบ ตัวกำหนดตารางเวลา Linux จะเคารพ CPU ที่เกี่ยวข้องและกระบวนการจะไม่ทำงานบน CPU อื่นใด ๆ โปรดทราบว่าตัวกำหนดตารางเวลา Linux ยังสนับสนุนความเกี่ยวข้องของ CPU ตามธรรมชาติด้วย: ตัวกำหนดตารางเวลาพยายามเก็บกระบวนการบน CPU เดียวกันตราบใดที่สามารถใช้งานได้จริงด้วยเหตุผลด้านประสิทธิภาพ ดังนั้นการบังคับซีพียูที่เกี่ยวข้องจะมีประโยชน์เฉพาะในบางแอปพลิเคชันเท่านั้น
สำหรับการอ่านเพิ่มเติมเกี่ยวกับเรื่องนี้โปรดดูที่: isolcpus, numactl และ tasket
นอกจากนี้การใช้ps -eF
คุณควรเห็นในคอลัมน์ PSR โปรเซสเซอร์ที่ใช้
ฉันมีเซิร์ฟเวอร์ที่มีซีพียูที่ 2 และ 3 แยกและแน่นอนมันสามารถเห็นได้ด้วยps -e
กระบวนการเฉพาะในuserlandpound
ตามที่ตั้งใจไว้คือ
# ps -eo psr,command | tr -s " " | grep "^ [2|3]"
2 [cpuhp/2]
2 [watchdog/2]
2 [migration/2]
2 [ksoftirqd/2]
2 [kworker/2:0]
2 [kworker/2:0H]
3 [cpuhp/3]
3 [watchdog/3]
3 [migration/3]
3 [ksoftirqd/3]
3 [kworker/3:0]
3 [kworker/3:0H]
2 [kworker/2:1]
3 [kworker/3:1]
3 [kworker/3:1H]
3 /usr/sbin/pound
หากคุณเปรียบเทียบกับซีพียูที่ไม่แยกพวกเขากำลังทำงานหลายอย่างเพิ่มเติม (หน้าต่างด้านล่างสไลด์ ):
# ps -eo psr,command | tr -s " " | grep "^ [0|1]"
0 init [2]
0 [kthreadd]
0 [ksoftirqd/0]
0 [kworker/0:0H]
0 [rcu_sched]
0 [rcu_bh]
0 [migration/0]
0 [lru-add-drain]
0 [watchdog/0]
0 [cpuhp/0]
1 [cpuhp/1]
1 [watchdog/1]
1 [migration/1]
1 [ksoftirqd/1]
1 [kworker/1:0]
1 [kworker/1:0H]
1 [kdevtmpfs]
0 [netns]
0 [khungtaskd]
0 [oom_reaper]
1 [writeback]
0 [kcompactd0]
0 [ksmd]
1 [khugepaged]
0 [crypto]
1 [kintegrityd]
0 [bioset]
1 [kblockd]
1 [devfreq_wq]
0 [watchdogd]
0 [kswapd0]
0 [vmstat]
1 [kthrotld]
0 [kworker/0:1]
0 [deferwq]
0 [scsi_eh_0]
0 [scsi_tmf_0]
1 [vmw_pvscsi_wq_0]
0 [bioset]
1 [jbd2/sda1-8]
1 [ext4-rsv-conver]
0 [kworker/0:1H]
1 [kworker/1:1H]
1 [bioset]
0 [bioset]
1 [bioset]
1 [bioset]
1 [bioset]
1 [bioset]
1 [bioset]
1 [bioset]
0 [jbd2/sda3-8]
1 [ext4-rsv-conver]
1 /usr/sbin/rsyslogd
0 /usr/sbin/irqbalance --pid=/var/run/irqbalance.pid
1 /usr/sbin/cron
0 /usr/sbin/sshd
1 /usr/sbin/snmpd -Lf /dev/null -u snmp -g snmp -I -smux -p /var/run/snmpd.pid
1 /sbin/getty 38400 tty1
1 /lib/systemd/systemd-udevd --daemon
0 /usr/sbin/xinetd -pidfile /run/xinetd.pid -stayalive
1 [kworker/1:2]
0 [kworker/u128:1]
0 [kworker/0:2]
0 [bioset]
1 [xfsalloc]
1 [xfs_mru_cache]
1 [jfsIO]
1 [jfsCommit]
0 [jfsCommit]
0 [jfsCommit]
0 [jfsCommit]
0 [jfsSync]
1 [bioset]
0 /usr/bin/monit -c /etc/monit/monitrc
1 /usr/sbin/pound
0 sshd: rui [priv]
0 sshd: rui@pts/0,pts/1
1 -bash
1 -bash
1 -bash
1 [kworker/u128:0]
1 -bash
0 sudo su
1 su
1 bash
0 bash
0 logger -t cmdline root[/home/rui]
1 ps -eo psr,command
0 tr -s
0 grep ^ [0|1]
0 /usr/bin/vmtoolsd
nice -19 process