SocketServer中的BACKLOG - xbwen/xbwen.github.io GitHub Wiki
1、Java SocketServer的BACKLOG
当有大量的客户端请求连接到SocketServer时,未能立刻处理的请求将进入一个等待队列,BACKLOG就标识了该队列的最大长度,如果等待的连接请求超出了队列的最大长度,这些请求就会被拒绝。
java.net.SocketServer的其中一个构造函数,提供了BACKLOG参数的设置:
public ServerSocket(int port, int backlog) throws IOException
如果使用另一个构造函数,不设置BACKLOG,则其默认值为50:
public ServerSocket(int port) throws IOException
如果使用Netty,可以通过如下方法设置BACKLOG参数:
ServerBootstrap b = new ServerBootstrap();
b.option(ChannelOption.SO_BACKLOG, 10240);
2、Linux内核的BACKLOG
通过上述方法,在应用层把BACKLOG设置成了10240,等待队列的最大长度就真的变成10240了吗?不一定,因为这还需要底层操作系统的支持。
Linux有一个内核参数net.core.somaxconn,代表的就是OS层面的BACKLOG值,其默认值为128。
通过命令
# sysctl –a
可以查看所有Linux Kernel的参数值。
通过命令
# sysctl -w net.core.somaxconn=32768
可以修改net.core.somaxconn的值。这样的改动虽然可以立即生效,但是重启机器后会恢复默认值。为了永久保留改动,需要用vi在/etc/sysctl.conf中增加一行:
net.core.somaxconn = 32768
然后执行命令:
# sysctl -p