On Wed, Aug 29, 2007 at 11:14:30AM +0400, Igor Sysoev wrote:
> On Wed, Aug 29, 2007 at 10:24:16AM +0400, Alexey Rymonin wrote:
>
> > Hello Igor,
> >
> > Wednesday, August 29, 2007, 12:59:46 AM, you wrote:
> >
> > >> Я могу поставить на них nginx и запустить стрес тест на всех трех
> > >> вресиях ядра... Сэмулировать нагрузку превышающую текущую, на мелких
> > >> файлах, тостых файлах, нот фаундах, форбиденах и больших клиенских
> > >> запросах (чтобы в буфер не влезал)... если эта ошибка ядра, то скорее
> > >> всего рано или поздно
> > >> она повториться...
> >
> > > Это было бы интересно при включённом отладочном логе. Его можно вращать
> > > раз в минуту.
> >
> > Я так и сделаю... поскольку на отладочный лог было бы очень интересно
> > посмотреть...
> > Игорь... у меня на этом же сервере в качестве MTA стоит Exim, который
> > под соляркой также юзает /dev/poll. И он работает без нареканий с тех пор
> > как сервак
> > запустили... Странно это, поскольку если бы это был баг ядра, он бы
> > тоже должен бы писать хоть что-то....
>
> Это зависит от того, как обрабатывать. Я, наверное, сделаю там проверку
> на NULL и буду писать в лог о таких случаях.
>
> > Игорь, у меня к вам еще два вопроса есть:
> > 1) А методы работы с событием(сокетом) синхронизированные?
> > Не может ли появиться событие на сокет пока идет код его удаления из
> > пула, встать в очередь и сразуже по окончанию процедцры вернуться и
> > вызвать падение? Это бы объясняло редкость возникновения баги....
>
> В nginx'е передача событий в ядро делается пачками, ровно перед получением
> пачки готовых событий. Но при закрытии сокета вся накопивашая пачка
> сразу скидывается в /dev/poll, а потом закрывается сокет.
>
> После удаления события из ядра оно не должно приходить.
> Если же оно приходит, то это race condition в ядре.
>
> > 2) Игорь, а что такое DP_ISPOLLED?
> > http://docs.sun.com/app/docs/doc/816-5177/6mbbc4g9q?l=de&a=view
>
> Способ узнать, зарегистрирован ли дескриптор в /dev/poll.
> Для программ типа nginx'а его использование бессмысленно, так как nginx
> ведёт собственный учёт. Скорее всего, он предназначен для библиотек,
> когда проще сходить в ядро, перед тем, как добавить события, чем вести
> собственный учёт.
>
> Кстати, в вышеупомянутой проверке на NULL я буду вызывать DP_ISPOLLED,
> чтобы проверить, дейстивтельно ядро считает, что дескрптор ещё присутствует
> в /dev/poll, или же это фантомные события, оставшиеся после удаления.
Патч, который проверяет с DP_ISPOLLED странный дескриптор.
Падать теперь не должно, в логе должны быть alert'ы.
Можно поставить в продакшн плюс на тестирование с отладочным логом для
выяснения, кто не прав.
--
Игорь Сысоев
http://sysoev.ru