On 2/16/20 9:08 AM, Bernd Petrovitsch wrote:
Hi all!
Thanks for taking you time to look into this, I really appreciate it.
I have been using libev for a while in a project at work (currently
4.25), with success for quite a while, and I have now expanded the usage
in our service to also include the accepting of new connection (used
blocking accept before).
So I infer that you use now non-blocking sockets (both for
accept() and read())
You infer correctly :-)
I have a callback that gets called on every accept (where I loop on
EAGAIN to empty the backlog), and for each new socket I make an protocol
structure (class really). I read from the socket, and sometime it gives
me EAGAIN and sometimes i get data, all this is working as it should,
but !!!

I did like to try our the server by using apache benchmark, and this
worked really nice in the beginning (both localhost, and real lan), but
when i go up to about 20k connections, and concurrency of 500 i gets a
few sockets that I can't read from, at all. recv returns -1 and EAGAIN,
but it never gets any data.
-1 + EAGAIN neans that there is currently nothing to read()
or accept() ATM. So far perfectly normal.
Yeps, and it works really nice this far.
Do select()/poll() reprot before that there should be
somethign to read()/accept()?
As I am using libev with a EV_READ on listen socket and the same for the newly created socket, I guess libev default init "Do select()/poll() reprot" (I am using 4.25 on debian stable, that packaged version).
I order to check for any missing select errors (just a wild guess) I
select() also returns -1 (and sets errno) on errors ...

Yeps, I try to handle ALL error cases, on every step of the way, but the problem i have is not an error in any way, as "recv" returns EAGAIN as expected, but no data ever occur on the socket. In short i make a recv get EAGAIN, and no more EV_READ happens, like the socket is frozen.

I have even tested for double close, and extended the backlog just in case, but non gave any useful results.


also setup a reread timer when recv returns -1 (and EAGAIN) in order to
try read again, even on missing read event, but data still never arrives.

Are there something I am not aware of, or have others seen something
like this ? I really appreciate any comments, I have tried google and
found nothing useful on this specific subject.
I do not see any real bug up here anywhere.
I am both happy and sad at once to hear this :-)
Are you sure that each (logical) connection (in your
program) has a different file descriptor?

For each incoming connection i allocate a new "protocol" class, that takes ownership of the socket until the protocol is destroyed after proper termination. It is just a plain http server, so it is simple accept -> make protocol on socket -> recv header ....

Note that accept does not return the same socket before it have been closed, and the socket is closed on my protocol destruction. Had i have double close i would have a bad connection, but it is perfectly fin, but has no read data in rare ocasions !

I think I will try to build a small spike of this server, so there is some code to discus, I will return with this later when I have time to compile such.

Again, thanks for taking the time to understand my problem !

Regards

/BL


_______________________________________________
libev mailing list
[email protected]
http://lists.schmorp.de/mailman/listinfo/libev

Reply via email to