Soru İkinci bir gün içinde yüksek oranda Linux sunucusu çökerten biri çöktü mü?


* NOT: sunucunuz hala karışık çekirdekler nedeniyle sorunları varsa ve yeniden başlatamazsanız - sisteminizde yüklü gnu tarihiyle önerilen en basit çözüm: tarih-şimdi. Bu, çekirdeğin dahili "time_was_set" değişkenini sıfırlayacak ve CPU hogging futex döngülerini java ve diğer kullanıcı alanı araçlarına sabitleyecektir. Bu komutu kendi sistemime zorladım ve teyidde yazdığını doğruladı *

ÖLÜMDEN

Anticlimax: Öldürülen tek şey, benim kümemdeki VPN (openvpn) bağlantımdı, bu yüzden yeniden kurulurken birkaç saniyelik heyecan vardı. Diğer her şey iyiydi, ve ntp başladıktan sonra ikinci saniye geçtikten sonra temiz gitti.

Günün tam deneyimini yazdım. http://blog.fastmail.fm/2012/07/03/a-story-of-leaping-seconds/

Marco'nun bloguna bakarsanız http://my.opera.com/marcomarongiu/blog/2012/06/01/an-humble-attempt-to-work-around-the-leap-second - 1 saniyelik atlamadan kaçınmak için ntpd -x kullanarak 24 saatin üzerinde zaman değişiminin aşamalı hale getirilmesi için bir çözüme sahiptir. Bu, kendi ntp altyapınızı çalıştırmak için alternatif bir temizleme yöntemidir.


Sadece bugün, 30 Haziran 2012, Cumartesi - GMT günün başlangıcından hemen sonra başlayacak. Farklı ekiplerce yönetilen farklı veri merkezlerinde hepimiz bir sürü sunucu vardı, hepsi de karanlığa düştü - pinglere cevap vermiyor, ekran boş.

Hepsi Debian Squeeze kullanıyor - stok çekirdeğinden özel 3.2.21 sürümüne kadar. Çoğu Dell M610 bıçaklarıdır, ancak Dell R510'u kaybettim ve diğer departmanlar da diğer satıcıların makinelerini kaybetti. Ayrıca çökmüş ve ilgisiz olabileceğini düşündüğüm bir IBM x3550 modeli vardı, ama şimdi merak ediyorum.

Söylediğim bir ekran çöküşünden bahseden tek kaza:

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

Ne yazık ki, bıçakların hepsinin kdump'u yapılandırdığı varsayılıyordu, ancak kdump'un tetiklemediği o kadar zor bir şekilde öldüler - ve onlar da konsol boşluğuna sahipti. Artık konsol boşluğunu devre dışı bıraktım, böylece parmak çarpı geçtikten sonra bir sonraki çarpışmadan sonra daha fazla bilgiye sahip olacağım.

Sadece ortak bir konu ya da "sadece biz" olup olmadığını bilmek istiyorum. Farklı veri merkezlerindeki farklı birimlerde farklı birimler olmaları ve farklı yöneticiler tarafından çalıştırılmaları (FastMail.FM'leri çalıştırıyorum) ve artık farklı satıcı donanımları olması gerçekten garip. Çarpışan makinelerin çoğu haftalar / aylardı ve 3.1 veya 3.2 seri çekirdekler kullanıyordu.

En son çöküş, sadece yaklaşık 6 saat süren 3.2.21'lik bir makineydi.

ÇALIŞMA

Tamam millet, işte bu konuda çalıştım.

  1. devre dışı ntp: /etc/init.d/ntp stop
  2. oluşturulan http://linux.brong.fastmail.fm/2012-06-30/fixtime.pl (Marco'dan çalınan kod, yorumlardaki blog yazılarına bakın)
  3. ran fixtime.pl bir sıçrama ikinci seti olduğunu görmek için bir argüman olmadan
  4. ran fixtime.pl artık saniyeyi kaldırmak için bir argüman ile

NOT: bağlıdır adjtimex. Sıkışmanın bir kopyasını koydum adjtimex ikili http://linux.brong.fastmail.fm/2012-06-30/adjtimex - Sıkıştırma olmadan 64 bitlik bir sistemde çalışır. Aynı dizine koyarsanız fixtime.plSistem mevcut değilse, kullanılacak. Tabii ki, 64-bit'lik bir sıkıntınız yoksa, kendinizinkini bulun.

Ben başlayacağım ntp yarın tekrar.

Anonim bir kullanıcı önerdi - koşmaya alternatif adjtimex Zamanın kendiliğinden ayarlanmasıdır, bu da muhtemelen bir miktar sıcağı sayacı temizleyecektir.


366
2018-06-30 16:15


Menşei


Bugün bir sıçrama saniye var, 30. Bu senin sorununun olduğunu ima etmekte tereddüt ediyorum, ama Debian makinemi yakından izleyeceğim. - jscott
sabahtan beri tüm çalışan stoklarının 2.6.32 çekirdeğini sıkıştıran en az 9 farklı debian sıkma kutusunu kaybettik. Biz de konserve boşluğu nedeniyle bir çökme dökümü alamadık ... - kargig
Bu konuda lkml gönderme lkml.indiana.edu/hypermail/linux/kernel/1203.1/04598.html - Daniel S. Sterling
Bunu bildirdiğiniz için teşekkürler! Şimdi sunucularıma çok yakından bakıyorum. - Janne Pikkarainen
LKML iş parçacığı bunu gösterdi date -s "`date`" yardımcı olur - kesinlikle bana yardımcı oldu. - Pointy


Cevaplar:


Ntpd, çekirdek 2'yi bir ikinci saniye eklemesini söylemek için adjtimex (2) 'yi çağırdığında, bunun bir kurtarıcıdan kaynaklanır. Lkml gönderimine bakın http://lkml.indiana.edu/hypermail/linux/kernel/1203.1/04598.html

Red Hat da KB makalelerini de güncellemelidir. https://access.redhat.com/knowledge/articles/15145

GÜNCELLEŞTIRME: Red Hat, sadece bu sorun için ikinci bir KB makalesine sahiptir: https://access.redhat.com/knowledge/solutions/154713 - önceki makale, daha önce ilgisiz bir sorun için

Çalışma, ntpd'yi kapatmaktır. Ntpd, adjtimex (2) çağrısını daha önce vermişse, ntpd'yi devre dışı bırakmanız ve% 100 güvenli olmak için yeniden başlatmanız gerekebilir.

Bu, RHEL 6'yı ve diğer çekirdeklerin daha yeni çekirdeği (yaklaşık 2.6.26'dan daha yeni), fakat RHEL 5'i etkilemesini etkiler.

Bunun nedeni önce Atılım saniyesinin gerçekleşmesi planlanıyor: ntpd, çekirdeğin gece yarısında ikinci saniyeyi geçmesine izin veriyor, ancak çekirdeği gece yarısından önce atlamak için çekirdeği uyarması gerekiyor. Bu nedenle ntpd, bu hata tetiklendiği noktada, artık saniye (saniye) sırasında bir süre adjtimex (2) çağırır.

Adjtimex (8) kuruluysa, flag 16 ayarlı olup olmadığını belirlemek için bu betiği kullanabilirsiniz. Bayrak 16 "artık saniye ekliyor":

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

GÜNCELLEŞTİRME:

Red Hat, KB makalelerini not etmek üzere güncelledi: "RHEL 6 müşterileri, NTP Watchdog'unun NTP leapsecond duyurusunu alırken askıda kalmasına neden olan bilinen bir sorundan etkilenebilir. Bu sorun, zamanında ele alınmaktadır. Salı anonsu ve bu sorunu yaşamadık, sonra artık etkilenmezler. "

GÜNCELLEME: Yukarıdaki dil Red Hat makalesinden kaldırılmıştır; ve adjtimex (2) kilitlenme sorununu detaylandıran ikinci bir KB çözümü eklendi: https://access.redhat.com/knowledge/solutions/154713

Ancak, IBM Engineer John Stultz tarafından LKML yayınındaki kod değişikliği, artık saniye uygulandığında bir kilitlenme olabileceğine dikkat çeker, bu nedenle ntpd'yi devre dışı bıraktıktan sonra yeniden başlatma veya adjtimex (8) kullanarak atlama saniyeini devre dışı bırakmak isteyebilirsiniz.

SON GÜNCELLEME:

Eh, ben çekirdek dev değilim, ama yine burada John Stultz'ın yama gözden geçirdim: https://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=6b43ae8a619d17c4935c3320d2ef9e92bdeed05d

Bu sefer doğru okuyorsam, ikinci saniye uygulandığında başka bir kilitlenme olduğu konusunda yanıldım. Bu, Red Hat'in kanaatine göre KB'nin görüşü gibi görünüyor. Ancak, ntpd'yi devre dışı bıraktıysanız, 10 dakika daha devre dışı bırakın, böylece ntpd, adjtimex (2) çağırdığında kilitlenmez.

Yakında başka bir hata olup olmadığını öğreneceğiz :)

POST-LEAP İKİNCİ GÜNCELLEME:

Son birkaç saatimi ntpd ve ön-yama (buggy) çekirdek koduyla okudum ve burada çok yanlış olabileceğimi düşünürken, ne olduğunu düşündüğümü açıklamaya çalışacağım:

İlk olarak, ntpd her zaman adjtimex (2) çağırır. Bunu, ntp_loopfilter.c dosyasında local_clock içinde tanımlanan "saat döngü filtresi" nin parçası olarak yapar. Bu kodu burada görebilirsiniz: http://www.opensource.apple.com/source/ntp/ntp-70/ntpd/ntp_loopfilter.c (ntp sürümü 4.2.6'dan).

Saat döngü filtresi oldukça sık çalışır - her zaman ntpd varsayılan olarak her 17 dakikada veya daha fazla olan üst akış sunucularını yoklar. Saat döngü filtresinin ilgili biti:

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

Ve sonra:

ntp_adjtime(&ntv)

Diğer bir deyişle, bir saniye geçtiğinde, ntpd "STA_INS" bayrağını ayarlar ve adjtimex (2) (taşınabilirlik-sarmalayıcı aracılığıyla) çağırır.

Bu sistem çağrısı çekirdeğe gidiyor. İşte ilgili çekirdek kodu: https://github.com/mirrors/linux/blob/a078c6d0e6288fad6d83fb6d5edd91ddb7b6ab33/kernel/time/ntp.c

Çekirdek kod yolu kabaca şu:

  • satır 663 - do_adjtimex rutininin başlangıcı.
  • satır 691 - mevcut herhangi bir ikinci saniye sayacını iptal et.
  • satır 709 - ntp_lock döndürme kilidini yakala (bu kilit olası payanda kazasında devreye girer)
  • 724 hattı - process_adjtimex_modes.
  • satır 616 - process_adj_status çağrısı.
  • line 590 - settimex (2) çağrısında ayarlanan bayraklara bağlı olarak time_status global değişkenini ayarla
  • satır 592 - time_state genel değişkeni denetle. Çoğu durumda, ntp_start_leap_timer öğesini çağırın.
  • satır 554 - time_status genel değişkenini kontrol edin. STA_INS ayarlanacak, bu nedenle time_state öğesini TIME_INS olarak ayarlayınız ve ikinci zamanlayıcıyı başlatmak için hrtimer_start (başka bir çekirdek fonksiyonu) çağırın. Bir zamanlayıcı oluşturma sürecinde, bu kod xtime_lock'u yakalar. eğer bu olursa başka bir CPU xtime_lock'u yakaladı ve ntp_lock, daha sonra çekirdek livelocks. Bu nedenle John Stultz, hrtimerler kullanmaktan kaçınmak için yamayı yazdı. Bugün herkese sorun olan buydu.
  • satır 598 - ntp_start_leap_timer aslında bir sıçrama zamanlayıcısı başlatmadıysa, time_state değerini TIME_OK olarak ayarlayın
  • satır 751 - çekirdeğin kurtarılmadığı varsayıldığında, yığın açılmamış ve ntp_lock döndürme kilidi serbest bırakılmıştır.

Burada birkaç ilginç şey var.

İlk olarak, 691 satırı, her zaman adjtimeks (2) çağrıldığında mevcut zamanlayıcıyı iptal eder. Ardından, 554 bu zamanlayıcıyı yeniden oluşturur. Bu, ntpd saat döngü süzgecini çalıştırdığı her defasında, buggy kodunu çağırdığı anlamına gelir.

Bu yüzden, Red Hat'in yanlış olduğunu düşündüğümde, ntpd ikinci saniye bayrağı ayarladıktan sonra, sistem çökmezdi. Ntpd çalıştıran her sistemin, saniyeden 24 saat önce her 17 dakikada bir (veya daha fazla) canlanma potansiyeline sahip olduğuna inanıyorum. Bunun birçok sistemin neden çöktüğünü de açıklayabileceğine inanıyorum; Bir kerelik çarpışma şansı, bir saatte 3 şansa kıyasla daha az vurma ihtimali daha düşük olacaktır.

GÜNCELLEME: Red Hat'ın KB çözümünde https://access.redhat.com/knowledge/solutions/154713 Red Hat mühendisleri aynı sonuca varmışlardır (ntpd'yi çalıştırarak buggy kodunu sürekli olarak vuracaktır). Ve gerçekten de yapmadan birkaç saat önce yaptılar. Bu çözüm, ana makaleye bağlı değildi. https://access.redhat.com/knowledge/articles/15145 , o zamana kadar fark etmedim.

İkincisi, yüklü sistemlerin neden çökme olasılığının daha yüksek olduğunu açıklıyor. Yüklenen sistemler daha fazla kesintiye yol açacak ve "do_tick" çekirdek fonksiyonunun daha sık çağrılmasına neden olacak ve bu kodun daha fazla zaman kazanmasına ve zamanlayıcı oluşturulduğunda ntp_lock'a yakalanmasına neden olacak.

Üçüncüsü, artık saniye gerçekleştiğinde sistemin çökmesi ihtimali var mı? Kesinlikle bilmiyorum, ama muhtemelen evet, çünkü ateşleme ve aslında ikinci saniyede ayarlamayı yürüten zamanlayıcı (ntp_leap_second, 388 satırında) ayrıca ntp_lock dönüştüğünü yakalar ve hrtimer_add_expires_ns çağrısı vardır. Bu aramanın bir kurtarıcıya neden olup olmayacağını bilmiyorum, ama imkansız görünmüyor.

Son olarak, ikinci saniyeden sonra ikinci saniye bayrağının devre dışı kalmasına neden olan nedir? Cevap, ntpd, gece yarısından (2) arandığında gece yarısından sonra bir noktada sıçrama-saniye bayrağını ayarlamayı durdurur. Bayrak ayarlanmadığı için 554 nolu kontrol hattı geçerli olmayacak ve hiçbir zamanlayıcı oluşturulmayacak ve 598 nolu hat, time_state global değişkeni TIME_OK'a sıfırlayacaktır. Bu, eğer bayrağı ikinci saniyeden hemen sonra adjtimex (8) ile işaretlediyseniz, hala ikinci saniye bayrağı setini göreceksiniz.

Kısacası, bugün için en iyi tavsiye, ilk verdiğim gibi görünüyor: ntpd'yi devre dışı bırak ve ikinci saniye bayrağını devre dışı bırak.

Ve bazı son düşünceler:

  • Linux satıcılarının hiçbiri John Stultz'un yamalarını fark etmedi ve çekirdeklerine uyguladı :(
  • John Stultz, neden ihtiyaç duyulduğu konusunda bazı satıcıları uyarmadı? Belki de canlıların şansının yeterince düşük olduğu görülüyordu.
  • Sıfırlama uygulandığında Java işlemlerini kilitleme veya döndürme raporları duydum. Belki de Google’ın liderliğini takip etmeli ve sistemlerimize kaç saniye saniye uygulayacağımızı tekrar düşünmeliyiz: http://googleblog.blogspot.com/2011/09/time-technology-and-leaping-seconds.html

John Stultz'dan 06/02 Güncellemesi:

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

Gönderi, ikinci adımın neden futex zamanlayıcılarının zamanından önce ve sürekli olarak bitmesini ve CPU yükünü artırmasının neden bir adım adım ilerlemesini içeriyordu.


322
2018-06-30 19:56



Mükemmel cevap için teşekkürler. Böylece sunucularımızın geri kalanı oturmayı bekliyor. Güzel. Rolling burada yeniden başlıyoruz! - Bron Gondwana
Olup olmadığını nasıl bilebilirim adjtimex yayınlandı, çekirdek dmesg'de bir şey yazdı mı? Ntpd'yi kapatmadan önce çökmeyen bir sistemin çökme ihtimali nedir? - Hubert Kario
Hubert: "adjtimex" i çalıştırın (genellikle ayrı ayrı paketlenmiştir) ve beklemede bir saniye beklemek için 16 numaralı bayrağı arayın. - Dominic Cleal
Temsilcinden nefret edeceksiniz. - Wesley
@WesleyDavid: Endişeye gerek yok, rep cap gece yarısı UTC'de sıfırlanacak. Olabilir. - mmyers


Bu bizi çok zorladı. Ev sahiplerimizin çoğunu yeniden başlattıktan sonra, aşağıda ana bilgisayar yeniden başlatılmadan utandırıcı basit ve tamamen etkili olduğu ortaya çıktı:

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

Tüm gereken, sistem saatini sıfırlamak. Sheesh. Bunu altı saat önce bildiğim şey.


33
2017-07-01 07:49



date -s "`date`" benim için çalıştı. - Pointy
@DeanB: Saatin sıfırlanmasının saat kaçta UTC'de yayınlandığını, maalesef ne kadar maaş almam gerektiğini. Sunucuları yeniden başlatmaya başladık - Gregor


Çekirdeğin zaman durumu alanındaki artık ikinci biti temizleyen basit bir C programı:

#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;
}

Farklı kaydet lsec.cile derlemek gcc -Wall -Wextra -o lsec lsec.c ve root olarak çalıştır.

Ntpd'yi çalıştırmadan önce durdurmak isteyeceksiniz ve ılp saniye sonra ntpd'yi yeniden başlatacaksınız.


24
2018-06-30 23:13



Nedir (void) argc; başarmak? Kullanılmayan değişken için uyarıyı susturun. Kullanmazdım int main() aynı şeyi? Bir arkadaş olmaya çalışmıyorum, gerçekten merak ediyorum. - gparent


Postmortem görünüyor. /Lsec'in bir etkisi yoktur.

Gördüğümüz, CPU'yu yiyen çok sayıda softirqd işlemi (genellikle java işlemlerinin yüküne doğrusal)

POSTMORTEM'i ntp tarafından zaten uygulanmış olan atlatma saniyeleri ile düzeltmek için ne işe yarar?

Sadece yayınlamak için yeterli görünüyor:

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

Bu, ntpd yeniden başlatma veya yeniden başlatma olmadan yükü azaltmalıdır. Alternatif olarak şunları yapabilirsiniz:

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

18
2017-07-01 03:41



niye ya sntp -s ve yok ntpdate? - errordeveloper
ntpdate, burada sntp sadece bir sarıcı, eminim ntpdate de kullanmak iyidir. - Gregor
Ben tamamen bir ikili olduğunu nerede sıkmak için bir ntpdate paketi olduğunu tamamen özledim. Gönderiyi buna dahil etmek için düzenledim. - Gregor
Bu sorunu düzeltmekle ilgili benzer raporlar duydum ( date -s). Düzeltme işlemi, sistem saatini döndürmek yerine sistem saatinin ayarlanmasını gerektirir (ofset küçük olduğunda varsayılan ntpd davranışı). Zamanın ayarlanmasının, zamanın çekirdeğin kendi kendini tamir mekanizmalarının sıfırlanmasına neden olduğunu tahmin ediyorum. - Patrick
Benim java uygulamaları CPU kullanımı da (softirqd harcanan yüksek CPU zamanı ile) çivili, bu sabit. - Hubert Kario


http://my.opera.com/marcomarongiu/blog/2012/03/12/no-step-back Debian sıkma çekirdeğinin ikinci saniye işlemez olduğunu gösteriyor gibi görünüyor.

Comp.protocols.tim.ntp üzerindeki bu konu da ilgi çekicidir: https://groups.google.com/forum/?fromgroups#!topic/comp.protocols.time.ntp/KSflIgjUdPE

Bu, ikinci saniye olmadı henüz dedi: 23:59:60 UTC

En sonunda, https://access.redhat.com/knowledge/articles/15145 "Sıfır saniye gerçekleştiğinde, çekirdek sistem günlüğüne bir ileti yazdırır. Bu mesajın yazdırılmasının çekirdeğin Red Hat Enterprise Linux'ta çökmesine neden olması ihtimali vardır."


17
2018-06-30 18:47



Ancak 3.2.21 çekirdeği, muhtemelen - çökmüş makinelerin en az birinin çalıştığı - Bron Gondwana
Bron'nun belirttiği makinelerin birkaçında, yaklaşan atılım saniyesini doğru şekilde kullanması gereken bir düzeltme gerçekleştirdik. - cosimo
düzeltmeyi başkalarının yorum yapabileceği / önerebileceği / deneyebileceği bir yere gönderebilir misin? - kargig
Bir fikrim yok ... Sadece bilgi topluyorum. Belki de asıl soruya karşı yorumda bulunmalıydı. - Luca Filipozzi
my.opera.com/marcomarongiu/blog/2012/06/01/... sabitleme hakkında daha fazla bilgi içerir - Bron Gondwana