Score:1

นาฬิกา POSIX ในเครื่องเสมือน "ของจริง" เป็นอย่างไร

ธง it

บทนำ:

เวลาคือ OS เช่น Linux โดยทั่วไปมาจากชิปนาฬิกา (RTC) หรือดูแลโดยซอฟต์แวร์โดยใช้การขัดจังหวะเป็นระยะหรือการลงทะเบียนฮาร์ดแวร์บางอย่าง (เช่น ตัวนับรอบ TSC ของ CPU) สำหรับการใช้งาน

เห็นได้ชัดว่าในเครื่องเสมือนไม่มีการเข้าถึงฮาร์ดแวร์โดยตรง (เช่น RTC) ดังนั้นการรักษาเวลาที่ถูกต้องอาจเป็นเรื่องยาก

ฉันสงสัยเป็นพิเศษเกี่ยวกับการใช้งานนาฬิกา POSIX สองรายการ: CLOCK_REALTIME และ CLOCK_MONOTONIC (มีมากขึ้น).

รบกวน

มี "การรบกวน" ที่สำคัญสองประการที่ฉันกำลังพิจารณา:

  1. "การใช้ CPU มากเกินไป": ให้ CPU เสมือนกับ VMs มากกว่าที่มีอยู่จริง
  2. "Live Migration": การย้าย VM จากเครื่องหนึ่งไปยังอีกเครื่อง "โดยไม่" ส่งผลกระทบต่อการทำงาน

ดำเนินการตามปกติ

กระบวนการที่ทำงานในระบบปฏิบัติการบนฮาร์ดแวร์เปล่าจะถูกขัดจังหวะโดยระบบปฏิบัติการเท่านั้น (ที่มีการควบคุมในขณะนั้น) ดังนั้นระบบปฏิบัติการจึงสามารถรักษาเวลาได้อย่างง่ายดาย

การทำงานของ VM

ระบบปฏิบัติการที่ทำงานใน VM ไม่มีการควบคุม CPU อย่างต่อเนื่อง ตัวอย่างเช่น หากระบบปฏิบัติการ "ไม่มี CPU" ระบบจะไม่สามารถประมวลผลการขัดจังหวะของตัวจับเวลาได้ ในทางกลับกัน อาจทำให้การขัดจังหวะตัวจับเวลาหายไปโดยสิ้นเชิง ล่าช้าตามจำนวนที่ดูเหมือนสุ่ม (jitter) หรืออาจประมวลผลตามลำดับอย่างรวดเร็ว (กำลังประมวลผลการขัดจังหวะ "ล่าช้า" ในตอนนี้) ในทำนองเดียวกันนาฬิกาจะไม่เดินเป็นเส้นตรงตามที่คาดไว้

ตัวเลือก

  • CLOCK_REALTIME: หากระบบปฏิบัติการไม่มี CPU นาฬิกาตามเวลาจริงอาจช้าลง (ไม่ทัน) หรือกระโดดไปข้างหน้าเป็นครั้งคราวเพื่อให้ทัน
  • CLOCK_MONOTONIC: หากระบบปฏิบัติการไม่มี CPU นาฬิกาตามเวลาจริงอาจช้าลง (เมื่อเทียบกับ VM หรือวอลล์ไทม์อื่น ๆ) หรือกระโดดไปข้างหน้าเป็นครั้งคราวเพื่อให้ทัน

ผลกระทบ

  • CLOCK_REALTIME: เห็นได้ชัดว่าหากนาฬิกาเรียลไทม์ช้า จะไม่สามารถใช้เป็นตัววัดเวลาที่แน่นอนได้ แต่จะดูสอดคล้องกันภายใน VM หากนาฬิกาเดินต่อไปโดยกระโดดไปข้างหน้าตามจำนวนเวลาที่ผันแปร อาจใช้เป็นการวัดแบบสัมบูรณ์ได้ แต่จะเป็นการไม่ดีสำหรับการวัดประสิทธิภาพ (ระยะเวลา) ภายใน VM
  • CLOCK_MONOTONIC: การเลื่อนสัญญาณนาฬิกาแบบโมโนโทนิกก็ต่อเมื่อ VM "มี CPU" จะให้มุมมองที่สอดคล้องกันของเวลาที่ผ่านไปภายใน VM การทำให้นาฬิกากระโดดไปข้างหน้าตามจำนวนเวลาที่ผันแปรจะป้องกันการใช้งานสำหรับการวัดประสิทธิภาพ (ระยะเวลา) ภายใน VM

การโยกย้ายสด

เมื่อการย้ายข้อมูลสดต้องมีการคัดลอก RAM กิกะไบต์จากโหนดหนึ่งไปยังอีกโหนดหนึ่ง จะมี "เวลาค้าง" เมื่อ VM ไม่สามารถทำงานได้ สมมติว่า 3 วินาที

ตอนนี้เรียลไทม์ควรกระโดดไปข้างหน้า 3 วินาทีด้วย หรือควรปล่อยให้สามวินาทีหายไปจนกว่าจะได้รับการแก้ไขด้วยตนเองหรือโดยอัตโนมัติในภายหลัง ในทำนองเดียวกันเมื่อนาฬิกา monotonic ถูกใช้เพื่อวัด "เวลาทำงาน" ควรใช้เวลาสามวินาทีนั้นในการพิจารณาด้วยการเพิ่มสิ่งเหล่านั้นหรือควรคำนึงถึงเวลาที่ VM มี CPU จริงๆ

CPU ที่คอมมิตมากเกินไป

เช่นเดียวกับด้านบน แต่มีความล่าช้าสั้น ๆ บ่อยกว่าแทนที่จะเป็นบางครั้งที่ใหญ่กว่า

คำถาม

Xen ใช้วิธีใด?

VMware จัดการกับสิ่งนั้นอย่างไร มีตัวเลือกที่กำหนดค่าได้หรือไม่? (ฉันรู้ว่าใน Xen VMs สามารถซิงค์จากไฮเปอร์ไวเซอร์หรือเรียกใช้โดยอิสระ (เช่น ซิงค์จากภายนอกโดยใช้ NTP))

มี "แนวทางปฏิบัติที่ดีที่สุด" หรือไม่?

Score:1
ธง jo

POSIX (และ Linux โดยทั่วไป) ไม่เคยรับประกันตัวจับเวลาจริงๆ ในแง่ที่ว่าถ้าคุณปล่อยให้บางอย่างเข้าสู่โหมดสลีป คุณสามารถคาดหวังให้ตัวจับเวลาตื่นในเวลาที่แน่นอนได้ คุณสามารถรับประกันได้ว่าการปลุกเกิดขึ้นหลังจากเวลาดังกล่าว ไม่ใช่ตามเวลานั้นและ ไม่เคย ไว้ก่อน*.

ลีนุกซ์ไม่ได้หมายถึงเรียลไทม์และพยายามอย่างเต็มที่

จาก ชาย 2 นาโนสลีป ซึ่งเป็นไปตาม POSIX:

nanosleep() ระงับการดำเนินการของเธรดการโทรจนกว่าจะมีอย่างใดอย่างหนึ่ง อย่างน้อย หมดเวลาที่ระบุใน *req หรือการส่งมอบ a สัญญาณที่ทริกเกอร์การเรียกใช้ตัวจัดการในเธรดการโทร หรือที่ยุติกระบวนการ

หากคุณคาดหวังว่าการทำเครื่องหมายจะเชื่อถือได้ แสดงว่าปัญหามีแนวโน้มสูงว่าคุณไม่มีฮิวริสติกในการจัดการสไลด์ภายในหน้าต่างที่กำหนด

คำแนะนำของฉันในที่นี้คือการคิดใหม่ว่าคุณออกแบบแอปพลิเคชันให้มีความน่าเชื่อถือน้อยลงในการปลุกที่แน่นอน หรือมีระบบป้องกันข้อผิดพลาดในกรณีที่เกิดความล่าช้าที่ไม่คาดคิด

เช่น

  • ซอฟต์แวร์ยกเลิกเนื่องจากความผิดปกติของความล่าช้าบางอย่าง
  • ซอฟต์แวร์บน Wakeup สังเกตเห็นความแตกต่างเมื่อเปรียบเทียบกับแหล่งเวลาที่เชื่อถือได้อื่น ๆ และ 'ก้าว' ความคิดในการปลุกครั้งต่อไปเพื่อชดเชย
  • คุณพิมพ์คำเตือนหรือแจ้งอย่างอื่น

ไม่น่าเป็นไปได้จริงๆ ที่จะคิดว่าเวลามีความน่าเชื่อถือในระบบที่ยึดครองได้ แม้แต่บนโลหะเปล่า

  • ไม่สามารถบล็อกการขัดจังหวะแบบไม่มาสก์ได้
  • ภาระงานสูงหมายความว่าคุณมีกำหนดการออกเป็นเวลานาน
  • การขัดจังหวะกับ CPU ที่เรียกโดยฮาร์ดแวร์อาจทำให้เกิดความล่าช้า
  • ข้อผิดพลาดเล็กน้อยและข้อผิดพลาดของเพจหลักอาจทำให้เกิดความล่าช้าอย่างมากระหว่างการปลุกตัวจับเวลา
  • การจัดสรรหน่วยความจำในธนาคารหน่วยความจำที่ไม่ได้เป็นเจ้าของโดย CPU จะเพิ่มความล่าช้า

นี่เป็นเพียงฟังก์ชั่นของการคำนวณ x86 สมัยใหม่

อย่างน้อยที่สุดบน KVM ก็มี clocksource ที่เรียกว่า 'kvm-clock' ซึ่งควรจะเป็นตัวแทนของเห็บจากไฮเปอร์ไวเซอร์พื้นฐาน โดยไม่คำนึงถึงความล่าช้าที่ไม่ทราบสาเหตุใน VM คุณสามารถค้นหาไฟล์นั้นและสิ่งที่คุณตั้งไว้ในเส้นทางนี้: /sys/devices/system/clocksource/clocksource*/current_clocksource และดูว่าตัวเลือกของคุณอยู่ที่ใด /sys/devices/system/clocksource/clocksource*/available_clocksource.

แต่อีกครั้ง โฮสต์พื้นฐานสามารถมีความล่าช้าได้เอง มันก็เลยเป็นแค่เต่าไปตลอดทาง..

อย่าพึ่งพาการรับประกันตามเวลาจริงที่ไม่มีอยู่จริง สร้างซอฟต์แวร์เพื่อรับมือกับความล่าช้าที่ไม่คาดคิดหรืออย่างน้อยก็รู้เรื่องเหล่านี้

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

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

บางทีคุณอาจตั้งค่า SLA ที่บอกว่าเวลาจะไม่ถูกต้อง 1 ตรวจใน 1000000 ตัวอย่าง นั่นคือ -- เป็นไปได้ แม้ว่าในทางสถิติไม่น่าเป็นไปได้ที่เห็บจะปิด

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


  • การใช้งานตัวจับเวลาบางอย่างใช้ตัวจัดการสัญญาณเพื่อดักจับเหตุการณ์ เช่น SIGALRM หากคุณส่งสัญญาณ ALRM นอกตัวจับเวลา มันจะตื่นก่อนเวลานั้น

  • ตำแหน่งที่ตั้งในที่นี้คือคอมพิวเตอร์ทุกเครื่องที่เกี่ยวข้องกันในทางตรรกะ ซึ่งทั้งหมดอาจอยู่ภายในเวลาไม่กี่มิลลิวินาทีภายในเครื่องอื่น แต่อาจแตกต่างกันอย่างมากระหว่างพื้นที่อื่น IE ซึ่งเป็นกลุ่มของระบบซึ่งมีความหน่วงแฝงที่ชาญฉลาด 500 มิลลิวินาที

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา