Reducing select() usage under load
    Erik Rozendaal 
    erik at deler.org
       
    Fri May 12 17:24:26 UTC 2006
    
    
  
Aaron Hopkins wrote:
> NSD currently only processes one UDP packet per socket per select().  Since
> select() is kind of expensive, under load this means it burns a lot of CPU
> unnecessarily.
> 
> There's a simple trick to avoid this.  Make the UDP socket non-blocking, and
> loop on recvfrom() until it returns -1, ignoring any EAGAIN errors.  Under
> light load, this results in an extra recvfrom() every packet.  But under
> heavy load, this avoids select() until the input buffer is drained.
But you will have to be careful not to starve other sockets that may 
have incoming requests waiting.  Since NSD will usually run with 
multiple sockets (UDP, TCP, IPv4, IPv6, multiple interfaces) this can 
become quite hard and/or expensive.  That's why NSD currently uses a 
select and processes all readable sockets (not just the first!) every 
iteration.
Regards,
Erik
    
    
More information about the nsd-users
mailing list