Applications that handle a huge number of TCP connections, either as a server or as a client, will often see a large number of sockets in TIME_WAIT state. The sockets in TIME_WAIT can be seen with the “netstat -epn –tcp ” command. If the number of TIME_WAIT sockets gets too large, your address space will be exhausted, causing a disruption of TCP traffic.
The possible state values for TCP sockets are as follows:
Connection State | Meaning |
---|---|
BOUND | Bound, ready to connect or listen. |
CLOSED | Closed. The socket is not being used. |
CLOSING | Closed, then remote shutdown; awaiting acknowledgment. |
CLOSE_WAIT | Remote shutdown; waiting for the socket to close. |
ESTABLISHED | Connection has been established. |
FIN_WAIT_1 | Socket closed; shutting down connection. |
FIN_WAIT_2 | Socket closed; waiting for shutdown from remote. |
IDLE | Idle, opened but not bound. |
LAST_ACK | Remote shutdown, then closed; awaiting acknowledgment. |
LISTEN | Listening for incoming connections. |
SYN_RECEIVED | Active/initiate synchronization received and the connection under way |
SYN_SENT | Actively trying to establish connection. |
TIME_WAIT | Wait after close for remote shutdown retransmission. |
‘CLOSE_WAIT’ state means the other end of the connection has been closed while the local end is still waiting for the application to close.
Reducing CLOSE_WAIT connection
1. TCP_FIN_TIMEOUT
This setting determines the time that must elapse before TCP/IP can release a closed connection and reuse its resources. During this TIME_WAIT state, reopening the connection to the client costs less than establishing a new connection. By reducing the value of this entry, TCP/IP can release closed connections faster, making more resources available for new connections. Addjust this in the presense of many connections sitting in the TIME_WAIT state:
# echo 30 > /proc/sys/net/ipv4/tcp_fin_timeout (default: 60 seconds, recommended 15-30 seconds)
2. TCP_KEEPALIVE_INTERVAL
determines the wait time between isAlive interval probes. To set:
# echo 30 > /proc/sys/net/ipv4/tcp_keepalive_intvl (default: 75 seconds, recommended: 15-30 seconds)
3. TCP_KEEPALIVE_PROBES
determines the number of probes before timing out. To set:
# echo 5 > /proc/sys/net/ipv4/tcp_keepalive_probes (default: 9, recommended 5)
4. TCP_TW_RECYCLE
enables fast recycling of TIME_WAIT sockets. The default value is 0 (disabled). Known to cause some issues with hoststated (load balancing and fail over) if enabled, should be used with caution.
# echo 1 > /proc/sys/net/ipv4/tcp_tw_recycle (boolean, default: 0)
5. TCP_TW_REUSE
allows reusing sockets in TIME_WAIT state for new connections when it is safe from protocol viewpoint. Default value is 0 (disabled). It is generally a safer alternative to tcp_tw_recycle
# echo 1 > /proc/sys/net/ipv4/tcp_tw_reuse (boolean, default: 0)
For persistently setting above parameters, use the /etc/sysctl.conf
configuration file.