שאלה מישהו אחר חווה שיעור גבוה של קריסות לינוקס שרת במהלך היום השני מעוברת?


* הערה: אם השרת שלך עדיין יש בעיות עקב גרעינים מבולבלים, ואתה לא יכול לאתחל - הפתרון הפשוט ביותר המוצע עם תאריך gnu מותקן על המערכת שלך: תאריך- s עכשיו. פעולה זו תאפס את המשתנה הפנימי "time_was_set" של הליבה ותקן את לולאות ה- hogging futex לולאות ב- Java ובכלי משתמשים אחרים. יש לי strced את הפקודה על המערכת שלי אישר את זה עושה מה שהוא אומר על הפח *

POSTMORTEM

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 - יש לו פתרון עבור phasing לשנות את הזמן מעל 24 שעות באמצעות ntpd-x, כדי למנוע את 1 לדלג השני. זוהי שיטת מריחה אלטרנטיבית להפעלת תשתית ה- ntp שלכם.


רק היום, יום שבת 30 יוני 2012 - החל זמן קצר לאחר תחילת היום GMT. היו לנו קומץ שרתים במרכזי נתונים שונים, כפי שמנוהלים על ידי צוותים שונים, כולם הולכים כהים - לא מגיבים לפינגים, ריקים.

הם כולם פועל דביאן לסחוט - עם כל דבר, החל במלאי הקרנל מותאם אישית 3.2.21 בונה. רוב הלהבים M610 של Dell, אבל אני פשוט גם איבד R510 של Dell ומחלקות אחרות איבדו מכונות מספקים אחרים מדי. היה גם יבמ x3550 מבוגר יותר אשר התרסק ואשר חשבתי שאולי לא קשור, אבל עכשיו אני תוהה.

התרסקות אחת אשר עשיתי לקבל dump מסך אמר:

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

למרבה הצער להבי כל כביכול היה kdump מוגדר, אבל הם מתו כל כך קשה כי kdump לא להפעיל - והם היו קונסולת ריקה מופעלת. השבתתי את מסוף הטעינה כעת, כך שהאצבעות חלפו, יהיה לי מידע נוסף לאחר ההתרסקות הבאה.

רק רוצה לדעת אם זה חוט משותף או "רק אותנו". זה באמת מוזר כי הם יחידות שונות datacentres שונים קנה בזמנים שונים ומנוהל על ידי מנהלים שונים (אני מפעיל את 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 (קוד נגנב מרקו, ראה הודעות בבלוג בהערות)
  3. רץ fixtime.pl ללא ויכוח לראות כי יש לקפוץ השני להגדיר
  4. רץ fixtime.pl עם ויכוח להסיר את הקפיצה השנייה

הערה: תלוי ב adjtimex. שמתי עותק של הלחיצה adjtimex בינארי ב http://linux.brong.fastmail.fm/2012-06-30/adjtimex - זה יפעל ללא תלות במערכת לסחוט 64 סיביות. אם אתה שם אותו באותה ספרייה fixtime.pl, הוא ישמש אם המערכת אינה קיימת. ברור אם אין לך לסחוט 64 סיביות ... למצוא שלך.

אני עומד להתחיל ntp שוב מחר.

כמשתמש אנונימי הציע - אלטרנטיבה לריצה adjtimex היא פשוט להגדיר את הזמן בעצמך, אשר יהיה כנראה גם לנקות את הדלפק lepsecond.


366
2018-06-30 16:15




יש היום קפיצה שנייה, ה -30. אני מהסס לרמוז כי הבעיה שלך, אבל אני יהיה צופה במכונות דביאן שלי מקרוב. - jscott
מאז הבוקר איבדנו לפחות 9 תיבות שונות לסחוט Debian מ ספקים שונים כל רץ המניות לסחוט 2.6.32 ליבה. אנחנו לא הצלחנו לקבל dump לקרוס בגלל קונסולת blanking גם ... - 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) כדי לספר את הקרנל להכניס זינוק השני. ראה פרסום 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 ופריסות אחרות המפעילות גרעינים חדשים יותר (יותר מ -2.26.26), אך לא RHEL 5.

הסיבה לכך מתרחשת לפני הקפיצה השנייה אמורה להתרחש היא ש- ntpd מאפשר לקרנל להתמודד עם הקפיצה השנייה בחצות, אבל צריך להזהיר את הקרנל כדי להכניס את הקפיצה השנייה לפני חצות. ntpd ולכן קורא 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 עדכנה את המאמר KB שלהם כדי לציין: "לקוחות RHEL 6 עשויים להיות מושפעים מבעיה ידועה שגורמת ל- NMI Watchdog לאתר תלייה בעת קבלת הודעת ה- NTP lepsecond, בעיה זו מטופלת במועד, אם המערכות שלך קיבלו את ההודעה השנייה לא נתקל בבעיה זו, אז הם כבר לא מושפעים ".

UPDATE: השפה הנ"ל הוסרה מתוך הכתבה של Red Hat; ואת הפתרון השני KB נוספה המפרט את adjtimex (2) בעיה לקרוס: https://access.redhat.com/knowledge/solutions/154713

עם זאת, שינוי הקוד בפוסט של LKML על-ידי מהנדס IBM, ג'ון סטולץ, עשוי להיות גם מבוי סתום כאשר הקפיצה השנייה מוחלת למעשה, לכן ייתכן שתרצה להשבית את הקפיצה השנייה על ידי אתחול מחדש או באמצעות 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).

אנו לברר אם יש עוד באגים בקרוב :)

עדכון אחרון:

ביליתי את השעות האחרונות בקריאת קוד ה- ntpd ו-תיקון מראש (באגי) קוד הקרנל, ובעוד אני עלול להיות מאוד לא בסדר כאן, אני אנסה להסביר מה אני חושב היה קורה:

ראשית, 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" וקורא אליו adjimexex (2) (דרך ניידותו-עטיפה).

שיחת המערכת הזאת עושה את דרכה אל הקרנל. הנה קוד הליבה הרלוונטי: https://github.com/mirrors/linux/blob/a078c6d0e6288fad6d83fb6d5edd91ddb7b6ab33/kernel/time/ntp.c

קודפת הקרנל הוא בערך זה:

  • קו 663 - התחלה של שגרת do_adjtimex.
  • קו 691 - לבטל את כל קוצב זמן השניות הקיימות.
  • קו 709 - לתפוס את spinlock ntp_lock (מנעול זה מעורב התרסקות livelock אפשרי)
  • שורה 724 - קריאה.
  • קו 616 - קריאה.
  • line 590 - set time_status משתנה גלובלי, המבוסס על דגלים שנקבעו בשיחה adjtimex (2)
  • 592 - לבדוק את המשתנה הגלובלי time_state. ברוב המקרים, להתקשר ntp_start_leap_timer.
  • קו 554 - משתנה time.status העולמי. STA_INS יוגדר, לכן קבע את time_state ל- TIME_INS והתקשר ל- hrtimer_start (פונקציית ליבה אחרת) כדי להתחיל את הקוצב השני. בתהליך של יצירת טיימר, קוד זה תופס את xtime_lock. אם זה קורה בעוד מעבד אחר כבר תפס את xtime_lock ו את ntp_lock, ולאחר מכן את גרעין הליבה. זו הסיבה שג'ון סטולץ כתב את התיקון כדי למנוע שימוש ב- hrtimers. זה מה שגורם לכולם צרות היום.
  • line 598 - אם ntp_start_leap_timer לא ממש התחיל טיימר זינוק, קבע את time_state ל- TIME_OK
  • קו 751 - בהנחה הקרנל אינו livelock, הערימה הוא unound ואת spinlock ntp_lock הוא שוחרר.

יש כאן כמה דברים מעניינים.

ראשית, קו 691 מבטל את הטיימר הקיים בכל פעם adjtimex (2) נקרא. לאחר מכן, 554 יוצר מחדש את הטיימר. משמעות הדבר היא כי בכל פעם ntpd רץ מסנן הלולאה השעון שלה, קוד באגי היה מופעל.

לכן אני מאמין שרד האט טעה כשאמרו כי ברגע שה- ntpd קבע את הדגל השני, המערכת לא תתרסק. אני מאמין כל מערכת פועל ntpd היה פוטנציאל livelock כל 17 דקות (או יותר) במשך 24 שעות לפני הקפיצה השנייה. אני מאמין שזה עשוי גם להסביר מדוע מערכות כה רבות התרסק; סיכוי חד פעמי של התרסקות יהיה הרבה פחות סיכוי להכות לעומת 3 הזדמנויות לשעה.

עדכון: בפתרון של רד האט ב https://access.redhat.com/knowledge/solutions/154713 , מהנדסי רד האט הגיעו למסקנה זהה (כי ריצה ntpd היה ברציפות להכות את הקוד באגי). ואכן, הם עשו זאת מספר שעות לפני כן. פתרון זה לא היה קשור למאמר הראשי ב https://access.redhat.com/knowledge/articles/15145 , אז לא שמתי לב לזה עד עכשיו.

שנית, זה מסביר מדוע מערכות טעון היו יותר לקרוס. מערכות טעון יהיה טיפול יותר interrupts, גרימת הפונקציה "do_tick" הליבה להיקרא לעתים קרובות יותר, נותן יותר סיכוי קוד זה לרוץ לתפוס את ntp_lock בזמן הטיימר היה נוצר.

שלישית, האם יש סיכוי שהמערכת מתרסקת כאשר מתרחשת למעשה הקפיצה השנייה? אני לא יודע בוודאות, אבל אולי כן, כי טיימר כי יורה בפועל מבצע את הקפיצה השנייה התאמת (ntp_leap_second, על קו 388) גם תופס את spinlock ntp_lock, ויש לו קריאה hrtimer_add_expires_ns. אני לא יודע אם זה יכול להתקשר גם יכול לגרום livelock, אבל זה לא נראה בלתי אפשרי.

לבסוף, מה גורם לדגל השני לדלג כדי להיות מושבת לאחר הקפיצה השנייה יש להפעיל? התשובה שיש ntpd מפסיק להגדיר את הדגל השני לקפוץ בשלב כלשהו אחרי חצות כאשר הוא קורא adjtimex (2). מאחר שהדגל אינו מוגדר, ההמחאה על קו 554 לא תהיה נכונה, ולא ייווצר טיימר, וקו 598 יאפס את המשתנה הגלובלי time_state ל- TIME_OK. זה מסביר למה אם בדקת את הדגל עם adjtimex (8) רק אחרי הקפיצה השנייה, אתה עדיין תראה את הדגל השני לקפוץ מוגדר.

בקיצור, העצה הטובה ביותר עבור היום נראה כי הראשון שנתתי אחרי הכל: להשבית ntpd, ולהשבית את הדגל השני לקפוץ.

וכמה מחשבות סופיות:

  • אף אחד מספקי לינוקס לא הבחין בתיקון של ג'ון סטולץ והחיל אותו על הגרעינים שלהם:
  • למה ג'ון ג 'ון Stultz התראה כמה ספקים זה היה צורך? אולי הסיכוי של חיית המחמד נראה נמוך מספיק לעשות רעש לא היה מוצדק.
  • שמעתי דיווחים על תהליכי Java נעולים או מסתובבים כאשר הקפיצה השנייה יושמה. אולי אנחנו צריכים לעקוב אחר להוביל של Google לחשוב מחדש איך אנחנו מיישמים שניות מעטות למערכות שלנו: http://googleblog.blogspot.com/2011/09/time-technology-and-leaping-seconds.html

06/02 עדכון מאת ג'ון סטולץ:

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

ההודעה הכילה צעד אחר צעד הליכה של למה הקפיצה השנייה גרמה טיימרים futex לפוג בטרם עת ברציפות, spiking את עומס ה- CPU.


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: אני פורסם ב 3 בבוקר UTC כי איפוס השעון עושה את הטריק, לצערי זה לקח קצת זמן כדי לקבל מנוהל. התחלנו גם אתחול מחדש של השרתים - Gregor


תוכנית C פשוטה המנקה את הקפיצה השנייה בשדה סטטוס הזמן של הקרנל:

#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


נראה שלאחר. / .Lec אין השפעה.

מה שאנחנו רואים הוא הרבה תהליכים softirqd אכילת CPU (בדרך כלל ליניארי עומס של תהליכי ג 'אווה)

מה עובד לתקן 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 הוא רק מעטפת כדי לצלצל לכאן, בטוח שזה בסדר להשתמש ntpdate גם כן. - Gregor
אה אני מתגעגע לחלוטין יש חבילת ntpdate לסחוט איפה זה בעצם בינארי. ביצעתי את הרישום שלי כדי לכלול את זה. - Gregor
שמעתי דיווחים דומים על תיקון בעיה זו (כמו למשל date -s). זה נשמע כמו לתקן רק דורש הגדרת זמן המערכת במקום slewing זה (ברירת המחדל ntpd התנהגות כאשר היסט קטן). אני מנחש שהגדרת הזמן גורמת למנגנוני שמירת הזמן הפנימיים של הקרנל לאפס את עצמם. - Patrick
ג 'אווה היישומים שלי CPU CPUed מדי (עם כמות גבוהה של זמן CPU בילה 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 יש את הדברים הבאים: "כאשר הקפיצה השנייה מתרחשת, הליבה מדפיסה הודעה ליומן המערכת, יש סיכוי שהדפסת הודעה זו עלולה לגרום לקריסת הליבה ב- Red Hat Enterprise Linux".


17
2018-06-30 18:47



אבל 3.2.21 הקרנל צריך, ככל הנראה - וזה מה לפחות אחד המכונות התרסקות היה פועל - Bron Gondwana
על כמה מן המכונות האלה כי ברון ציין שאנחנו למעשה יש התגלגל תיקון שצריך להתמודד כראוי את הקפיצה הקרובה השנייה. - cosimo
אתה יכול לכתוב את המקום לתקן כך שאחרים יכולים לסקור / להציע רעיונות / לנסות? - kargig
אין לי תיקון ... אני רק איסוף מידע. אולי היה צריך לשים את זה כהערה נגד השאלה המקורית. - Luca Filipozzi
my.opera.com/marcomarongiu/blog/2012/06/01/... מכיל פרטים נוספים על תיקון זה - Bron Gondwana