在redis2.8版本中有一個tcp-backlog配置, 說明如下:
# TCP listen() backlog.
#
# In high requests-per-second environments you need an high backlog in order
# to avoid slow clients connections issues. Note that the Linux kernel
# will silently truncate it to the value of /proc/sys/net/core/somaxconn so
# make sure to raise both the value of somaxconn and tcp_max_syn_backlog
# in order to get the desired effect.
tcp-backlog 100
然後執行ss命令顯示:
State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 100 *:6379 *:*
我們看到Send-Q的值為100, 即是我們配置的tcp-backlog值. 為了搞清楚這個值的意思, 瞭解了下tcp的三次握手進行中的一些queue的知識. 參考下圖我們可以看到在server接收到sny的時候會進入到一個syn queue佇列, 當server端最終收到ack時轉換到accept queue佇列. 上面終端顯示在listen狀態下的連線, 其Send-Q就是這個accept queue佇列的最大值. 只有server端執行了accept後才會從這個佇列中移除這個連線. 這個值的大小是受somaxconn影響的, 因為是取的它們兩者的最小值, 所以如果要調大的話必需修改核心的somaxconn值.
參考: http://jaseywang.me/2014/07/20/tcp-queue-%E7%9A%84%E4%B8%80%E4%BA%9B%E9%97%AE%E9%A2%98/