Kqueue + Libevent

Adrian Chadd adrian at freebsd.org
Fri Aug 19 11:39:39 UTC 2011


I've not seen this happen before, are you sure that libevent's kqueue
code is properly removing all the pending events for a given FD when
it's closed?



Adrian

On 19 August 2011 18:33, about bus <aboutbus at gmail.com> wrote:
> Hello!
>
> I've got some interesting problem with my own server which use Libevent and
> Kqueue.
> Kqueue holds some sockets for a long time (while reading data) and gives it
> back to application when another side closes connection.
>
> I have server with FreeBSD 7.2 which serves several thousands requests per
> second.
> Nginx -> statical requests, images
>         -> backend for dynamical requests: Libevent based http server
> written on C
>
> Sometimes, about 0.1% of request, Nginx displays error: "Operation timed out
> while reading response from upstream."
> Switching Libevent from Kqueue to Poll in my http server fixes the problem.
> Poll works fine without errors in Nginx log file.
>
> Debug output for timeouted requests from Libevent:
> 1) Libevent accepts incoming connection from Nginx.
> 2) Libevent adds socket to Kqueue for waiting incoming data with HTTP
> request.
> 3) No events on socket for 60 seconds, no received data. (60 - timeout value
> in Nginx config)
> 4) On the another side Nginx closes connection and displays timeout error.
> 5) At the same time Kqueue reports about incoming data and returns socket to
> Libevent.
> 6) Libevent reads correct HTTP request from socket and passes it to my
> handler.
>
> Why Kqueue does not reports about read event for so long time?
> Why Kqueue do it only when another side closes connection?
> It is strange, because Poll does not have such problems.
> _______________________________________________
> freebsd-hackers at freebsd.org mailing list
> http://lists.freebsd.org/mailman/listinfo/freebsd-hackers
> To unsubscribe, send any mail to "freebsd-hackers-unsubscribe at freebsd.org"
>


More information about the freebsd-hackers mailing list