มีคนอื่นที่ประสบปัญหาอัตรา Linux เซิร์ฟเวอร์ล่มในช่วงวันที่สองหรือไม่?


365

* หมายเหตุ: หากเซิร์ฟเวอร์ของคุณยังคงมีปัญหาเนื่องจากเคอร์เนลสับสนและคุณไม่สามารถรีบูทได้ - วิธีที่ง่ายที่สุดที่เสนอโดยติดตั้งวันที่ gnu บนระบบของคุณคือ: date -s now สิ่งนี้จะรีเซ็ตตัวแปร "time_was_set" ภายในของเคอร์เนลและแก้ไข CPU hogging futex ลูปใน java และเครื่องมือ userspace อื่น ๆ ฉันสั่งคำสั่งนี้ในระบบของฉันแล้วยืนยันว่ามันทำในสิ่งที่มันบอกในกระป๋อง *

การชันสูตรศพ

Anticlimax: สิ่งเดียวที่เสียชีวิตคือการเชื่อมโยง VPN (openvpn) ของฉันไปยังคลัสเตอร์ดังนั้นจึงมีช่วงเวลาที่น่าตื่นเต้นไม่กี่วินาทีในขณะที่สร้างขึ้นใหม่ ทุกอย่างอื่นดีและเริ่มต้นขึ้น ntp ไปอย่างหมดจดหลังจากการก้าวกระโดดครั้งที่สองผ่านไป

ฉันเขียนประสบการณ์เต็มรูปแบบของวันที่http://blog.fastmail.fm/2012/07/03/a-story-of-leaping-seconds/

ถ้าคุณดูบล็อกของ Marco ที่http://my.opera.com/marcomarongiu/blog/2012/06/01/an-humble-attempt-to-work-around-the-leap-second-เขามีทางออกสำหรับ การยุติการเปลี่ยนแปลงเวลาในช่วง 24 ชั่วโมงโดยใช้ ntpd -x เพื่อหลีกเลี่ยงการข้าม 1 วินาที นี่เป็นวิธีการทางเลือกอื่นในการรันโครงสร้างพื้นฐาน ntp ของคุณเอง


เพียงแค่วันนี้วันเสาร์ที่ 30 มิถุนายน 2555 - เริ่มในไม่ช้าหลังจากเริ่มต้นวัน GMT เรามีเซิร์ฟเวอร์จำนวนหนึ่งในดาต้าเซ็นเตอร์ที่แตกต่างกันซึ่งจัดการโดยทีมต่าง ๆ ทุกคนมืดมน - ไม่ตอบสนองต่อการปิงหน้าจอว่างเปล่า

พวกเขากำลังเรียกใช้ Debian Squeeze ทุกอย่างตั้งแต่เคอร์เนลสต็อกไปจนถึงบิลด์ 3.2.21 ที่กำหนดเอง ส่วนใหญ่เป็นเบลด Dell M610 แต่ฉันเพิ่งสูญเสีย Dell R510 และแผนกอื่น ๆ ก็สูญเสียเครื่องจักรจากผู้ขายรายอื่นเช่นกัน นอกจากนี้ยังมี IBM x3550 รุ่นเก่าที่ล้มเหลวและฉันคิดว่าอาจไม่เกี่ยวข้อง แต่ตอนนี้ฉันสงสัย

หนึ่งความผิดพลาดที่ฉันได้รับจากหน้าจอการถ่ายโอนข้อมูลกล่าวว่า

[3161000.864001] BUG: spinlock lockup on CPU#1, ntpd/3358
[3161000.864001]  lock: ffff88083fc0d740, .magic: dead4ead, .owner: imapd/24737, .owner_cpu: 0

น่าเสียดายที่เบลดทั้งหมดได้รับการกำหนดค่า kdump แต่พวกเขาก็ตายอย่างหนักจนไม่ได้เรียกใช้ kdump - และพวกเขาเปิดคอนโซล blanking ฉันได้ปิดการใช้งานคอนโซล blanking แล้วดังนั้นนิ้วข้ามฉันจะมีข้อมูลเพิ่มเติมหลังจากเกิดความผิดพลาดครั้งถัดไป

แค่อยากรู้ว่ามันเป็นเรื่องธรรมดาหรือ "แค่พวกเรา" เป็นเรื่องแปลกจริงๆที่หน่วยต่าง ๆ ในศูนย์ข้อมูลต่าง ๆ ซื้อในเวลาที่ต่างกันและดำเนินการโดยผู้ดูแลระบบที่ต่างกัน เครื่องจักรส่วนใหญ่ที่เกิดปัญหาขึ้นมาเป็นเวลาหลายสัปดาห์ / เดือนและใช้เมล็ด 3.1 หรือ 3.2

ความผิดพลาดครั้งล่าสุดเป็นเครื่องที่ใช้เวลาเพียงประมาณ 6 ชั่วโมงในการทำงาน 3.2.21

ผลงาน

ตกลงผู้คนนี่คือวิธีที่ฉันหลีกเลี่ยง

  1. ปิดใช้งาน ntp: /etc/init.d/ntp stop
  2. สร้างhttp://linux.brong.fastmail.fm/2012-06-30/fixtime.pl (รหัสที่ถูกขโมยจาก Marco ดูโพสต์บล็อกในความคิดเห็น)
  3. วิ่งfixtime.plโดยไม่มีข้อโต้แย้งเพื่อดูว่ามีการกระโดดครั้งที่สอง
  4. วิ่งfixtime.plด้วยการโต้แย้งเพื่อลบการกระโดดครั้งที่สอง

หมายเหตุ: adjtimexขึ้นอยู่กับ ฉันใส่สำเนาของadjtimexเลขฐานสองบีบที่http://linux.brong.fastmail.fm/2012-06-30/adjtimex - มันจะทำงานโดยไม่ต้องพึ่งพาระบบบีบ 64 บิต หากคุณวางไว้ในไดเรกทอรีเดียวกันกับfixtime.plมันมันจะถูกนำมาใช้หากไม่มีระบบ เห็นได้ชัดว่าถ้าคุณไม่มีบีบ 64- บิต ... ค้นหาของคุณเอง

ntpพรุ่งนี้ฉันจะเริ่มอีกครั้ง

ในฐานะที่เป็นผู้ใช้ที่ไม่ระบุชื่อ - ทางเลือกในการทำงานadjtimexคือเพียงแค่ตั้งเวลาด้วยตัวเองซึ่งน่าจะเป็นการล้างตัวนับ leapsecond


58
วันนี้มีการกระโดดครั้งที่สอง 30 ฉันลังเลที่จะบอกเป็นปัญหาของคุณ แต่ฉันจะเฝ้าดูเครื่อง Debian ของฉันอย่างใกล้ชิด
jscott

2
ตั้งแต่เช้าเราได้หายไปอย่างน้อย 9 กล่องบีบเดเบียนที่แตกต่างกันจากผู้ขายต่าง ๆ ทั้งหมดวิ่งบีบหุ้น 2.6.32 เคอร์เนล เรายังไม่ได้รับสามารถที่จะได้รับการถ่ายโอนข้อมูลความผิดพลาดเนื่องจากการปลอบใจ blanking เช่นกัน ...
kargig

3
lkml โพสต์เกี่ยวกับสิ่งนี้lkml.indiana.edu/hypermail/linux/kernel/1203.1/04598.html
Daniel S. Sterling

2
ขอบคุณที่รายงานสิ่งนี้! ตอนนี้ฉันกำลังจ้องมองเซิร์ฟเวอร์ของฉันอย่างใกล้ชิด
Janne Pikkarainen

5
ด้าย LKML ระบุว่าdate -s "`date`"ช่วยได้ - มันช่วยฉันได้อย่างแน่นอน
Pointy

คำตอบ:


321

สิ่งนี้เกิดจาก livelock เมื่อ ntpd เรียก adjtimex (2) เพื่อบอกเคอร์เนลให้แทรกวินาทีกระโดด ดูการโพสต์ lkml http://lkml.indiana.edu/hypermail/linux/kernel/1203.1/04598.html

Red Hat ควรอัพเดตบทความ KB ของพวกเขาด้วย https://access.redhat.com/knowledge/articles/15145

อัปเดต: Red Hat มีบทความ KB ที่สองสำหรับปัญหานี้ที่นี่: https://access.redhat.com/knowledge/solutions/154713 - บทความก่อนหน้านี้สำหรับปัญหาก่อนหน้านี้ที่ไม่เกี่ยวข้อง

วิธีแก้ไขคือปิด ntpd หาก ntpd ออกการเรียก adjtimex (2) แล้วคุณอาจต้องปิดการใช้งาน ntpd และเริ่มระบบใหม่เพื่อให้ปลอดภัย 100%

สิ่งนี้มีผลต่อ RHEL 6 และ distros อื่น ๆ ที่ใช้เมล็ดที่ใหม่กว่า (ใหม่กว่าประมาณ 2.6.26) แต่ไม่ใช่ RHEL 5

เหตุผลนี้เกิดขึ้นก่อนการกระโดดครั้งที่สองจะเกิดขึ้นจริงคือ ntpd ให้เคอร์เนลจัดการการกระโดดครั้งที่สองในเวลาเที่ยงคืน แต่ต้องแจ้งเตือนเคอร์เนลให้แทรกการกระโดดครั้งที่สองก่อนเที่ยงคืน ntpd จึงเรียก adjtimex (2) บางครั้งในระหว่างวันของ leap วินาที ณ จุดนี้จุดบกพร่องนี้จะถูกเรียก

หากคุณติดตั้ง adjtimex (8) คุณสามารถใช้สคริปต์นี้เพื่อพิจารณาว่าตั้งค่าสถานะ 16 ไว้หรือไม่ ค่าสถานะ 16 คือ "การแทรกการก้าวกระโดดครั้งที่สอง":

adjtimex -p | perl -p -e 'undef $_, next unless m/status: (\d+)/; (16 & $1) && print "leap second flag is set:\n"'

UPDATE:

Red Hat ได้อัปเดตบทความ KB ของพวกเขาเพื่อให้ทราบ: "ลูกค้า RHEL 6 อาจได้รับผลกระทบจากปัญหาที่ทราบที่ทำให้ NMI Watchdog ตรวจพบสถานะแฮงค์เมื่อได้รับการประกาศ leapsecond NTP ปัญหานี้กำลังได้รับการแก้ไขในเวลาที่เหมาะสม การประกาศ leapsecond และไม่พบปัญหานี้จากนั้นจะไม่มีผลกระทบอีกต่อไป "

ปรับปรุง: ภาษาข้างต้นถูกลบออกจากบทความ Red Hat; และโซลูชัน KB ที่สองถูกเพิ่มเข้ามาโดยมีรายละเอียดปัญหาความผิดพลาดของ adjtimex (2): https://access.redhat.com/knowledge/solutions/154713

อย่างไรก็ตามการเปลี่ยนรหัสในการโพสต์ LKML โดย IBM Engineer John Stultz อาจมีการหยุดชะงักเมื่อมีการใช้ leap วินาทีดังนั้นคุณอาจต้องการปิดใช้งาน leap วินาทีโดยการรีบูตหรือใช้ adjtimex (8) หลังจากปิดใช้งาน ntpd

การปรับปรุงครั้งสุดท้าย:

ฉันไม่มีเคอร์เนล dev แต่ฉันตรวจสอบแพทช์ของ John Stultz อีกครั้งที่นี่: https://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h = 6b43ae8a619d17c4935c3320d2ef9e92bdeed05d

ถ้าฉันอ่านมันในเวลานี้ฉันผิดเกี่ยวกับการหยุดชะงักอีกครั้งเมื่อมีการใช้งานการก้าวกระโดดครั้งที่สอง นั่นเป็นความเห็นของ Red Hat เช่นกันตามรายการ KB ของพวกเขา อย่างไรก็ตามหากคุณปิดใช้งาน ntpd ให้ปิดการใช้งานไว้เป็นเวลา 10 นาทีเพื่อไม่ให้คุณหยุดชะงักเมื่อ ntpd เรียก adjtimex (2)

เราจะตรวจสอบว่ามีข้อผิดพลาดอื่น ๆ อีกหรือไม่ :)

POST-LEAP อัปเดตครั้งที่สอง:

ฉันใช้เวลาสองสามชั่วโมงสุดท้ายอ่าน ntpd และ pre-patch (buggy) รหัสเคอร์เนลและในขณะที่ฉันอาจจะผิดมากฉันจะพยายามอธิบายสิ่งที่ฉันคิดว่าเกิดขึ้น:

ก่อนอื่น ntpd เรียก adjtimex (2) ตลอดเวลา มันทำเช่นนี้เป็นส่วนหนึ่งของ "clock loop filter" ซึ่งกำหนดไว้ใน local_clock ใน ntp_loopfilter.c คุณสามารถดูรหัสได้ที่นี่: http://www.opensource.apple.com/source/ntp/ntp-70/ntpd/ntp_loopfilter.c (จาก ntp เวอร์ชัน 4.2.6)

ตัวกรองลูปนาฬิกาทำงานค่อนข้างบ่อย - มันรันทุกครั้งที่ ntpd ทำการสำรวจเซิร์ฟเวอร์อัปสตรีมซึ่งตามค่าเริ่มต้นคือทุก ๆ 17 นาทีหรือมากกว่า บิตที่เกี่ยวข้องของตัวกรองลูปนาฬิกาคือ:

if (sys_leap == LEAP_ADDSECOND)
    ntv.status |= STA_INS;

แล้ว:

ntp_adjtime(&ntv)

กล่าวอีกนัยหนึ่งในวันที่มีวินาทีกระโดด ntpd ตั้งค่าสถานะ "STA_INS" และเรียก adjtimex (2) (ผ่าน portability-wrapper)

การเรียกระบบนั้นทำให้มันไปถึงเคอร์เนล นี่คือรหัสเคอร์เนลที่เกี่ยวข้อง: https://github.com/mirrors/linux/blob/a078c6d0e6288fad6d83fb6d5edd91ddb7b6ab33/kernel/time/ntp.c

เคอร์เนล codepath ประมาณนี้:

  • บรรทัด 663 - เริ่มต้นรูทีน do_adjtimex
  • บรรทัด 691 - ยกเลิกตัวจับเวลากระโดดวินาทีใด ๆ ที่มีอยู่
  • บรรทัด 709 - คว้า ntp_lock spinlock (ล็อคนี้เกี่ยวข้องกับความผิดพลาดของ livelock ที่เป็นไปได้)
  • บรรทัด 724 - เรียก process_adjtimex_modes
  • บรรทัด 616 - เรียก process_adj_status
  • บรรทัด 590 - ตั้งค่าตัวแปรโกลบอล time_status ตามแฟล็กที่ตั้งค่าในการเรียก adjtimex (2)
  • บรรทัด 592 - ตรวจสอบตัวแปรโกลบอล time_state ในกรณีส่วนใหญ่โทร ntp_start_leap_timer
  • บรรทัด 554 - ตรวจสอบตัวแปรโกลบอล time_status STA_INS จะถูกตั้งค่าดังนั้นให้ตั้งค่า time_state เป็น TIME_INS และโทร hrtimer_start (ฟังก์ชั่นเคอร์เนลอื่น) เพื่อเริ่มจับเวลาตัวจับเวลาครั้งที่สอง ในกระบวนการสร้างตัวจับเวลารหัสนี้จะคว้า xtime_lock หากสิ่งนี้เกิดขึ้นในขณะที่ CPU ตัวอื่นคว้า xtime_lock และ ntp_lock แล้วเคอร์เนลก็มีชีวิตชีวา นี่คือเหตุผลที่ John Stultz เขียนโปรแกรมแก้ไขเพื่อหลีกเลี่ยงการใช้ hrtimers นี่คือสิ่งที่ทำให้ทุกคนเดือดร้อนในวันนี้
  • บรรทัด 598 - หาก ntp_start_leap_timer ไม่ได้เริ่มตัวจับเวลากระโดดจริงตั้ง time_state เป็น TIME_OK
  • บรรทัดที่ 751 - สมมติว่าเคอร์เนลไม่ได้เป็นแบบหมุนได้สแต็กจะคลายออกและจะปล่อย ntp_lock spinlock

มีบางสิ่งที่น่าสนใจอยู่ที่นี่

อันดับแรกบรรทัด 691 ยกเลิกตัวจับเวลาที่มีอยู่ทุกครั้งที่เรียก adjtimex (2) จากนั้น 554 จะสร้างตัวจับเวลาอีกครั้ง ซึ่งหมายความว่าในแต่ละครั้งที่ ntpd เรียกใช้ตัวกรองลูปของนาฬิการหัส buggy จะถูกเรียกใช้

ดังนั้นฉันเชื่อว่า Red Hat ผิดเมื่อพวกเขาพูดว่าเมื่อ ntpd ตั้งค่าสถานะการก้าวกระโดดครั้งที่สองระบบจะไม่ผิดพลาด ฉันเชื่อว่าแต่ละระบบที่รัน ntpd มีศักยภาพในการหมุนทุก 17 นาที (หรือมากกว่า) เป็นระยะเวลา 24 ชั่วโมงก่อนการก้าวกระโดดครั้งที่สอง ฉันเชื่อว่านี่อาจอธิบายได้ว่าทำไมระบบจำนวนมากจึงล่ม โอกาสครั้งเดียวในการกระแทกจะมีโอกาสน้อยกว่ามากเมื่อเปรียบเทียบกับ 3 โอกาสต่อชั่วโมง

อัปเดต: ในโซลูชัน KB ของ Red Hat ที่https://access.redhat.com/knowledge/solutions/154713วิศวกรของ Red Hat ได้ข้อสรุปเดียวกัน (การรัน ntpd จะกดรหัส buggy อย่างต่อเนื่อง) และแน่นอนพวกเขาทำไปหลายชั่วโมงก่อนฉัน วิธีการแก้ปัญหานี้ไม่ได้เชื่อมโยงกับบทความหลักที่https://access.redhat.com/knowledge/articles/15145ดังนั้นฉันจึงไม่ได้สังเกตจนกว่าจะถึงตอนนี้

ประการที่สองนี่อธิบายว่าทำไมระบบที่โหลดมีแนวโน้มที่จะผิดพลาดมากกว่า ระบบที่โหลดจะจัดการกับอินเตอร์รัปต์มากขึ้นทำให้เรียกใช้ฟังก์ชันเคอร์เนล "do_tick" บ่อยขึ้นทำให้มีโอกาสมากขึ้นที่รหัสนี้จะเรียกใช้และคว้า ntp_lock ในขณะที่ตัวจับเวลาถูกสร้างขึ้น

ประการที่สามมีโอกาสที่ระบบจะหยุดทำงานเมื่อการกระโดดครั้งที่สองเกิดขึ้นจริงหรือไม่? ฉันไม่รู้แน่ชัด แต่อาจเป็นเพราะตัวจับเวลาที่ใช้ไฟและดำเนินการปรับการเผ่นวินาที (ntp_leap_second, บรรทัด 388) ยังคว้า ntp_lock spinlock และมีการเรียกไปยัง hrtimer_add_expires_ns ฉันไม่รู้ว่าการโทรนั้นอาจทำให้เกิดการเคลื่อนไหวได้หรือไม่ แต่ดูเหมือนจะเป็นไปไม่ได้

ในที่สุดสิ่งที่ทำให้การตั้งค่าเผ่นวินาทีถูกปิดใช้งานหลังจากเผ่นวินาทีทำงาน คำตอบที่นั่นคือ ntpd หยุดตั้งค่าสถานะเผ่นวินาทีในบางจุดหลังเที่ยงคืนเมื่อเรียก adjtimex (2) เนื่องจากไม่ได้ตั้งค่าสถานะการตรวจสอบที่บรรทัด 554 จะไม่เป็นจริงและจะไม่มีการสร้างตัวจับเวลาและบรรทัด 598 จะรีเซ็ตตัวแปรโกลบอล time_state เป็น TIME_OK สิ่งนี้อธิบายว่าทำไมถ้าคุณตรวจสอบการตั้งค่าสถานะด้วย adjtimex (8) หลังจากการกระโดดครั้งที่สองคุณจะยังคงเห็นชุดการตั้งค่าวินาทีที่ก้าวกระโดด

ในระยะสั้นคำแนะนำที่ดีที่สุดสำหรับวันนี้น่าจะเป็นคำตอบแรกที่ฉันได้รับ: ปิดการใช้งาน ntpd และปิดใช้งานการตั้งค่าสถานะเผ่นวินาที

และความคิดสุดท้าย:

  • ไม่มีผู้ขาย Linux รายใดที่สังเกตเห็นแพทช์ของ John Stultz และนำไปใช้กับเมล็ดของพวกเขา :(
  • ทำไม John Stultz ถึงไม่แจ้งเตือนผู้ขายบางรายว่าเป็นสิ่งจำเป็น? บางทีโอกาสของการเคลื่อนไหวดูเหมือนจะต่ำพอที่จะทำให้เสียงไม่ได้รับประกัน
  • ฉันได้ยินรายงานเกี่ยวกับกระบวนการของ Java ที่ล็อคหรือหมุนเมื่อมีการใช้งานการก้าวกระโดดครั้งที่สอง บางทีเราควรปฏิบัติตามคำแนะนำของ Google และคิดใหม่เกี่ยวกับวิธีการที่เราใช้ leap-วินาทีกับระบบของเรา: http://googleblog.blogspot.com/2011/09/time-technology-and-leaping-seconds.html

06/02 อัพเดตจาก John Stultz:

https://lkml.org/lkml/2012/7/1/203

โพสต์มีการเดินผ่านทีละขั้นตอนของเหตุผลที่ก้าวกระโดดครั้งที่สองทำให้ตัวนับ futex จะหมดอายุก่อนกำหนดและอย่างต่อเนื่อง spiking โหลด CPU


7
ขอบคุณสำหรับคำตอบที่ยอดเยี่ยม ดังนั้นเซิร์ฟเวอร์อื่น ๆ ของเรากำลังนั่งรอให้เกิดปัญหา น่ารัก เริ่มจากที่นี่เรามา!
Bron Gondwana

3
ฉันจะรู้ได้อย่างไรว่าสิ่งadjtimexนั้นได้รับการออกมาเคอร์เนลพิมพ์บางสิ่งในรูปแบบ dmesg หรือไม่? มีโอกาสใดบ้างที่ระบบที่ไม่ได้ทำงานผิดพลาดก่อนปิด ntpd off จะทำงานล้มเหลว
Hubert Kario

3
ฮิวเบิร์ต: เรียกใช้ "adjtimex" (โดยปกติจะเป็นแพคเกจแยกต่างหาก) และมองหาแฟล็ก 16 เพื่อระบุวินาทีกระโดดที่ค้างอยู่
Dominic Cleal

22
คุณจะเกลียดหมวกตัวแทน
Wesley

26
@WesleyDavid: ไม่ต้องกังวลหมวกตัวแทนจะรีเซ็ตในเวลาเที่ยงคืน UTC อาจจะ.
mmyers

33

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

/etc/init.d/ntp stop
ntpdate 0.us.pool.ntp.org
/etc/init.d/ntp start

สิ่งที่จำเป็นต้องมีก็คือรีเซ็ตนาฬิการะบบ Sheesh สิ่งที่ฉันได้รับรู้เมื่อหกชั่วโมงที่แล้ว


8
date -s "`date`"ทำงานให้ฉัน
Pointy

@DeanB: ฉันโพสต์เวลา 3:00 น. UTC ที่รีเซ็ตนาฬิกาทำเคล็ดลับโชคไม่ดีที่มันต้องใช้เวลาพอสมควรในการกลั่นกรอง เราเริ่มจากการรีบูทเซิร์ฟเวอร์ด้วย
Gregor

24

โปรแกรม C ทั่วไปที่ล้าง leap บิตที่สองในฟิลด์เวลาของเคอร์เนล:

#include <sys/timex.h>
#include <string.h>
#include <stdio.h>

int main(int argc, char **argv) {
    struct timex txc;
    int ret;

    (void) argc;
    (void) argv;

    bzero(&txc, sizeof(txc));
    txc.modes = 0;  /* fetch */
    ret = adjtimex(&txc);
    if (ret < 0) {
        perror("adjtimex (get)");
        return 1;
    }

    txc.modes = ADJ_STATUS;
    txc.status &= ~16;
    ret = adjtimex(&txc);
    if (ret < 0) {
        perror("adjtimex (set)");
        return 1;
    }

    return 0;
}

บันทึกเป็นlsec.cคอมไพล์ด้วยgcc -Wall -Wextra -o lsec lsec.cและรันเป็นรูท

คุณอาจต้องการหยุด ntpd ก่อนเรียกใช้และเริ่ม ntpd ใหม่หลังจากการกระโดดครั้งที่สอง


ทำอะไรได้(void) argc;บ้าง ปิดเสียงเตือนสำหรับตัวแปรที่ไม่ได้ใช้หรือไม่ จะไม่ใช้int main()สำเร็จเหมือนกันหรือไม่ ไม่พยายามที่จะเป็นคนอวดรู้ฉันอยากรู้อยากเห็นอย่างแท้จริง
gparent

18

โพสต์ข้อความสั้น ๆ ดูเหมือนว่า. / lsec ไม่มีผลกระทบ

สิ่งที่เราเห็นคือกระบวนการ softirqd จำนวนมากที่กินซีพียู (มักเป็นเส้นตรงกับโหลดของกระบวนการ java)

การแก้ไข POSTMORTEM ด้วย leap วินาทีที่นำไปใช้แล้วโดย ntp มีดังต่อไปนี้:

ดูเหมือนว่าเพียงพอที่จะออก:

export LANG="en_EN"; date -s "`date`"

สิ่งนี้ควรลดการโหลดโดยไม่ต้องรีสตาร์ทหรือรีบูต ntpd หรือคุณสามารถออก:

apt-get install ntpdate
/etc/init.d/ntpd stop; ntpdate pool.ntp.org; /etc/init.d/ntpd start

ทำไมsntp -sไม่ntpdate?
พัฒนาฝีมือดี

ntpdate เป็นเพียง wrapper เพื่อ sntp ที่นี่แน่นอนว่ามันดีที่จะใช้ ntpdate เช่นกัน
Gregor

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

ฉันเคยได้ยินรายงานที่คล้ายกันในการแก้ไขปัญหานี้เช่นกัน (เช่นการใช้date -s) ดูเหมือนว่าการแก้ไขจะต้องกำหนดเวลาของระบบแทนการแกว่ง (ค่าเริ่มต้นของพฤติกรรม ntpd เมื่อออฟเซ็ตมีขนาดเล็ก) ฉันคาดว่าการตั้งค่าเวลาจะทำให้กลไกการเก็บเวลาภายในของเคอร์เนลรีเซ็ตตัวเอง
แพทริค

4
การใช้งานจาวาแอป Java ของฉันถูกขัดขวางเช่นกัน (ด้วยเวลา CPU สูงที่ใช้เป็น softirqd) นี่ทำให้แก้ไขได้
Hubert Kario

16

http://my.opera.com/marcomarongiu/blog/2012/03/12/no-step-backดูเหมือนว่าจะแสดงว่าเคอร์เนลบีบ Debian จะไม่จัดการกับการกระโดดครั้งที่สอง

หัวข้อนี้ใน comp.protocols.tim.ntp เป็นที่สนใจเช่นกัน: https://groups.google.com/forum/?fromgroups#!topic/comp.protocols.time.ntp/KSflIgjUdPE

ที่กล่าวว่าการก้าวกระโดดครั้งที่สองยังไม่เกิดขึ้น: 23:59:60 UTC

ในที่สุดhttps://access.redhat.com/knowledge/articles/15145มีดังต่อไปนี้ที่จะพูดว่า: "เมื่อเผ่นวินาทีเกิดขึ้นเคอร์เนลพิมพ์ข้อความไปยังบันทึกระบบมีโอกาสที่จะพิมพ์ข้อความนี้ สามารถทำให้เคอร์เนลขัดข้องใน Red Hat Enterprise Linux "


แต่เคอร์เนล 3.2.21 ควรสันนิษฐานว่า - ซึ่งเป็นสิ่งที่อย่างน้อยหนึ่งในเครื่องที่ทำงานผิดพลาดกำลังทำงานอยู่
Bron Gondwana

ในบางเครื่องที่ Bron ระบุว่าเราได้เปิดตัวการแก้ไขที่ควรจัดการการก้าวกระโดดครั้งต่อไปอย่างถูกต้อง
Cosimo

คุณสามารถโพสต์แก้ไขที่ใดที่หนึ่งเพื่อให้ผู้อื่นสามารถตรวจสอบ / แนะนำแนวคิด / ลองได้หรือไม่
kargig

ฉันไม่มีการแก้ไข ... ฉันแค่รวบรวมข้อมูล บางทีควรจะใส่นี่เป็นความคิดเห็นกับคำถามเดิม
Luca Filipozzi

4
my.opera.com/marcomarongiu/blog/2012/06/01/…มีรายละเอียดเพิ่มเติมเกี่ยวกับการแก้ไข
Bron Gondwana
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.