Welcome! Log In Create A New Profile

Advanced

Why return value from epoll_wait are always far lower than connections?

July 02, 2021 11:18AM
Hello, I'm new to this forum and not familiar with mail list system. If there're something I did wrong, please tell me.

In short, I have a general method (batching system call) and I try to apply into Nginx, then I found the weird behavior and can't
explain it.

To linux, connections and requests will be handled in `ngx_epoll_module.c`, following is snapshot about main job of the workers.
Workers will using epoll_wait to get the numbers of events which are already, then handle them in the following `for` loop. In each
iteration, worker will do some thing like sending file (system call: sendfile) to client.

```c
ngx_epoll_process_events(ngx_cycle_t *cycle, ngx_msec_t timer, ngx_uint_t flags)
{
...
events = epoll_wait(ep, event_list, (int) nevents, timer);
...
for (i = 0; i < events; i++) {
// handle events
....
}
```

As I observed, the value of `events` is relative to the numbers of connections. For example, in wrk (benchmarking tool), when I
set `c` option to 50, the value of events will usually be close to 50. As service time grow, the change will like:

```
1->1->1->50->50..... (close to 50)->50....
```

So far, it really make sense. Then, I apply my method: batching system call in each iteration. Following is snapshot:

```
ngx_epoll_process_events(ngx_cycle_t *cycle, ngx_msec_t timer, ngx_uint_t flags)
{
...
events = epoll_wait(ep, event_list, (int) nevents, timer);
...

my_batching_entry();

for (i = 0; i < events; i++) {
// handle events
}

my_batching_exit();

```

In above model, instead of executing system call (such as sendfile64) in each iteration, all of them will be executed until `my_batching_exit()` was called. It seems that it works correct (at least in wrk).

Ok, here is the part I found weird. Applying my method, I found that the value (events) return from `epoll_wait` will always be 1 or some really low value (far from 50). Are there any mechanism to cause it? (low numbers of ready events) ,Did Nginx think the requests were served too slow , so lowering my event numbers?

In my method, I only add two lines into Nginx (batching_entry and batching_exit) and Makefile. I means I didn't do a lot changes with Nginx.

Are there any possible to cause the number of events are far lower than connections number? Any suggestions will be appreciated!

Thanks in advance!


- Steven
Subject Author Posted

Why return value from epoll_wait are always far lower than connections?

yucheng.tw July 02, 2021 11:18AM



Sorry, only registered users may post in this forum.

Click here to login

Online Users

Guests: 173
Record Number of Users: 8 on April 13, 2023
Record Number of Guests: 421 on December 02, 2018
Powered by nginx      Powered by FreeBSD      PHP Powered      Powered by MariaDB      ipv6 ready