Re: [PATCH 0/1] RFC: poll/select performance on datagram sockets
From: Davide Libenzi <hidden>
Date: 2010-10-29 20:09:04
Also in:
lkml
On Fri, 29 Oct 2010, Eric Dumazet wrote:
Le vendredi 29 octobre 2010 à 19:18 +0100, Alban Crequy a écrit :quoted
Hi, When a process calls the poll or select, the kernel calls (struct file_operations)->poll on every file descriptor and returns a mask of events which are ready. If the process is only interested by POLLIN events, the mask is still computed for POLLOUT and it can be expensive. For example, on Unix datagram sockets, a process running poll() with POLLIN will wakes-up when the remote end call read(). This is a performance regression introduced when fixing another bug by 3c73419c09a5ef73d56472dbfdade9e311496e9b and ec0d215f9420564fc8286dcf93d2d068bb53a07e. The attached program illustrates the problem. It compares the performance of sending/receiving data on an Unix datagram socket and select(). When the datagram sockets are not connected, the performance problem is not triggered, but when they are connected it becomes a lot slower. On my computer, I have the following time: Connected datagram sockets: >4 seconds Non-connected datagram sockets: <1 second The patch attached in the next email fixes the performance problem: it becomes <1 second for both cases. I am not suggesting the patch for inclusion; I would like to change the prototype of (struct file_operations)->poll instead of adding ->poll2. But there is a lot of poll functions to change (grep tells me 337 functions). Any opinions?My opinion would be to use epoll() for this kind of workload.
Yeah, epoll does check for event hints coming with the callback wakeup, and avoid waking up epoll_wait() waiters, for non matching events. Most of the devices we care about, have been modified to report the event mask with the wakeup call. - Davide