mirror of
https://github.com/emikulic/darkhttpd.git
synced 2023-08-10 21:13:08 +03:00
667edacaa3
A client making quick consecutive requests with keep-alive, such as `ab` with `-k`, can cause the connection to become hung. This happens because of an optimization in `http_poll` function. When a connection state becomes `DONE`, `httpd_poll` recycles the connection and immediately calls `poll_recv_request`. However, it doesn't handle this resulting in the connection state becoming `DONE` again. If this occurs, the state stays in `DONE`, and the further calls to `httpd_poll` ignore the connection. Fix this by calling `poll_recv_request` in a loop until the state is no longer `DONE`. * Enable TCP_NODELAY optimization It looks like `TCP_NODELAY` was disabled due to the bug fixed in the previous commit. Enabling it substantially improves keep-alive performance with `ab`: Before: ``` Time per request: 0.272 [ms] (mean) ``` After: ``` Time per request: 0.033 [ms] (mean) ``` * Remove keep-alive optimization from `httpd_poll` Benchmarking with `ab` shows that bypassing `select` for keep-alive connections in the `DONE` state doesn't significantly impact performance. Since this optimization previously caused a bug, remove it.
2 lines
54 B
Plaintext
2 lines
54 B
Plaintext
- send headers using sendfile syscall - fewer packets
|