查看和修改Linux实例内核参数
方法一:通过/proc/sys/目录查看和修改内核参数
/proc/sys/目录是Linux内核在启动后生成的伪目录,其目录下的net文件夹中存放了当前系统中开启的所有网络相关的内核参数,目录树结构与参数的完整名称相关,如net.ipv4.tcp_tw_recycle,它对应的文件是/proc/sys/net/ipv4/tcp_tw_recycle文件,文件的内容就是参数值。方法一中修改的参数值仅在当前运行中生效,系统重启后会回滚到历史值,一般用于临时性验证修改的效果。若需要永久性修改,请参见方法二。
- 查看内核参数:使用cat命令查看对应文件的内容,执行以下命令,查看net.ipv4.tcp_tw_recycle的值。
1cat /proc/sys/net/ipv4/tcp_tw_recycle - 修改内核参数:使用echo命令修改内核参数对应的文件,执行以下命令,将net.ipv4.tcp_tw_recycle的值修改为0。
1echo "0" > /proc/sys/net/ipv4/tcp_tw_recycle
方法二:通过sysctl.conf文件查看和修改内核参数
- 查看内核参数:执行sysctl -a命令,查看当前系统中生效的所有参数,系统显示类似如下:
12345678910111213141516171819202122net.ipv4.tcp_app_win = 31net.ipv4.tcp_adv_win_scale = 2net.ipv4.tcp_tw_reuse = 0net.ipv4.tcp_frto = 2net.ipv4.tcp_frto_response = 0net.ipv4.tcp_low_latency = 0net.ipv4.tcp_no_metrics_save = 0net.ipv4.tcp_moderate_rcvbuf = 1net.ipv4.tcp_tso_win_divisor = 3net.ipv4.tcp_congestion_control = cubicnet.ipv4.tcp_abc = 0net.ipv4.tcp_mtu_probing = 0net.ipv4.tcp_base_mss = 512net.ipv4.tcp_workaround_signed_windows = 0net.ipv4.tcp_challenge_ack_limit = 1000net.ipv4.tcp_limit_output_bytes = 262144net.ipv4.tcp_dma_copybreak = 4096net.ipv4.tcp_slow_start_after_idle = 1net.ipv4.cipso_cache_enable = 1net.ipv4.cipso_cache_bucket_size = 10net.ipv4.cipso_rbm_optfmt = 0net.ipv4.cipso_rbm_strictvalid = 1 - 通过以下两种方式,修改内核参数。
说明:调整内核参数后,内核处于不稳定状态,请务必重启实
1.执行以下命令,临时修改内核参数,例如:
12/sbin/sysctl -w net.ipv4.tcp_tw_recycle="0"/sbin/sysctl -w net.ipv4.tcp_mem="379008 505344 758016"2.通过修改配置文件的方式修改内核参数。
a.执行以下命令,修改/etc/sysctl.conf文件中的参数。
vim /etc/sysctl.conf
b.执行以下命令,使配置生效。
/sbin/sysctl -p
Linux网络相关内核参数引发的常见问题及处理
Linux网络相关内核参数引发的常见问题主要包括以下几种。
1.出现大量TIME_WAIT状态的连接。
2.出现大量CLOSE_WAIT状态的连接。
3.出现大量FIN_WAIT2状态的连接。
4.报“Time wait bucket table overflow”错误。
5.配置了NAT后 一会能访问服务器 一会无法访问服务器。
6.无法在本地网络环境(多人)通过SSH连接Linux实例。
出现大量TIME_WAIT状态的连接。
此处涉及的内核参数如下:
net.ipv4.tcp_syncookies
net.ipv4.tcp_tw_reuse
net.ipv4.tcp_tw_recycle
net.ipv4.tcp_fin_timeout
原因分析:服务器首先通过调用close()发起主动关闭,在发送最后一个ACK之后会进入time_wait的状态,服务器会保持2MSL时间之后才会回到初始状态。MSL值是数据包在网络中的最大生存时间。产生这种结果使得这个TCP连接在2MSL连接等待期间,定义这个连接的四元组(客户端IP地址和端口,服务端IP地址和端口号)不能被使用。
解决方法:
通过netstat或ss命令,可以看到大量处于TIME_WAIT状态的连接。
1 |
netstat -n | awk '/^tcp/ {++y[$NF]} END {for(w in y) print w, y[w]}' |
或者
1 |
ss -tan state time-wait |
执行以下命令,编辑系统内核配置。
1 |
vim /etc/sysctl.conf |
修改或加入以下内容:
1 2 3 4 |
net.ipv4.tcp_syncookies = 1 net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_tw_recycle = 1 net.ipv4.tcp_fin_timeout = 30 |
注意:对于服务端来说,在NAT环境中,开启net.ipv4.tcp_tw_recycle = 1配置可能导致校验时间戳递增,从而影响业务,不建议开启该功能。关于这四个内核参数的更多介绍,请参考以下内容:
net.ipv4.tcp_syncookies=1:开启SYN的cookies,当出现SYN等待队列溢出时,启用cookies进行处理。
net.ipv4.tcp_tw_reuse=1:允许将TIME-WAIT的socket重新用于新的TCP连接。如果新请求的时间戳,比存储的时间戳更大,则系统将会从TIME_WAIT状态的存活连接中选取一个,重新分配给新的请求连接。
net.ipv4.tcp_tw_recycle=1:开启TCP连接中TIME-WAIT的sockets快速回收功能。需要注意的是,该机制也依赖时间戳选项,系统默认开启tcp_timestamps机制,而当系统中的tcp_timestamps和tcp_tw_recycle机制同时开启时,会激活TCP的一种行为,即缓存每个连接最新的时间戳,若后续的请求中时间戳小于缓存的时间戳时,该请求会被视为无效,导致数据包会被丢弃。特别是作为负载均衡服务器的场景,不同客户端请求经过负载均衡服务器的转发,可能被认为是同一个连接,若客户端的时间不一致,对于后端服务器来说,会发生时间戳错乱的情况,因此会导致数据包丢失,从而影响业务。
net.ipv4.tcp_fin_timeout=30:如果socket由服务端要求关闭,则该参数决定了保持在FIN-WAIT-2状态的时间。