?

Log in

No account? Create an account
entries friends calendar profile My Website Previous Previous Next Next
Психовенерологическое - Уголок Школьника
scolar
scolar
Психовенерологическое
Всем известна шутка по то, что софт как секс: лучше, когда бесплатный. Что-то мне всё больше кажется, что софт как медицина: лечиться даром - даром лечиться.

Последнюю неделю я потратил на исследование нескольких взаимосвязанных (что поначалу было неочевидно) проблем. Одна из них свелась к такой: стоят рядом клиент (Java) и сервер (Ubuntu + Tomcat + Java), у обоих на часах правильное время (то есть таймзона, локальное время и таблицы перехода на зимнее/летнее). Клиент берёт свое время, прибавляет к нему 15 минут и отправляет запрос на сервер. Сервер получает запрос, читает время, сравнивает со своим - и сообщает клиенту, наступил тайм-аут или нет. На клиенте одна нитка, всё в цикле, пока не получим ответ от сервера, новый запрос не посылаем.

Обнаружилось: примерно 1 раз на 10000 запросов сервер ругается на тайм-аут. Построил гистограмму количества обработанных запросов в секунду - мало ли, вдруг и вправду пакеты 15 минут где-то шлялись? Нет, не шлялись.

Пишу небольшую программку, которую запускаю на сервере:

import java.util.Date; 

class Test { 
    public static void main(String[] args) { 
        long saved = System.currentTimeMillis(); 
        for (int i = 0; i < 1000000000; i++) { 
            long now = System.currentTimeMillis();
            if (saved > now) { 
                System.out.println("Bug found. i = " + i); 
                System.out.println("Was: " + new Date(saved).toString()); 
                System.out.println("Now: " + new Date(now).toString()); 
                return; 
            } 
            saved = now; 
            if (i%10000 == 0) { 
                System.err.print('.'); 
            }
    }
    System.out.println("no bugs"); 
}
Получаю результат:
.......многаточек.....Bug found: i = 3741826
Was: Sat Mar 21 03:28:33 EDT 2009
Now: Sat Mar 21 02:15:15 EDT 2009 
Итого, часы скакнули на 1 час 13 минут 18 секунд вперёд, а потом вернулись назад за считанные милисекунды.

Поиск в сети показал, что первые упоминания подобной проблемы относятся к 1999 году. Эту проблему последовательно списывали на кривые чипсеты VIA, кривые процессоры AMD, кривое ядро 2.4.xx - короче, разные были варианты.

Наконец в 2008 году, вроде, появился патч. В описании бага с революционной прямотой написано: ...there is a subtle bug which has been in the code for ever. This can cause time jumps in the range of hours.

Если кому-то интересна причина, загляните в текст патча. Грубо говоря: вычитание двух беззнаковых целых, второе из которых внезапно оказалось чуть больше первого. Далее это очень большое положительное число оказывается, по счастью, наносекундами, что в переводе в секунды даёт магическое число 4398, на которые мы и убегаем, к счастью, нечасто и ненадолго.

И ведь, поди, пол-интернета на этом работает.
 
12 comments or Leave a comment
Comments
olkab From: olkab Date: March 21st, 2009 08:02 am (UTC) (Link)
Впечатляет.
spamsink From: spamsink Date: March 21st, 2009 08:12 am (UTC) (Link)
По сути очень похоже на Pentium DIV bug.
yurilax From: yurilax Date: March 22nd, 2009 12:29 pm (UTC) (Link)
...и на Excel bug.
pilpilon From: pilpilon Date: March 21st, 2009 08:41 am (UTC) (Link)
max_ushakov From: max_ushakov Date: March 21st, 2009 08:46 am (UTC) (Link)
Симпатично. Только я как-то не понимаю, при чём тут бесплатность:)
scolar From: scolar Date: March 21st, 2009 08:48 am (UTC) (Link)
Я слышал, но не проверял, что в одной платной ОС эта проблема исчезла между 1998 и 2000 гг.
max_ushakov From: max_ushakov Date: March 21st, 2009 08:54 am (UTC) (Link)
А у нас всячески стараются избавиться от коммерческого софта -- потому что добиться от вендора исправления ошибки за конечное время невозможно...
scolar From: scolar Date: March 21st, 2009 08:56 am (UTC) (Link)
Погоди, но при ваших масштабах вендоры должны по стойке смирно...
max_ushakov From: max_ushakov Date: March 21st, 2009 09:23 am (UTC) (Link)
И тем не менее... Типичные времена, как я понимаю -- полгода или год (если всё хорошо).
scolar From: scolar Date: March 23rd, 2009 11:20 pm (UTC) (Link)
Кстати, рестарт с опцией "notsc" лечит проблему на ура. Где она, правда, время теперь берёт, я ума не приложу.
nisius From: nisius Date: March 21st, 2009 12:18 pm (UTC) (Link)
Так это в итоге в upstream ядре баг или в ubuntu'овских вариациях?
scolar From: scolar Date: March 21st, 2009 04:30 pm (UTC) (Link)
Вот дискуссия в RedHat'е: https://bugzilla.redhat.com/show_bug.cgi?id=452185 - так что не только Ubuntu. Надо, конечно, залезть и посмотреть на kernel.org, может вечером сделаю.
12 comments or Leave a comment