リッスンバックログ
確立済みだが、まだ accept() されていないTCP接続のキューの大きさ。いっぱいになると新しいSYN+ACKやACKが捨てられ、クライアントにはタイムアウトとして見える。listen(fd, backlog) システムコールの引数で、通常は128。
Linuxにはキューが二つある。SYNキュー(ハーフオープン)と、acceptキュー(確立済みで accept() を待つもの)だ。上限を決めるのは tcp_max_syn_backlog と somaxconn。アプリがNを要求しても、カーネルは somaxconn で頭打ちにする(カーネル5.4以降の既定値は4096)。既定値は、Nginxが511、Postgresが128、MySQLが50だ。
キューが溢れる症状は、TCP再送と、負荷の急増時に断続的に起こるクライアントのタイムアウトである。監視には ss -lnti を使い、listenソケットのSend-Qを見る。調整は、負荷試験をして、アプリ側のlistenとsomaxconnの両方を引き上げる。