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