Socket缓冲区
应用程序通过socket()系统调用来创建一个通信端点,每个socket都会关联一个读写缓冲区,如果缓冲区的大小设置太小会导致应用程序调用阻塞,直到内核可以为所有的数据提供存储空间,若应用程序选择不阻塞运行,则内核向应用程序返回一个错误信息表明此时无法接纳如此大的数据量,并重新尝试写操作
Socket相关参数
1、net.core.wmem_default
2、net.core.rmem_default
3、net.core.wmem_max
4、net.core.rmem_max
以下是内核在启动时基于系统中的可用内存大小对这些参数的初始值进行调整
内存 | <=4kB | <=128KB | >128KB |
rmem_default | 32KB | 64KB | 64KB |
wmem_default | 32KB | 64KB | 64KB |
rmem_max | 32KB | 64KB | 128KB |
wmem_max | 32KB | 64KB | 128KB |
5、net.core.netdev_max_backlog,该参数定义了将排队传递给设备队列的输入报文最大数量。其默认值为300,这对于繁重的网络载荷来说通常是太小了。增加该参数值可允许排队更多的报文并减少丢弃的报文数量。尤其在具有长延迟的网络上,报文丢弃现象会严重降低吞吐率。
6、net.core.somaxconn,这是通过listen()系统调用可以指定最大accept队列backlog,或者挂起的连接请求数量,当排队的输入连接请求书达到该值时,将丢弃后续的连接请求,增加改制可允许繁忙的服务器指定更大的请求backlog,最大值默认为128.
7、optmem_max,该变量是socket缓冲区的最大初始长度,单位B
socket状态
CLOSED | 没有使用这个套接字[netstat 无法显示closed状态] |
LISTEN | 套接字正在监听连接[调用listen后] |
SYN_SENT | 套接字正在试图主动建立连接[发送SYN后还没有收到ACK] |
SYN_RECEIVED | 正在处于连接的初始同步状态[收到对方的SYN,但还没收到自己发过去的SYN的ACK] |
ESTABLISHED | 连接已建立 |
CLOSE_WAIT | 远程套接字已经关闭:正在等待关闭这个套接字[被动关闭的一方收到FIN] |
FIN_WAIT_1 | 套接字已关闭,正在关闭连接[发送FIN,没有收到ACK也没有收到FIN] |
CLOSING | 套接字已关闭,远程套接字正在关闭,暂时挂起关闭确认[在FIN_WAIT_1状态下收到被动方的FIN] |
LAST_ACK | 远程套接字已关闭,正在等待本地套接字的关闭确认[被动方在CLOSE_WAIT状态下发送FIN] |
FIN_WAIT_2 | 套接字已关闭,正在等待远程套接字关闭[在FIN_WAIT_1状态下收到发过去FIN对应的ACK] |
TIME_WAIT | 这个套接字已经关闭,正在等待远程套接字的关闭传送[FIN、ACK、FIN、ACK都完毕,这是主动方的最后一个状态,在过了2MSL时间后变为CLOSED状态] |
TCP缓冲区与内存管理
1、net.ipv4.tcp_rmem(/proc/sys/net/ipv4/tcp_rmem)
TCP Socket读缓冲区的默认长度(net.ipv4.tcp_rmem) | |||
最小长度 net.ipv4.tcp_rmem[0] |
默认长度(最大值受限核心socket的最大长度,net.core.rmem_max) net.ipv4.tcp_rmem[1] |
最大长度 net.ipv4.tcp_rmem[2] |
|
内存短缺 | PAGE_SIEZE | 43689 | 43689*2 |
内存正常 | 4KB | 87380 | 87380*2 |
2、net.ipv4.tcp_wmem(/proc/sys/net/ipv4/tcp_wmem)
TCP Socket写缓冲区的默认长度(net.ipv4.tcp_wmem) 写缓冲区容量很大时,应用程序可以将大量数据传输至写缓存区而不会引起阻塞 |
|||
最小长度 net.ipv4.tcp_wmem[0] |
默认长度 net.ipv4.tcp_rmem[1] |
最大长度 net.ipv4.tcp_wmem[2] |
|
内存短缺 | 4KB | 16KB | 64KB |
内存正常 | 4KB | 16KB | 128KB |
增加TCP Socket缓冲区长度示例 |
|||
最小长度 |
默认长度 |
最大长度 |
|
TCP写缓存区 | 8KB | 436600 | 873200 |
TCP读缓存区 | 32KB | 436600 | 873200 |
3、net.ipv4.tcp_mem[]
net.ipv4.tcp_mem[0],并不认为自身存在着内存压力时的页数上限
net.ipv4.tcp_mem[1],进入内存压力区域时的页数
net.ipv4.tcp_mem[2],拒绝后续socket分配时的页数
示例:net.ipv4.tcp_mem=1000000 1001024 1002048
每个socket缓冲区都会消耗大量内存,这限制了系统中的其他活动可以使用的内存量。
TCP连接管理
1、net.ipv4.tcp_max_syn_backlog,该变量控制每个端口的TCP Syn队列长度。如果连接请求数量多于该参数值的话,则连接请求会被丢弃。如果客户无法成功连接繁忙服务器,则可以增加该参数值
定义了处于SYN_RECV的TCP最大连接数,当处于SYN_RECV状态的TCP连接数超过tcp_max_syn_backlog后,会丢弃后续的SYN报文
netstat -an | grep SYN_RECV | wc -l
2、net.ipv4.tcp_synack_retries,该变量控制内核向某个输入SYN/ACK段重新发送响应的次数,降低其取值,能更早检测到来自远程主机的连接失败尝试
3、net.ipv4.tcp_retries2,该变量控制内核向已建立连接的远程主机重新发送数据的次数,如果降低其取值,就能更早检测到与远程主机的连接失效,因而繁忙服务器可以快速释放掉该失效连接的相关资源,并且服务器可以更方便地支持更多的并发连接。该变量默认值为15。由于TCP的重传机制采用指数回退算法,通常需要经过相当长的一段时间后才放弃一条已建立的连接
TCP连接保持管理
1、net.ipv4.tcp_keepalive_time,如果再该参数指定的秒数内某条连接始终处于空闲状态,则内核向远程主机发起对该连接的探测过程
2、net.ipv4.tcp_keepalive_intvl,该参数以秒为单位规定内核向远程主机发送的保活探针的时间间隔
3、net.ipv4.tcp_keepalive_probes,该参数规定内核为了检测远程主机是否存货而向其发送的保活探针的最大数量。如果内核发送的探针数量已超过该的参数值却仍未收到响应,即可断定远程主机不再可达,关闭该连接并释放与该连接相关的所有本地资源。
示例:
net.ipv4.tcp_keepalive_time = 7200s
net.ipv4.tcp_keepalive_intvl = 9
net.ipv4.tcp_keepalive_probes = 75s
IP端口范围
net.ipv4.ip_local_port_range,当系统的内存超过128KB,该参数的取值范围为32768~61000