The behavior of the backlog argument on TCP sockets changed with Linux 2.2. Now it specifies the queue length for completely established sockets waiting
to be accepted, instead of the number of incomplete connection requests. The maximum length of the queue for incomplete sockets can be set using
/proc/sys/net/ipv4/tcp_max_syn_backlog. When syncookies are enabled there is no logical maximum length and this setting is ignored. See tcp(7) for more
information.
If the backlog argument is greater than the value in /proc/sys/net/core/somaxconn, then it is silently truncated to that value; the default value in this
file is 128. In kernels before 2.4.25, this limit was a hard coded value, SOMAXCONN, with the value 128.
tcp_max_syn_backlog 介绍:
socket 接收的所有连接都是存放在队列类型的数据结构中, 关键问题是这种队列有两个, 而且其长度都是可以设置的.
分别是下面两个内核参数:
/proc/sys/net/ipv4/tcp_max_syn_backlog
/proc/sys/net/core/somaxconn
其中:
tcp_max_syn_backlog 是指定所能接受 SYN 同步包的最大客户端数量, 即半连接上限;
somaxconn 参数介绍:
somaxconn 是指服务端所能 accept 即处理数据的最大客户端数量, 即完成连接上限.
对于没有调优的新装的 centOS6.5 系统, 这两个参数的值都是 128.
这么描述虽然精确, 但是没有一定基础, 不熟练网络编程的人理解起来很费劲.
打个简单的比方:
某某发布公告要邀请四海之内若干客人到场参加酒席. 客人参加酒席分为两个步骤:
1, 到大厅;
2, 找到座位 (吃东西, 比如糖果, 饭菜, 酒等).
tcp_max_syn_backlog 用于指定酒席现场面积允许容纳多少人进来;
somaxconn 用于指定有多少个座位.
显然 tcp_max_syn_backlog>=somaxconn.
如果要前来的客人数量超过 tcp_max_syn_backlog, 那么多出来的人虽然会跟主任见面握手, 但是要在门外等候;
如果到大厅的客人数量大于 somaxconn, 那么多出来的客人就会没有位置坐 (必须坐下才能吃东西), 只能等待有人吃完有空位了才能吃东西.
那么问题来了:
somaxconn 是内核里的参数, listen 函数有个参数 backlog, 如果在 listen 方法里面指定该参数大于 somaxconn 的值, 重新编译并启动程序, 服务端所能接收的完整的连接数上限是 backlog 呢还是 somaxconn?
答案很简单, listen 方法指定的 backlog 是在用户态指定的, 内核态的参数优先级高于用户态的参数, 所以即使在 listen 方法里面指定 backlog 是一个大于 somaxconn 的值, socket 在内核态运行时还会检查一次 somaxconn, 如果连接数超过 somaxconn 就会等待.
就相当于主人指定了能有多少座位没用, 客人到了现场, 准备入座时, 还要看酒店的客户经理判断能有多少个座位.
结论:
在没有调优的 centOS6.5 版本的服务器上, 由于受到系统级别的限制, 在该服务器上运行的服务端程序, 在同一时间, 最大只能接受 128 个客户端发起持久连接, 并且只能处理 128 个客户端的数据通信.
参考文档:
http://www.saunix.cn/1255.html
来源: http://blog.51cto.com/wujianwei/2104779