一、ChannelOption
ChannelOption.SO_BACKLOG 对应的是tcp/ip协议listen函数中的backlog参数,函数listen(int socketfd,int backlog)用来初始化服务端可连接队列 服务端处理客户端连接请求是顺序处理的,所以同一时间只能处理一个客户端连接,多个客户端来的时候, 服务端将不能处理的客户端连接请求放在队列中等待处理,backlog参数指定了队列的大小
ChannelOption.SO_REUSEADDR 对应于套接字选项中的SO_REUSEADDR,这个参数表示允许重复使用本地地址和端口, 比如,某个服务器进程占用了TCP的80端口进行监听,此时再次监听该端口就会返回错误,使用该参数就可以解决问题, 该参数允许共用该端口,这个在服务器程序中比较常使用,
Channeloption.SO_KEEPALIVE参数对应于套接字选项中的SO_KEEPALIVE,该参数用于设置TCP连接,当设置该选项以后,连接会测试链接的状态, 这个选项用于可能长时间没有数据交流的连接。当设置该选项以后,如果在两小时内没有数据的通信时,TCP会自动发送一个活动探测数据报文。
ChannelOption.SO_SNDBUF(发送缓冲区)和ChannelOption.SO_RCVBUF(接受缓冲区) 参数对应于套接字选项中的SO_SNDBUF,参数对应于套接字选项中的SO_RCVBUF这两个参数用于操作接收缓冲区和发送缓冲区的大小, 接收缓冲区用于保存网络协议站内收到的数据,直到应用程序读取成功,发送缓冲区用于保存发送数据,直到发送成功。
- FixedRecvByteBufAllocator:固定长度的接收缓冲区分配器,由它分配的 ByteBuf 长度都是固定大小的,并不会根据实际数据报的大小动态收缩。但是,如果容量不足,支持动态扩展。动态扩展是 Netty ByteBuf 的一项基本功能,与 ByteBuf 分配器的实现没有关系;
- AdaptiveRecvByteBufAllocator:容量动态调整的接收缓冲区分配器,它会根据之前 Channel 接收到的数据报大小进行计算,如果连续填充满接收缓冲区的可写空间,则动态扩展容量。如果连续 2 次接收到的数据报都小于指定值,则收缩当前的容量,以节约内存。
ChannelOption.SO_LINGER 参数对应于套接字选项中的SO_LINGER,Linux内核默认的处理方式是当用户调用close()方法的时候,函数返回,在可能的情况下, 尽量发送数据,不一定保证会发送剩余的数据,造成了数据的不确定性,使用SO_LINGER可以阻塞close()的调用时间,直到数据完全发送
ChannelOption.TCP_NODELAY 参数对应于套接字选项中的TCP_NODELAY,该参数的使用与Nagle算法有关Nagle算法是将小的数据包组装为更大的帧然后进行发送, 而不是输入一次发送一次,因此在数据包不足的时候会等待其他数据的到了,组装成大的数据包进行发送,虽然该方式有效提高网络的有效负载, 但是却造成了延时,而该参数的作用就是禁止使用Nagle算法,使用于小数据即时传输,于TCP_NODELAY相对应的是TCP_CORK, 该选项是需要等到发送的数据量最大的时候,一次性发送数据,适用于文件传输。
二、linux 方面
最大句柄数修改:长连接的接入,首先需要优化的就是 Linux 内核参数,其中 Linux 最大文件句柄数是最重要的调优参数之一,默认单进程打开的最大句柄数是 1024,当单个推送服务接收到的链接超过上限后,就会报“too many open files”,所有新的客户端接入将失败。通过 ulimit -a 可以查看相关参数
通过 vi /etc/security/limits.conf 添加如下配置参数:修改之后保存,注销当前用户,重新登录,通过 ulimit -a 查看修改的状态是否生效。
注意:该参数可以将单个进程打开的最大句柄数修改的非常大,但是当句柄数达到一定数量级之后,处理效率将出现明显下降,因此,需要根据服务器的硬件配置和处理能力进行合理设置,并非越大越好。