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 มิลลิวินาที