Sekunda przestępna – jednak spowodowała trochę problemów

Gdy ostatnio pisałem o sekundzie przestępnej, nie spodziewałem się, że z powodu jej dodania część serwisów internetowych będzie miała problemy. Inne, jak Google, były na to przygotowane, co więcej opracowały własny sposób na dodanie tej sekundy.

Problem z sekundą przestępną

Reddit, popularny (choć nie u nas) agregator wiadomości, napisał na Twitterze:

 

Okazało się, że Cassandra, opensource’owa baza danych napisana w Javie, z której korzysta Reddit, zaczęła sprawiać problemy w momencie dodania sekundy przestępnej.

Mozilla z kolei miała problem z serwerami Javy i MySQL-em, co zaowocowało zgłoszonym bugiem:

A to są tylko przykłady, których było więcej:

 

Problemy nie ominęły również chmury Amazonu, która obsługuje iemal 1% całego ruchu w internecie. W przypadku Amazonu był to kolejny problem, który „wyłączył” część serwisów internetowych (jak choćby niedawno burza, która pozbawiła serwerownię zasilania).

Nie sposób umieścić tu i opisać wszystkie serwisy i aplikacje, które miały problemy w związku z sekundą przestępną. Prawdopodobnie nawet Firefox na Linuksie był dotknięty tym problemem. W zasadzie prawie każde oprogramowanie pracujące na podatnych komputerach mogło spowodować zapętlenie się kodu i zawiesić się. Zazwyczaj możliwe było jednak szybkie przywrócenie systemu do działania.

W przypadku niektórych serwisów internetowych, nie było w ogóle widać skutków problemów, ponieważ zapętlenie się kodu tylko nieco obciążało procesory maszyny. Niektóre serwisy praktycznie się nie podawały – problem z dostępem do nich np. po SSH mieli też ich administratorzy. Część serwerów całkowicie odmówiła posłuszeństwa i zawiesiła się całkowicie.

 

Przyczyna problemu, skutki i ich eliminacja

Na serverfault pojawiła się dyskusja dotycząca przyczyny i skutków problemu.

Nie będę tutaj wgryzał się w szczegóły – te opisane są dokładnie na serverfault. Problem pojawił się w kodzie dotyczącym zegara czasu rzeczywistego. Bug, który się tam znajduje powodował zapętlenie się kodu w momencie dodania sekundy przestępnej i mocne obciążenie procesorów. Z tego też powodu proces, który wykonywał wywołanie systemowe, którego dotyczył omawiany bug, również się zawieszał (jeśli oczekiwał na zakończenie wywołania).

Serwery które nie korzystają z serwera NTP i nie ustawiają w inny sposób pola (flagi) dodania sekundy przestępnej (o czym pisałem wcześniej), nie były zagrożone wystąpieniem problememu. W przypadku serwerów, które były podatne na błąd, w najlepszym przypadku jeden z rdzeni procesora był obciążony w 100%. Administratorzy niektórych serwerów mieli jednak gorsze problemy – serwery odpowiadały bardzo powoli, a w najgorszym przypadku zawieszały się całkowicie.

Tam, gdzie używany był kdump, można było zaobserwować zalogowany np. taki błąd:

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

 

Jeśli możliwy był jakikolwiek dostęp do serwera, zazwyczaj wystarczyło ponownie, ręcznie ustawić zegar czasu rzeczywistego:

date -s "`date`"

lub:

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

Czasami trzeba było również zatrzymać najpierw klienta NTP:

$ cat files/bin/leap-second.sh
#!/bin/bash
# this is a quick-fix to the 6/30/12 leap second bug

if [ ! -f /tmp/leapsecond_2012_06_30 ]
then
/etc/init.d/ntpd stop; date -s "`date`" && /bin/touch /tmp/leapsecond_2012_06_30
fi

(skrypt z blogu Mosilla IT)

I uruchomić ponownie usługę dopiero po kilku minutach.

Niektóre serwery nie reagowały na próby ręcznej korekcji czasu i musiały być całkowicie zresetowane, co w każdym przypadku eliminowało problem.

 

Sposób Google na sekundę przestępną

Podczas pisania poprzedniego wpisu o sekundzie przestępnej, zastanawiałem się przez chwilę, jak ja bym widział dodanie takiej sekundy, ponieważ żaden z popularnie stosowanych sposobów nie do końca mi pasował. Do głowy przyszło mi dodawanie czasu sukcesywnie, przez pewien czas, „po trochu”, aby w momencie nadejścia sekundy przestępnej mieć ją już dodaną. Wyobraźcie sobie jakie było moje zaskoczenie gdy trafiłem na wpis mówiący o tym, jak Google dodaje sekundę przestępną.

Google to jedna z tych firm, która dobrze przygotowała się na dodanie sekundy przestępnej po drobnych problemach z niektórymi usługami w 2005 roku, dotyczących również sekundy przestępnej. Google dążyło do zapewnienia, że replikacje będą działać właściwie, logi kliknięć i wyszukiwań będą zapisane w odpowiedniej kolejności, itp. Najczęściej stosowana metoda polegająca na cofnięciu zegara o 1 sekundę mogła by spowodować spore problemy (pomijając już sam bug dotyczący dodania sekundy przestępnej).

Sposobem Google na dodanie sekundy przestępnej było wykonanie małego patcha do serwerów NTP. Powoduje on, że serwer, w dniu w którym ma nastąpić dodanie (lub odjęcie) sekundy przestępnej, nie ustawia pola „Leap Indicator” (LI), a „oszukuje” klientów NTP, podając im korygowany czas wg wzoru:

lie(t) = (1.0 - cos(pi * t / w)) / 2.0

Dzieje się to w pewnym przedziale czasu przed dodaniem sekundy przestępnej. Całość zaplanowana jest tak, aby nie powodowała niepożądanych skutków wynikających z przesuwaniem czasu względem czasu obecnego.

 

Podsumowanie

Jak wspominałem, pisząc o sekundzie przestępnej, nie spodziewałem się większych problemów. To przecież nie pierwszy raz (a 25), gdy taka sekunda jest dodawana (choć ostatnio było to 3,5 roku temu). Okazało się jednak, że problemów było całkiem sporo. Teraz trzeba poczekać na odpowiednie patche. Ciekawe, czy sytuacja się powtórzy przy kolejnym dodaniu sekundy przestępnej. Możliwe również, ze już nigdy nikt nie doświadczy podobnych problemów, ponieważ są plany wycofania się z dodawania sekundy przestępnej.

 

Źródła: Wired.com, Reddit na Twitterze, Mozilla IT, Bugizilla@Mozilla, BuzzFeed, Google Official Blog, serverfault, TechSpot,
Obrazki: [1], [2]

Ten wpis został opublikowany w kategorii Debian, Internet, Linux, Oprogramowanie, Programowanie, Serwery, WWW i oznaczony tagami , , , , , , . Dodaj zakładkę do bezpośredniego odnośnika.

Dodaj komentarz

Musisz się zalogować (także Facebook, Google+, Twitter), aby móc dodać komentarz.