วิธีการตรวจสอบความพร้อมใช้งาน CPU พิเศษสำหรับกระบวนการที่กำลังทำงานอยู่


25

ในตอนแรกคำถามดูเหมือนจะงี่เง่า / สับสนเล็กน้อยเนื่องจากระบบปฏิบัติการทำหน้าที่จัดการการประมวลผลกระบวนการ

อย่างไรก็ตามฉันต้องการวัดว่าบางกระบวนการมี CPU / IO-bound และฉันรู้สึกว่าระบบปฏิบัติการของฉันแทรกแซงการทดลองของฉันด้วยตัวอย่างเช่นกระบวนการ OS ที่กำหนดเวลาไว้

เป็นตัวอย่างสถานการณ์ต่อไปนี้: ฉันรันกระบวนการ A สองครั้งและรับผลลัพธ์ต่อไปนี้จากเครื่องมือ "time" (คอลัมน์เวลาเป็นวินาที):

+---+-------+---------+-----------+---------+
|Run|Process|User Time|System Time|Wall time|
+---+-------+---------+-----------+---------+
|1  |A      |196.3    |5.12       |148.86   |
|2  |A      |190.79   |4.93       |475.46   |
+---+-------+---------+-----------+---------+

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

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

ฉันใช้Linux 4.4.0-45-genericกับUbuntu 14.04 LTS 64 บิต

ฉันขอขอบคุณความช่วยเหลือ หากคุณต้องการข้อมูลที่ขาดหายไปฉันจะแก้ไขโพสต์ของฉันทันที

ข้อมูล CPU

$ grep proc /proc/cpuinfo | wc -l
8
$ lscpu
Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                8
On-line CPU(s) list:   0-7
Thread(s) per core:    2
Core(s) per socket:    4
Socket(s):             1
NUMA node(s):          1
Vendor ID:             GenuineIntel
CPU family:            6
Model:                 60
Stepping:              3
CPU MHz:               4002.609
BogoMIPS:              7183.60
Virtualization:        VT-x
L1d cache:             32K
L1i cache:             32K
L2 cache:              256K
L3 cache:              8192K
NUMA node0 CPU(s):     0-7

คุณสามารถเริ่มต้นกระบวนการของคุณโดยใช้ลำดับความสำคัญสูงnice -19 process
Dababi

คำตอบ:


26

คุณมีการกำหนดค่าตัวเลือกเคอร์เนลที่ 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

ฉันไม่รู้ว่าเป็นไปได้ที่จะทำอย่างนั้น :) ฉันจะตรวจสอบการอ้างอิงของคุณ รอคอยที่จะทำเครื่องหมายหัวข้อนี้ตามที่ได้รับการแก้ไข)
Jeanderson Candido

ฉันเกือบลืม ... มีวิธีใดบ้างในการตรวจสอบการดำเนินการเพื่อตรวจสอบว่าการแยกนี้ใช้งานได้หรือไม่
Jeanderson Candido

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