openssl-1.0.0d & proxy_buffering

Maxim Dounin mdounin на mdounin.ru
Вт Сен 6 08:52:31 UTC 2011


Hello!

On Tue, Sep 06, 2011 at 10:46:25AM +0400, Andrey N. Oktyabrski wrote:

> On 06.09.11 09:52, Maxim Dounin wrote:
> >>Великое закрытие выглядит так:
> >>08:04:15.534696 IP localhost.8273>  localhost.1079: Flags [FP.], seq
> >>185:378, ack 428, win 1792, options [nop,nop,TS val 3480164 ecr
> >>3480164], length 193
> >>08:04:15.534703 IP localhost.1079>  localhost.8273: Flags [.], ack
> >>379, win 1785, options [nop,nop,TS val 3480164 ecr 3480164], length
> >>0
> >>
> >>То есть, после того как mochiweb отправил [FP.] и получил в ответ
> >>ack, он считает соединение закрытым.
> >
> >Это штатное закрытие, обратный fin будет после того, как nginx
> >закроет соединение со своей стороны.  Надо смотреть подробнее,
> >похоже проблемы с kqueue на dragonfly.
> >
> >Для начала - собраться с --with-select_module --with-poll_module,
> >и убедиться, то при использовании других event method'ов проблема
> >исчезает.
> Похоже, оно. И с poll, и с select работает прекрасно.
> Что можно посмотреть подробнее? B sysctl практически ничего нет:
> $ sysctl -a | grep -i kq
> kern.kq_checkloop: 1000000
> kern.kq_calloutmax: 4096
> lwkt.kq_collisions: 40106
> 
> Единственное, я не знаю, постоянный рост lwkt.kq_collisions - это
> нормально, или нет?
> $ for i in `jot 11`; do sysctl lwkt.kq_collisions; sleep 1; done
> lwkt.kq_collisions: 41277
> lwkt.kq_collisions: 41279
> lwkt.kq_collisions: 41280
> lwkt.kq_collisions: 41283
> lwkt.kq_collisions: 41284
> lwkt.kq_collisions: 41285
> lwkt.kq_collisions: 41286
> lwkt.kq_collisions: 41287
> lwkt.kq_collisions: 41289
> lwkt.kq_collisions: 41290
> lwkt.kq_collisions: 41291

Я в DragonFly BSD понимаю чуть менее, чем ничего, так что по 
данному вопросу мало что могу прокоментировать.

Сама проблема выражается в том, что не ставится EV_EOF.  Тестовая 
программка прилагается.  Она создаёт socketpair(), после чего 
пишет в один из сокетов, и заводит kqueue смотреть за вторым.

Ожидаемое поведение: первый вызов kevent() возвращает EV_EOF, т.к. 
сокет с той стороны уже закрыт, тест завершается.  Именно такое 
поведение наблюдается на FreeBSD и NetBSD.

На DragonFly BSD EV_EOF не ставится, вызывается второй kevent() и 
ожидаемо виснет (потому как новых событий не происходит, а 
используется EV_CLEAR).

Feel free to report this to DragonFly BSD folks.

Maxim Dounin
-------------- next part --------------
A non-text attachment was scrubbed...
Name: test-kqueue.c
Type: text/x-csrc
Size: 1044 bytes
Desc: not available
URL: <http://mailman.nginx.org/pipermail/nginx-ru/attachments/20110906/febc2d89/attachment.bin>


Подробная информация о списке рассылки nginx-ru