LINUX.ORG.RU

Процесс подвисает на epoll'e, при попытке его остановить

 , ,


0

1

Всем привет!

Проблема воспроизводится только на виртуальных машинах (VMware ESX 4). Мы грешим на то, что на виртуалках тайминги не очень хорошо работают. Возможно, ntpd немножко откатил время назад и epoll'у приплохело, но останавливать его не вариант (т.к. гоняются кластерные тесты).

Пока писал - родилась идея, как проверить, виноват ntpd или нет: останавливать его перед остановкой нашего процесса и запускать снова на старте.

Может у кого еще какие мысли есть? Backtrace вот такой:

#0  0x0000003cb3ed3453 in __epoll_wait_nocancel () from /lib64/libc.so.6
#1  0x0000000000428573 in ngx_epoll_process_events (cycle=0x15541c10, 
    timer=100, flags=1) at src/event/modules/ngx_epoll_module.c:572
#2  0x0000000000420088 in ngx_process_events_and_timers (cycle=0x15541c10)
    at src/event/ngx_event.c:245
#3  0x0000000000427013 in ngx_worker_process_cycle (cycle=0x15541c10, 
    data=<value optimized out>) at src/os/unix/ngx_process_cycle.c:819
#4  0x0000000000425777 in ngx_spawn_process (cycle=0x15541c10, 
    proc=0x426f28 <ngx_worker_process_cycle>, data=0x0, 
    name=0x6a9b79 worker
★★

Возможно, ntpd немножко откатил время назад и epoll'у приплохело, но останавливать его не вариант (т.к. гоняются кластерные тесты).

Во-первых, ntpd не должен ничего никуда откатывать и менять время. Он может чуть ускорять или чуть замедлять ход системного времени, при этом системное время продолжает увеличиваться монотонно. Во-вторых, epoll'у должно быть абсолютно пофиг на системное время.

Deleted ()
Ответ на: комментарий от Deleted

Да, странная мысль была. Я уже проверил, что не в этом дело. Собсно потому и пришел сюда - может у кого-нибудь какие-то идеи будут...

kulti ★★ ()

Можно запустить его под strace и вдумчиво разглядеть лог. А то вдруг он вполне справедливо висит в этом epoll_wait?

const86 ★★★★★ ()
Последнее исправление: const86 (всего исправлений: 1)

Глянь исходники ngx_epoll_process_events в src/event/modules/ngx_epoll_module.c:572

Если у epoll_wait последний параметр (timeout) -1, то тогда он ждет события не там, где его запускали (сокет закрылся?). А если >0, то проблема с измерением времени таймаута.

eagleivg ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.