Nginx-ru mailing list archive (nginx-ru@sysoev.ru)
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: openssl-1.0.0d & proxy_buffering
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
#include <sys/types.h>
#include <sys/event.h>
#include <sys/time.h>
#include <sys/socket.h>
#include <sysexits.h>
#include <err.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int
main()
{
int sock[2];
struct kevent kc;
int kq;
char foo[1024];
if (socketpair(PF_LOCAL, SOCK_STREAM, 0, sock) < 0)
err(EX_TEMPFAIL, "socketpair");
if (write(sock[0], foo, sizeof(foo)) < 0)
err(EX_TEMPFAIL, "write");
close(sock[0]);
EV_SET(&kc, sock[1], EVFILT_READ, EV_ADD | EV_CLEAR, 0, 0, 0);
kq = kqueue();
if (kevent(kq, &kc, 1, NULL, 0, NULL) < 0)
err(EX_TEMPFAIL, "kqueue");
if (kevent(kq, NULL, 0, &kc, 1, NULL) < 0)
err(EX_TEMPFAIL, "kevent1");
printf("kevent1 done, flags: %04x\n", kc.flags);
if (kc.flags & EV_EOF) {
printf("kevent1 reported EOF, exiting\n");
exit(0);
}
if (kevent(kq, NULL, 0, &kc, 1, NULL) < 0)
err(EX_TEMPFAIL, "kevent2");
printf("kevent2 done, flags: %04x\n", kc.flags);
exit(0);
}
_______________________________________________
nginx-ru mailing list
nginx-ru@xxxxxxxxx
http://mailman.nginx.org/mailman/listinfo/nginx-ru
|