1)由于编写了中转服务器,需要支持较大数量的客户端长链接,所以比较关心服务程序的并发数。
在看到listen(int sockfd,int backlog)时,APUE里面说backlog是服务器存储未完成三次握手的链接数量和已经完成三次握手数量的之和,有些地方说backlog是服务器链接客户端的数量之和,这是不正确的.
经过查阅资料:1)backlog 由程序设置,最大值不能超过系统的somaxconn,如果超过最大值,listen 不一定会报错,但系统仍然使用系统的somaxconn作为最大值用。一般系统默认一个端口的最大监听队列长度为128.所以程序最好使用不超过128.
2)修改系统最大值的方法见下面,APUE上面的getenv("LISTENQ")无法获取到somaxconn的值.
3) 在linux下面,backlog不是未完成链接和已完成三次握手的总和,而是两者分别的最大值。
4)backlog表示的是监听队列的最大长度,不是服务器可以同时链接的客服端的长度.当客户端发起connect时候,这时占用的就是服务器的监听队列,所以backlog限制的是客户端connect的数量,当服务器调用accept时就会从监听队列里面提取出一个链接,这是监听队列里面的链接数量就会减少,所以只有ser accept处理请求较慢的时候,此时客户端connect的多,超过backlog的数量之后,才会出现新来的请求被拒绝的现象.
下面是转载的资料,讲解的比较详细.
net.core.somaxconn的作用
net.core.somaxconn是Linux中的一个kernel参数,表示socket监听(listen)的backlog上限。什么是backlog呢?backlog就是socket的监听队列,当一个请求(request)尚未被处理或建立时,他会进入backlog。而socket server可以一次性处理backlog中的所有请求,处理后的请求不再位于监听队列中。当server处理请求较慢,以至于监听队列被填满后,新来的请求会被拒绝。
在Hadoop 1.0中,参数ipc.server.listen.queue.size控制了服务端socket的监听队列长度,即backlog长度,默认值是128。而Linux的参数net.core.somaxconn默认值同样为128。当服务端繁忙时,如NameNode或JobTracker,128是远远不够的。这样就需要增大backlog,例如我们的3000台集群就将ipc.server.listen.queue.size设成了32768,为了使得整个参数达到预期效果,同样需要将kernel参数net.core.somaxconn设成一个大于等于32768的值。
如何修改net.core.somaxconn
Linux中可以工具syctl来动态调整所有的kernel参数。所谓动态调整就是kernel参数值修改后即时生效。但是这个生效仅限于os层面,对于Hadoop来说,必须重启应用才能生效。
命令
# sysctl -a
会显示所有的kernel参数及值。
修改参数值的语法
# sysctl -w net.core.somaxconn=32768
以上命令将kernel参数net.core.somaxconn的值改成了32768。这样的改动虽然可以立即生效,但是重启机器后会恢复默认值。为了永久保留改动,需要用vi在/etc/sysctl.conf中增加一行
net.core.somaxconn= 4000
然后执行命令
# sysctl -p
阅读(512) | 评论(0) | 转发(0) |