ค้นหาว่างานใดกำลังสร้างการสลับบริบทจำนวนมากบน linux


11

ตาม vmstat เซิร์ฟเวอร์ Linux ของฉัน (2xCore2 Duo 2.5 GHz) กำลังทำอย่างต่อเนื่องรอบสวิตช์บริบท 20k ต่อวินาที

# vmstat 3
procs -----------memory----------  ---swap-- -----io----  -system-- ----cpu----
 r  b   swpd   free   buff  cache    si   so    bi    bo   in    cs us sy id wa
 2  0   7292 249472  82340 2291972    0    0     0     0    0     0  7 13 79  0
 0  0   7292 251808  82344 2291968    0    0     0   184   24 20090  1  1 99  0
 0  0   7292 251876  82344 2291968    0    0     0    83   17 20157  1  0 99  0
 0  0   7292 251876  82344 2291968    0    0     0    73   12 20116  1  0 99  0

... แต่uptimeแสดงโหลดน้อย: load average: 0.01, 0.02, 0.01และtopไม่แสดงกระบวนการใด ๆ ที่มีการใช้งาน CPU สูง

ฉันจะค้นหาสิ่งที่กำลังสร้างสวิตช์บริบทเหล่านั้นได้อย่างไร? กระบวนการ / เธรดใด

ฉันพยายามวิเคราะห์pidstatผลลัพธ์:

# pidstat -w 10 1

12:39:13          PID   cswch/s nvcswch/s  Command
12:39:23            1      0.20      0.00  init
12:39:23            4      0.20      0.00  ksoftirqd/0
12:39:23            7      1.60      0.00  events/0
12:39:23            8      1.50      0.00  events/1
12:39:23           89      0.50      0.00  kblockd/0
12:39:23           90      0.30      0.00  kblockd/1
12:39:23          995      0.40      0.00  kirqd
12:39:23          997      0.60      0.00  kjournald
12:39:23         1146      0.20      0.00  svscan
12:39:23         2162      5.00      0.00  kjournald
12:39:23         2526      0.20      2.00  postgres
12:39:23         2530      1.00      0.30  postgres
12:39:23         2534      5.00      3.20  postgres
12:39:23         2536      1.40      1.70  postgres
12:39:23        12061     10.59      0.90  postgres
12:39:23        14442      1.50      2.20  postgres
12:39:23        15416      0.20      0.00  monitor
12:39:23        17289      0.10      0.00  syslogd
12:39:23        21776      0.40      0.30  postgres
12:39:23        23638      0.10      0.00  screen
12:39:23        25153      1.00      0.00  sshd
12:39:23        25185     86.61      0.00  daemon1
12:39:23        25190     12.19     35.86  postgres
12:39:23        25295      2.00      0.00  screen
12:39:23        25743      9.99      0.00  daemon2
12:39:23        25747      1.10      3.00  postgres
12:39:23        26968      5.09      0.80  postgres
12:39:23        26969      5.00      0.00  postgres
12:39:23        26970      1.10      0.20  postgres
12:39:23        26971     17.98      1.80  postgres
12:39:23        27607      0.90      0.40  postgres
12:39:23        29338      4.30      0.00  screen
12:39:23        31247      4.10     23.58  postgres
12:39:23        31249     82.92     34.77  postgres
12:39:23        31484      0.20      0.00  pdflush
12:39:23        32097      0.10      0.00  pidstat

ดูเหมือนว่างาน postgresql บางอย่างกำลังทำ> 10 บริบท swiches ต่อวินาที แต่ก็ไม่ได้รวมทั้งหมดถึง 20k

มีความคิดใดที่จะขุดลึกลงไปเพื่อคำตอบ?


สิ่งที่เกี่ยวกับ postgre ก็คือพวกเขาเป็น pid ต่างกันดังนั้นจึงเป็นโปรแกรมที่ต่างกันโดยสิ้นเชิง
Gopoi

คำตอบ:


5

กรณีที่ค่อนข้างน่าสนใจ watch -tdn1 cat /proc/interruptsลองสังเกต คุณเห็นการเปลี่ยนแปลงที่มีค่าหรือไม่


"Local timer interrupts" กำลังสร้างอินเตอร์รัปต์ไม่กี่ร้อย (200-800) บนแต่ละคอร์ของ CPU นั่นแปลว่าอะไร? นอกจากนี้ eth0-rx / tx กำลังสร้างอินเตอร์รัปต์บางอย่างเนื่องจากการรับส่งข้อมูลบนเซิร์ฟเวอร์นั้น แต่ก็ไม่มาก
grzaks

วิธี "ขัดจังหวะการเรียกใช้ฟังก์ชัน"?
poige


2

ในเวอร์ชั่นเคอร์เนลที่ใหม่กว่า

sudo perf record -e context-switches -a  # record the events

# then ctrl+c

sudo perf report # inspect the result

สิ่งนี้จะให้ผลลัพธ์ที่แน่นอนเกี่ยวกับเหตุการณ์การสลับบริบท

และคุณอาจพบว่าสาเหตุที่เกิดจากบริบท - สวิตช์โดยผนวก "-g" ธง (ผลการอ่านที่พิจารณาจากข้อมูลสัญลักษณ์)

sudo perf record -e context-switches -a -g

1

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

ที่กล่าวเพื่อนับจำนวนการสลับบริบทที่ทำ (กลายเป็นคำตอบของ stackoverflow.com) มันจะใช้คำสั่งเคอร์เนลภายใน () เพื่อเขียนลงในตารางกระบวนการ A ไม่มีสิ่งนั้นถ้าคุณตั้งโปรแกรมเคอร์เนลของคุณเองคุณจะสามารถมองเห็นได้ แต่มันค่อนข้างยาก


1
ดี. ฉันรู้ว่าการสลับบริบทคืออะไรและเกี่ยวข้องกับประสิทธิภาพของระบบอย่างไร ฉันแค่ต้องการวิธีในการวัดว่ามีการสลับบริบทจำนวนเท่าใดกับกระบวนการใดบน linux ฉันพบเคาน์เตอร์ csw แบบ raw แล้วใน / proc / * / stats (voluntary_ctxt_switches)
grzaks

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