8.4.2. Socket Queue
Like the NIC hardware queue, the socket queue is filled by the network stack from the
softirq
context. Applications then drain the queues of their corresponding sockets via calls to read
, recvfrom
, and the like.
To monitor the status of this queue, use the
netstat
utility; the Recv-Q
column displays the queue size. Generally speaking, overruns in the socket queue are managed in the same way as NIC hardware buffer overruns (i.e. Section 8.4.1, “NIC Hardware Buffer”):
- Input traffic
- The first option is to slow down input traffic by configuring the rate at which the queue fills. To do so, either filter frames or pre-emptively drop them. You can also slow down input traffic by lowering the NIC's device weight[6].
- Queue depth
- You can also avoid socket queue overruns by increasing the queue depth. To do so, increase the value of either the
rmem_default
kernel parameter or theSO_RCVBUF
socket option. For more information on both, refer to Section 8.2, “Optimized Network Settings”. - Application call frequency
- Whenever possible, optimize the application to perform calls more frequently. This involves modifying or reconfiguring the network application to perform more frequent POSIX calls (such as
recv
,read
). In turn, this allows an application to drain the queue faster.
For many administrators, increasing the queue depth is the preferable solution. This is the easiest solution, but it may not always work long-term. As networking technologies get faster, socket queues will continue to fill more quickly. Over time, this means having to re-adjust the queue depth accordingly.
The best solution is to enhance or configure the application to drain data from the kernel more quickly, even if it means queuing the data in application space. This lets the data be stored more flexibly, since it can be swapped out and paged back in as needed.
[6]
Device weight is controlled via
/proc/sys/net/core/dev_weight
. For more information about device weight and the implications of adjusting it, refer to Section 8.4.1, “NIC Hardware Buffer”.