سؤال أي شخص آخر يعاني من معدلات عالية من خادم لينكس تعطل خلال قفزة في اليوم الثاني؟


* ملاحظة: إذا كان الخادم الخاص بك لا يزال يعاني من مشاكل بسبب حيرة الخلط ، ولا يمكنك إعادة التشغيل - الحل الأبسط المقترح مع تاريخ gnu المثبّت على نظامك هو: date-s الآن. سيؤدي هذا إلى إعادة ضبط متغير "time_was_set" الداخلي الخاص بالنواة وإصلاح حلقات futex الخاصة بعملية الاستغناء عن وحدة المعالجة المركزية في جافا وأدوات المستخدمين الأخرى. لقد استقرت هذا الأمر على نظام بلدي وأكد أنه يفعل ما يقول على القصدير *

تشريح

Anticlimax: الشيء الوحيد الذي مات هو رابط VPN (openvpn) الخاص بي إلى المجموعة ، لذلك كان هناك بضع ثوانٍ مثيرة أثناء إعادة تأسيسها. كل شيء آخر كان على ما يرام ، وبدأت ntp نظيفة بعد مرور ثانية قفزة.

لقد كتبت خبرتي الكاملة في اليوم في http://blog.fastmail.fm/2012/07/03/a-story-of-leaping-seconds/

إذا نظرت إلى مدونة ماركو على http://my.opera.com/marcomarongiu/blog/2012/06/01/an-humble-attempt-to-work-around-the-leap-second - لديه حل للتأقلم مع تغيير الوقت على مدار 24 ساعة باستخدام ntpd -x لتجنب تخطي ثانية واحدة. هذه طريقة تلطيخ بديلة لتشغيل البنية التحتية الخاصة بك ntp.


اليوم فقط ، السبت 30 يونيو 2012 - يبدأ بعد وقت قصير من بدء اليوم بتوقيت جرينتش. كان لدينا عدد قليل من الخوادم في مراكز البيانات المختلفة كما تدار من قبل فرق مختلفة كل مظلم - لا يستجيب إلى الأصوات ، شاشة فارغة.

انهم جميعا يديرون Debian Squeeze - مع كل شيء من نواة الأوراق المالية إلى بنيات مخصصة 3.2.21. معظمها هي شفرات M610 من Dell ، ولكنني فقدت أيضًا جهاز 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 - وكان يتم تشغيل لوحة المفاتيح. لقد عطلت تعتيم وحدة التحكم الآن ، لذا عبرت الأصابع المزيد من المعلومات بعد التعطل التالي.

فقط أريد أن أعرف ما إذا كان موضوعًا مشتركًا أم "لنا فقط". من الغريب حقًا أن تكون وحدات مختلفة في مراكز بيانات مختلفة يتم شراؤها في أوقات مختلفة ويتم تشغيلها بواسطة مشرفين مختلفين (أقوم بتشغيل FastMail.FM) ... وحتى الآن أجهزة بائع مختلفة. معظم الآلات التي تحطمت كانت قد ارتفعت لأسابيع / شهور وكانت تشغل حبات 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 هي فقط ضبط الوقت بنفسك ، والذي يفترض أيضًا أن يقوم بإلغاء تحديد العداد للقفص.


366
2018-06-30 16:15


الأصل


هناك قفزة ثانية اليوم ، الثلاثين. أنا متردد في الإشارة إلى أن هذه مشكلتك ، لكنني سأراقب أجهزة ديبيان الخاصة بي عن كثب. - jscott
منذ الصباح لقد فقدنا 9 صناديق ضغط ديبيان مختلفة على الأقل من مختلف الباعة الذين يضغطون كلهم ​​على 2.6.32 نواة. لم نتمكن من الحصول على تفريغ أعطال بسبب غلق وحدة التحكم أيضًا ... - kargig
نشر lkml حول هذا الموضوع lkml.indiana.edu/hypermail/linux/kernel/1203.1/04598.html - Daniel S. Sterling
شكرا على الإبلاغ عن هذا! أنا الآن أحدق في خوادمي عن كثب. - Janne Pikkarainen
وأشار الخيط LKML ذلك date -s "`date`" يساعد - ساعدني بالتأكيد. - Pointy


الأجوبة:


يحدث هذا بسبب livelock عندما تقوم ntpd باستدعاء adjtimex (2) لإعلام kernel بإدخال ثانية كبيسة. انظر نشر lkml http://lkml.indiana.edu/hypermail/linux/kernel/1203.1/04598.html

يجب على Red Hat أيضًا تحديث مقالة KB الخاصة بهم أيضًا. https://access.redhat.com/knowledge/articles/15145

UPDATE: يحتوي Red Hat على مقالة KB ثانية فقط لهذه المشكلة هنا: https://access.redhat.com/knowledge/solutions/154713 - المقالة السابقة لمشكلة سابقة غير ذات صلة

العمل حوله هو مجرد إيقاف NTDD. إذا أصدرت ntpd بالفعل استدعاء adjtimex (2) ، فقد تحتاج إلى تعطيل ntpd وإعادة التشغيل لتكون آمنة 100٪.

يؤثر هذا على RHEL 6 وغيرها من التوزيعات التي تقوم بتشغيل أحدث النواة (الأحدث من 2.6.26 تقريبًا) ، ولكن ليس RHEL 5.

سبب هذا يحدث قبل في الواقع ، من المفترض أن يحدث ntpd في المرة الثانية للقفزة ، بحيث تسمح لل kernel بالتعامل مع الثواني الكبيسة عند منتصف الليل ، ولكنها تحتاج إلى تنبيه النواة لإدخال الثواني الكبيسة قبل منتصف الليل. NTDD لذلك يدعو adjtimex (2) في وقت ما خلال يوم ثانية من الكيب ، وعند هذه النقطة يتم تشغيل هذا الخطأ.

إذا كان لديك adjtimex (8) مثبتًا ، يمكنك استخدام هذا البرنامج النصي لتحديد ما إذا تم تعيين علامة 16. العلم 16 "إدراج ثانية كبيسة":

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

تحديث:

قامت شركة Red Hat بتحديث مقالة كيلوبايت الخاصة بها للإشارة إلى ما يلي: "قد يتأثر عملاء RHEL 6 بمشكلة معروفة تتسبب في قيام NMI Watchdog باكتشاف حالة تعليق عند تلقي الإعلان الوثائقي NTP. تتم معالجة هذه المشكلة في الوقت المناسب. إذا تلقت الأنظمة الخاصة بك إعلان leapsecond ولم تواجه هذه المسألة ، ثم لم تعد تتأثر ".

استكمال: تمت إزالة اللغة المذكورة أعلاه من مقالة ريد هات. وتمت إضافة حل كيلوبايت ثانية بالتفصيل في مسألة تعطل adjtimex (2): https://access.redhat.com/knowledge/solutions/154713

ومع ذلك ، فإن تغيير الرمز في مشاركة LKML بواسطة IBM Engineer John Stultz قد يكون هناك أيضًا حالة توقف تام عندما يتم تطبيق الثانية الكبيسة فعليًا ، لذا قد تحتاج إلى تعطيل ثانية كبيسة عن طريق إعادة التشغيل أو استخدام adjtimex (8) بعد تعطيل ntpd.

تحديث نهائي:

حسنًا ، أنا لا أجد نواة ، لكني راجعت تصحيح جون ستولتز مرة أخرى هنا: https://git.kernel.org/؟p=linux/kernel/git/torvalds/linux-2.6.git؛a=commit؛h=6b43ae8a619d17c4935c3320d2ef9e92bdeed05d

إذا كنت أقرأها بشكل صحيح هذه المرة ، فقد كنت مخطئًا في أن يكون هناك طريق مسدود آخر عندما يتم تطبيق الثواني الكبيسة. يبدو أن هذا هو رأي ريد هات أيضًا ، استنادًا إلى إدخالها على KB. ومع ذلك ، إذا قمت بتعطيل ntpd ، فقم بتعطيله لمدة 10 دقائق أخرى ، بحيث لا تصل إلى حالة توقف تام عند استدعاء ntpd adjtimex (2).

سنعرف ما إذا كان هناك المزيد من الأخطاء قريبا :)

POST-LEAP SECOND UPDATE:

قضيت الساعات القليلة الماضية في القراءة من خلال رمز ntpd وما قبل التصحيح (buggy) ، وعلى الرغم من أنني قد أكون مخطئًا جدًا هنا ، فسأحاول شرح ما أعتقد أنه يحدث:

أولا ، المكالمات ntpd adjtimex (2) في كل وقت. يقوم بذلك كجزء من "تصفية حلقة الساعة" الخاصة به ، المعرّفة في 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) (عبر غلافه القابل للتنقل).

هذا الاتصال النظام يجعل طريقها إلى النواة. إليك رمز النواة المعني: https://github.com/mirrors/linux/blob/a078c6d0e6288fad6d83fb6d5edd91ddb7b6ab33/kernel/time/ntp.c

codepath النواة هو تقريبا هذا:

  • خط 663 - بداية روتين do_adjtimex.
  • السطر 691 - قم بإلغاء أي جهاز ضبط مؤقت للقفزة الثانية.
  • سطر 709 - انتزاع spinlock ntp_lock (هذا القفل متورط في تعطل Liveel المحتمل)
  • السطر 724 - استدعاء process_adjtimex_modes.
  • سطر 616 - استدعاء process_adj_status.
  • السطر 590 - المتغير العام time_status set ، بناء على الأعلام المحددة في استدعاء adjtimex (2)
  • 592 - تحقق من متغير عام time_state. في معظم الحالات ، اتصل بـ ntp_start_leap_timer.
  • سطر 554 - تحقق من المتغير العام time_status. سيتم تعيين STA_INS ، لذا اضبط time_state على TIME_INS واتصل hrtimer_start (وظيفة kernel أخرى) لبدء المؤقت الثاني للقفزة. في عملية إنشاء جهاز ضبط وقت ، يمسك هذا الرمز xtime_lock. إذا حدث هذا في حين أمسك وحدة المعالجة المركزية الأخرى بالفعل xtime_lock و و ntp_lock ، ثم livelocks النواة. هذا هو السبب في أن جون ستولتز كتب الرقعة لتجنب استخدام hrtimers. هذا ما كان يسبب متاعب الجميع اليوم.
  • سطر 598 - إذا لم يبدأ ntp_start_leap_timer بالفعل في تشغيل مؤقت كبيسة ، فعليك تعيين time_state على TIME_OK
  • خط 751 - على افتراض أن kernel لا livelock ، يتم مسح بنية تخزين العناصر ثم يتم تحرير spainlock ntp_lock.

هناك بضعة أشياء مثيرة للاهتمام هنا.

أولاً ، يلغي سطر 691 جهاز ضبط الوقت الحالي في كل مرة يتم استدعاء adjtimex (2). ثم ، 554 إعادة إنشاء هذا الموقت. وهذا يعني أنه في كل مرة كان ntpd يدير مرشح حلقة الساعة ، تم استدعاء رمز buggy.

لذلك أعتقد أن ريد هات كانت خاطئة عندما قالوا أنه بمجرد أن يضع ntpd العلم الثاني ، لن ينهار النظام. وأعتقد أن كل نظام تشغيل NTDD لديه القدرة على livelock كل 17 دقيقة (أو أكثر) لمدة 24 ساعة قبل قفزة الثانية. أعتقد أن هذا قد يفسر سبب انهيار العديد من الأنظمة ؛ من المحتمل أن تكون فرصة التحطم لمرة واحدة أقل بكثير مقارنة بـ 3 فرص في الساعة.

استكمال: في ريد كابس حل في https://access.redhat.com/knowledge/solutions/154713 جاء مهندسو Red Hat إلى الاستنتاج نفسه (سيؤدي تشغيل ntpd باستمرار إلى رمز buggy). وبالفعل فعلوا ذلك قبل عدة ساعات من ذلك. لم يكن هذا الحل مرتبطًا بالمادة الرئيسية في https://access.redhat.com/knowledge/articles/15145 ، لذلك لم ألاحظ ذلك حتى الآن.

ثانيًا ، هذا يفسر سبب احتمال انهيار الأنظمة المحملة. ستتعامل الأنظمة المحملة مع مقاطعات أكثر ، مما يؤدي إلى استدعاء وظيفة "do_tick" kernel أكثر في كثير من الأحيان ، مما يمنح فرصة أكبر لتشغيل هذا الرمز والاستيلاء على ntp_lock أثناء إنشاء المؤقت.

ثالثًا ، هل هناك احتمال لتعطل النظام عند حدوث قفزة ثانية؟ أنا لا أعرف على وجه اليقين ، ولكن ربما نعم ، لأن الموقت الذي يشعل وينفذ في الواقع التعديل قفزة الثانية (ntp_leap_second ، على خط 388) أيضا الاستيلاء على spinlock ntp_lock ، ولديه دعوة ل hrtimer_add_expires_ns. لا أعرف ما إذا كانت هذه المكالمة قد تكون أيضًا قادرة على إحداث مهارة للعيش ، لكن هذا لا يبدو مستحيلاً.

وأخيراً ، ما الذي يؤدي إلى تعطيل علامة leap-second بعد تشغيل leap-second؟ الجواب هناك ntpd توقف تعيين العلم قفزة الثانية في مرحلة ما بعد منتصف الليل عندما يدعو adjtimex (2). نظرًا لعدم تعيين العلامة ، لن يكون التحقق على الخط 554 صحيحًا ، ولن يتم إنشاء أي موقت ، وسيؤدي الخط 598 إلى إعادة تعيين المتغير الشامل time_state إلى TIME_OK. هذا ما يفسر لماذا إذا قمت بالتحقق من العلامة بـ adjtimex (8) بعد ثانية كبيسة ، ستظل ترى علامة قفزة ثانية.

باختصار ، يبدو أن أفضل نصيحة اليوم هي أول ما قدمته بعد كل شيء: قم بتعطيل ntpd ، وقم بتعطيل علامة قفزة ثانية.

وبعض الأفكار النهائية:

  • لم يلاحظ أي من موردي لينوكس رقعة جون ستولتز وقاموا بتطبيقها على حباتهم :(
  • لماذا لم ينبه جون ستولتز إلى بعض البائعين؟ ربما يبدو أن فرصة الحياة المنخفضة منخفضة بشكل كافٍ مما يجعل الضوضاء غير مضمونة.
  • لقد استمعت إلى تقارير عن عمليات جافا تمنع أو تدور عندما تم تطبيق الثواني الكبيسة. ربما يجب علينا اتباع قيادة Google وإعادة التفكير في كيفية تطبيق الثواني الكبيسة على أنظمتنا: http://googleblog.blogspot.com/2011/09/time-technology-and-leaping-seconds.html

06/02 Update من جون ستولتز:

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

تضمنت الرسالة خطوة بخطوة حول السبب وراء تسبب الثواني الكبيسة في انتهاء صلاحية أجهزة ضبط توقيتات البورصة قبل الأوان وبصورة مستمرة ، مما يؤدي إلى زيادة حمولة وحدة المعالجة المركزية.


322
2018-06-30 19:56



شكرا على الجواب الممتاز. لذا فإن بقية خوادمنا تجلس في انتظار الانهيار. جميل. إعادة تشغيل المتداول هنا نأتي! - Bron Gondwana
كيف أعرف ما إذا كان adjtimex صدر ، هل تطبع النواة شيئًا في dmesg؟ ما فرصة وجود نظام يتعطل قبل أن يتحول إلى ntpd سيتعطل؟ - Hubert Kario
هوبير: تشغيل "adjtimex" (عادة ما يتم حزمها بشكل منفصل) والبحث عن العلم 16 للإشارة إلى قفزة في الانتظار. - Dominic Cleal
أنت ستكره الغطاء - Wesley
WesleyDavid: لا تقلق ، سيتم إعادة تعيين قيمة الحد الأقصى للقيمة في UTC منتصف الليل. يمكن. - mmyers


هذا ضربنا بقوة. بعد إعادة تشغيل العديد من مضيفينا ، اتضح أن ما يلي بسيط ومحرج بشكل كامل بدون إعادة تشغيل المضيف:

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

كل ما هو مطلوب هو إعادة ضبط ساعة النظام. شيش. ما أعطي أن أعرف هذا منذ ست ساعات.


33
2017-07-01 07:49



date -s "`date`" عملت بالنسبة لي. - Pointy
DeanB: لقد نشرت في الساعة 03:00 بالتوقيت العالمي (UTC) أن إعادة تعيين الساعة يؤدي إلى خدعة ، وللأسف استغرق الأمر بعض الوقت للحصول على الإشراف. لقد بدأنا إعادة تشغيل الخوادم أيضًا - Gregor


برنامج C بسيط يزيل بتة ثانية كبيسة في حقل حالة الوقت kernel:

#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 بعد ثانية كبيسة.


24
2018-06-30 23:13



ماذا فعلت (void) argc; إنجاز؟ صمت التحذير للمتغير غير المستخدم؟ لن تستخدم int main() تحقيق نفس؟ لا أحاول أن أكون متحذاً ، فأنا فضولي حقًا. - gparent


يبدو أن تشريح الجثة يبدو ./ls ​​ليس لها تأثير.

ما نراه هو الكثير من عمليات softirqd التي تتناول وحدة المعالجة المركزية (عادة خطية لحمل عمليات جافا)

ما العمل لإصلاح POSTMORTEM بالثواني الكبيسة المطبقة مسبقًا بواسطة 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

18
2017-07-01 03:41



لماذا ا sntp -s و لا ntpdate؟ - errordeveloper
ntpdate هو مجرد غلاف sntp هنا ، من المؤكد أنه من الجيد استخدام ntpdate كذلك. - Gregor
آه غاب تماما هناك حزمة ntpdate للضغط حيث انها في الواقع ثنائي. لقد قمت بتحرير النشر الخاص بي لتضمين هذا. - Gregor
لقد سمعت تقارير مماثلة لإصلاح هذه المشكلة أيضًا (مثل استخدام date -s). يبدو أن الإصلاح يتطلب فقط تعيين وقت النظام بدلاً من تشغيله (سلوك ntpd الافتراضي عند إزاحة صغيرة). أعتقد أن تحديد الوقت يتسبب في إعادة تنظيم الميكانيكيين الداخليين لمهارات النواة. - Patrick
ارتفعت نسبة استخدام وحدة المعالجة المركزية للتطبيقات جافا أيضًا (مع وجود مقدار كبير من وقت وحدة المعالجة المركزية الذي تم إنفاقه في softirqd) ، تم إصلاحه. - Hubert Kario


http://my.opera.com/marcomarongiu/blog/2012/03/12/no-step-back يبدو أنه يشير إلى أن نواة ضغط دبيان لن تعالج قفزة ثانية.

هذا الموضوع على 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 لديه ما يلي ليقول: "عندما يحدث ثانية كبيسة ، يطبع kernel رسالة إلى سجل النظام. هناك احتمال أن تؤدي طباعة هذه الرسالة إلى تعطل kernel في Red Hat Enterprise Linux."


17
2018-06-30 18:47



لكن النواة 3.2.21 ينبغي ، على ما يُفترض - وهو ما كان يعمل على الأقل واحدة من الماكينات المحطمة - Bron Gondwana
على عدد قليل من تلك الأجهزة التي أشار إليها Bron ، قمنا في الواقع بإصدار إصلاح يجب أن يعالج بشكل صحيح المرحلة الثانية للقفزة القادمة. - cosimo
يمكنك نشر الإصلاح في مكان ما حتى يتمكن الآخرون من مراجعة / اقتراح الأفكار / المحاولة؟ - kargig
ليس لدي حل ... أنا مجرد جمع المعلومات. ربما ينبغي أن يكون هذا تعليقًا على السؤال الأصلي. - Luca Filipozzi
my.opera.com/marcomarongiu/blog/2012/06/01/... يحتوي على مزيد من التفاصيل حول إصلاحه - Bron Gondwana