Context Switch มี "ปกติ" กี่ตัว (เป็นฟังก์ชั่นของแกนประมวลผล CPU (หรืออื่น ๆ ))


34

สวัสดี Linux / UNIX Overlords

มีผู้ใดในกฎของหัวแม่มือว่ามีการสลับบริบท (ต่อตัวประมวลผลหลัก) เป็นปกติบนเซิร์ฟเวอร์ Linux หรือไม่

วิทยาลัยของฉันที่นี่นำมันขึ้นมาและเขาก็เห็น 16K ใน 8-core x86_64เครื่อง

นี่คือสถิติบางส่วนจาก sarface ในช่วงสองสามวันที่ผ่านมา ...

ข้อความ alt แทน

และเพื่อดูสถิติการสร้างกระบวนการนี่เป็นมุมมองลอการิทึมของกราฟเดียวกัน ...

ข้อความแสดงแทน alt

และแกนทั้ง 8 ก็เบื่อจนตาย ...

ข้อความแสดงแทน alt

CS กับ IOwait (ระดับ x10000)

ข้อความแทน alt

ข้อมูลที่ไร้ประโยชน์มากขึ้นในกรณีที่มีคนถาม ..

  • ที่เก็บข้อมูลที่เซิร์ฟเวอร์ทำงานนั้นคือ 0.5TB SAN ผ่าน FC
  • มี RAM 8GB ส่วนใหญ่แคช - ไม่มีการแลกเปลี่ยน

1
ในช่วงเวลาใด?
dmckee

คุณมีความเฉพาะเจาะจงมากขึ้นเกี่ยวกับปริมาณงานหรือไม่
dmo

1
คุณสร้างกราฟนั้นได้อย่างไร ดูดีจริงๆ!
แอนทอน Benkemoun

สวัสดี Antoine - กราฟทำจาก sarface ( projects.autonomy.net.au/sarface )
Xerxes

ลิงค์ของกราฟนั้นตายไปแล้ว @ Xerxes คุณสามารถไปจากที่ไหนสักแห่ง?
törzsmókus

คำตอบ:


25

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

การเรียกระบบ

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

เมื่อเราดูคำจำกัดความของการเขียน (2) syscall จาก Linux สิ่งนี้จะชัดเจนมาก:

ชื่อ
       เขียน - เขียนไปยังไฟล์อธิบาย

สรุป
       #include 

       ssize_t write (int fd, void const * buf, นับ size_t);

รายละเอียด
       write () เขียนจนถึงจำนวนไบต์จากบัฟเฟอร์ที่ชี้ buf ไปยังไฟล์
       อ้างอิงโดยไฟล์ descriptor fd [ .. ]

คืนค่า
       ในความสำเร็จจำนวนของไบต์ที่ถูกเขียนจะถูกส่งกลับ (ศูนย์หมายถึง
       ไม่มีอะไรเขียน) ข้อผิดพลาดจะถูกส่งกลับ -1 และตั้ง errno
       อย่างเหมาะสม.
       [ .. ]

นี่เป็นการบอกให้เคอร์เนลรับช่วงการทำงานจากโปรเซสเลื่อนขึ้นเป็นcountไบต์เริ่มจากที่อยู่หน่วยความจำที่ชี้*bufไปยังไฟล์ descriptor fdของโปรเซสปัจจุบันแล้วกลับไปที่โพรเซสและบอกเขาว่ามันไปอย่างไร

เป็นตัวอย่างที่ดีในการแสดงนี้เป็นเกมเซิร์ฟเวอร์ทุ่มเทสำหรับการเล่นเกมตามวาล์วมาHLDS http://nopaste.narf.at/f1b22dbc9แสดง syscalls มูลค่าหนึ่งวินาทีที่ทำโดยอินสแตนซ์เดียวของเซิร์ฟเวอร์เกมที่ไม่มีผู้เล่นอยู่ กระบวนการนี้ใช้เวลา CPU ประมาณ 3% ใน Xeon X3220 (2.4Ghz) เพียงเพื่อให้คุณรู้สึกว่าราคาแพงแค่ไหน

multi-tasking

แหล่งที่มาของการสลับบริบทอาจเป็นกระบวนการที่ไม่ได้ทำ syscalls แต่ต้องย้ายออกจาก CPU ที่กำหนดเพื่อให้มีที่ว่างสำหรับกระบวนการอื่น

เป็นวิธีที่ดีที่จะเห็นภาพนี้เป็นcpuburn cpuburn ไม่ได้ทำ syscalls ใด ๆ มันทำซ้ำมากกว่าหน่วยความจำของตัวเองดังนั้นจึงไม่ควรทำให้เกิดการสลับบริบท

ใช้เครื่องที่ไม่ได้ใช้งานเริ่ม vmstat จากนั้นเรียกใช้ burnMMX (หรือการทดสอบอื่น ๆ จากแพ็คเกจ cpuburn) สำหรับซีพียูคอร์ทุกเครื่องที่มี คุณควรจะมีการใช้ประโยชน์จากระบบอย่างเต็มที่ แต่ก็ไม่ได้มีการสลับบริบทเพิ่ม จากนั้นลองเริ่มกระบวนการเพิ่มเติมอีกสองสามครั้ง คุณจะเห็นว่าอัตราการสลับบริบทเพิ่มขึ้นเมื่อกระบวนการเริ่มแข่งขันกับแกนประมวลผลของ CPU จำนวนของการสลับขึ้นอยู่กับอัตราส่วนของกระบวนการ / คอร์และความละเอียดมัลติทาสกิ้งของเคอร์เนลของคุณ

อ่านเพิ่มเติม

linfo.org มีเขียนขึ้นมีความสุขกับสิ่งที่สวิทช์บริบทและสายระบบมี Wikipediaมีข้อมูลทั่วไปและคอลเลกชันลิงค์ที่ดีในการโทรของระบบ


1
สิ่งนี้มีประโยชน์ - คุณให้ความคิดที่ดีแก่ฉัน! =)
Xerxes

1
คำสั่งของคุณSystem calls cause context switches by their very own natureดูเหมือนผิด การเรียกระบบทำให้เกิดการสลับโหมดตามที่ระบุไว้โดยlinfo.org/context_switch.html
Nicolas Labrot

6

เว็บเซิร์ฟเวอร์ที่โหลดมาพอสมควรตั้งอยู่ที่ประมาณ 100-150 สวิตช์เป็นเวลาเกือบสองวินาทีโดยมียอดเขาเป็นพัน

อัตราการสลับบริบทที่สูงไม่ใช่ปัญหา แต่พวกเขาอาจชี้ให้เห็นถึงปัญหาที่สำคัญกว่า

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

อีกทางเลือกหนึ่งถ้าคุณใช้ X ลองวางลงในโหมดคอนโซล

แก้ไขอีกครั้ง: ที่ 16k cs ต่อวินาทีแต่ละ cpu จะเฉลี่ยสองสวิตช์ต่อมิลลิวินาที - นั่นคือครึ่งถึงหนึ่งในหกของช่วงเวลาปกติ เขาสามารถใช้งาน IO ที่ถูกผูกไว้กับเธรดได้ไหม?

แก้ไขโพสต์กราฟอีกครั้ง: ดูเหมือนว่าผูกไว้กับ IO ระบบใช้เวลาส่วนใหญ่ใน SYS เมื่อสวิตช์บริบทมีค่าสูงหรือไม่

แก้ไขอีกครั้ง: iowait สูงและระบบในกราฟสุดท้าย - บดบังพื้นที่ผู้ใช้โดยสมบูรณ์ คุณมีปัญหา IO
คุณใช้การ์ด FC อะไร

แก้ไข: hmmm มีโอกาสที่จะได้รับเกณฑ์มาตรฐานบางอย่างที่เกิดขึ้นกับการเข้าถึง SAN ของคุณด้วย bonnie ++ หรือ dbench ในช่วงเวลาที่ไม่ดี? ฉันสนใจที่จะดูว่าพวกเขามีผลลัพธ์ที่คล้ายกันหรือไม่

แก้ไข: เคยคิดเกี่ยวกับเรื่องนี้ในช่วงสุดสัปดาห์และฉันเคยเห็นการใช้งานที่คล้ายกันเมื่อ Bonnie กำลังทำ "pass byte by a time" นั่นอาจอธิบายได้ว่ามีการสลับสับเปลี่ยนจำนวนมากเนื่องจากการเขียนแต่ละครั้งจะต้องมี syscall แยกต่างหาก


ฉันยังไม่มั่นใจว่าอัตราสวิทช์บริบทสูงไม่ใช่ปัญหาฉันกำลังพูดถึงสูงถึง 4K ถึง 16K ไม่ใช่ 100-150
Xerxes

เซิร์ฟเวอร์ของเราไม่มี X ใด ๆ ที่ฉันเห็นด้วยกับคุณเกี่ยวกับปัญหาการรอคอยของ IO และความสัมพันธ์ระหว่างสิ่งนั้นกับ CS การ์ด HBA นั้นไม่น่าสงสัยเลยว่าเพราะเราใช้การ์ดเดียวกันกับเซิร์ฟเวอร์อื่น ๆ กว่าร้อยข้อสรุปคือฉันโทษทีม SAN ที่เส็งเคร็ง EVA SAN ที่พวกเขาพยายามและปกป้องอยู่ตลอดเวลา โปรดทราบว่าการรอคอย IO สูงนั้นไม่ใช่เหตุผลที่จะต้องตื่นตัวเสมอไปหากกระบวนการส่วนใหญ่ในเครื่องนั้นผูกไว้กับ IO ก็คาดว่าเซิร์ฟเวอร์จะไม่มีอะไรดีไปกว่าการหมุนรอบเดินเบา
Xerxes

แม้ว่าในครั้งที่สอง - กราฟที่ 4 ที่แนบมาแสดงว่ามันไม่ใกล้เคียงกับที่ฉันคิดไว้ในตอนแรก ไม่ว่าจะเป็นอุปราคาแน่นอน ฉันยังคงโทษว่า SAN =)
Xerxes

1

ฉันมีแนวโน้มที่จะกังวลเกี่ยวกับอัตราการใช้ CPU ของสถานะระบบ หากใกล้ถึง 10% หรือสูงกว่านั่นหมายความว่าระบบปฏิบัติการของคุณใช้เวลามากเกินไปในการสลับบริบทแม้ว่าการย้ายบางกระบวนการไปยังเครื่องอื่นช้ากว่ามากก็สมควรที่จะทำเช่นนั้น


1

สิ่งนี้เป็นสาเหตุที่คุณควรพยายามรักษามาตรฐานประสิทธิภาพการทำงานสำหรับเซิร์ฟเวอร์ของคุณ ด้วยวิธีนี้คุณสามารถเปรียบเทียบสิ่งที่คุณสังเกตเห็นได้ทันทีกับสิ่งที่คุณบันทึกไว้ในอดีต

ที่กล่าวว่าฉันมีเซิร์ฟเวอร์ที่ใช้งาน (ส่วนใหญ่ไม่ได้ยุ่งกับเซิร์ฟเวอร์ของออราเคิล) ซึ่งมีความเสถียรประมาณ 2k และมีค่าสูงสุด 4k สำหรับเซิร์ฟเวอร์ของฉันนั่นเป็นเรื่องปกติสำหรับเซิร์ฟเวอร์ของผู้อื่นที่อาจต่ำหรือสูงเกินไป

ไกลแค่ไหนที่คุณสามารถย้อนกลับไปในข้อมูลของคุณ?

ข้อมูล CPU ชนิดใดที่คุณให้กับเรา


ฉันเห็นด้วยอย่างแน่นอนกับการรักษาข้อมูลพื้นฐานและเรามีข้อมูล nagios ที่จะกลับมาเป็นเวลานาน - ปัญหาของเซิร์ฟเวอร์นี้คือมันเป็นเลือดใหม่ - อยู่แค่ช่วงสั้น ๆ เท่านั้น นอกจากนี้ยังใช้งานซอฟต์แวร์ระดับองค์กร (อ่าน: อึ) - Teamsite - เพียงเพื่อเพิ่มไปยังรายการตัวแปรที่ไม่ได้กำหนด ฉันยังคงชอบ sar (การตั้งค่าส่วนตัว) ดังนั้นฉันจะกำหนดค่าให้มากกว่าค่าเริ่มต้น (2 สัปดาห์) และดูว่ามันจะไปอย่างไร
Xerxes

การใช้ sar ร่วมกับ rrdtool (ซึ่งดูเหมือนว่ากราฟของคุณมาจาก) อาจเป็นวิธีที่ง่ายในการเก็บข้อมูลของคุณ (หรืออย่างน้อยก็บทคัดย่อของมัน) เป็นเวลานาน
wzzrd

0

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


6
อันที่จริงค่าใช้จ่ายของสวิทช์บริบทคือมีราคาแพง นี่เป็นสิ่งที่แย่ที่สุดในเครื่องเสมือน - เราทำการทดสอบเมื่อไม่กี่เดือนที่ผ่านมาซึ่งแสดงให้เห็นว่าหนึ่งในสาเหตุที่ใหญ่ที่สุดของประสิทธิภาพของ VM คือการเปลี่ยนบริบท
Xerxes

ในความเป็นจริงในระบบปฏิบัติการสมัยใหม่ (มัลติทาสกิ้ง) การย่อขนาดของการสลับบริบทเป็นงานการปรับให้เหมาะสมที่สำคัญที่สุด คุณมีแหล่งข้อมูลใดบ้างเพื่อสำรองการอ้างสิทธิ์ว่ามีค่าใช้จ่ายน้อย
Xerxes

ขออภัยคุณกำลังพูดถึงการลดการสลับบริบทจากมุมมองของการพัฒนาระบบปฏิบัติการ ฉันไม่มีความเห็นเกี่ยวกับประโยชน์ของการออกแบบระบบเพื่อลด CS :) หากคุณกำลังพูดถึงการลดการสลับบริบทบนเซิร์ฟเวอร์ปัญหาก็คือการลดบริบทสวิตช์ทำให้เกิดความล่าช้าในที่อื่น ๆ EG ลดจำนวนกระบวนการในเครื่องหมายความว่าคุณต้องย้ายกระบวนการเหล่านี้ไปยังเครื่องอื่นซึ่งหมายความว่าการสื่อสารเกิดขึ้นผ่านเครือข่ายซึ่งช้ากว่ามาก !
Alex J

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