sysctl
动态修改内核的参数。修改后的参数支持在/proc/sys/
目录下查看,包含一些TCP/IP
堆栈和虚拟内存系统的高级选项。
介绍
- 通过配置合理的
sysctl
参数可提高系统的性能 sysctl
命令既可以读又可以写系统参数
sysctl 命令
sysctl (选项) (参数)
例子:
sysctl [-n] [-e] variable …
sysctl [-n] [-e] [-q] -w variable=value …
sysctl [-n] [-e] [-q] -p [filename]
sysctl [-n] [-e] -a
sysctl [-n] [-e] -A
选项:
-n:打印值时不打印关键字;
-e:忽略未知关键字错误;
-N:仅打印名称;
-w:当改变sysctl设置时使用此项;
-p:从配置文件“/etc/sysctl.conf”加载内核参数设置;
-a:打印当前所有可用的内核参数变量和值;
-A:以表格方式打印当前所有可用的内核参数变量和值。
参数:
- 变量=值:设置内核参数对应的值。注意等号两端不能有空格。
使用
查看系统变量
sysctl -a // 显示当前所有可用的内核参数
sysctl kernel.hostname // 读特定的内核参数,比如kernel.hostname
sysctl -a | grep hostname // 显示名称中带有“hostname”关键字的内核参数
修改系统变量
sysctl -w kernel.hostname=abc // 把hostname改为abc
简略一点:
sysctl kernel.hostname=abc // 把hostname改为abc
从配置文件加载内核参数
sysctl -p // 从配置文件sysctl.conf中加载内核参数
修改系统变量有两种方式,一种是上述修改系统变量
中的命令行方式,另一种是修改sysctl.conf
文件。sysctl.conf
文件一般在系统的/etc
目录下。在最后一行输入如下语句:
kernel.hostname=abc
然后需要执行sysctl -p
指令更新修改的内核参数配置文件,使其生效。
tcp_syn_retries
net.ipv4.tcp_syn_retries
表示建立 TCP
连接时,SYN
报文重试的次数,默认为 6
,链接超时时间(connect timeout)
为 127s(=2^0 + 2^1 + 2^2 + 2^3 + 2^4 + 2^5 + 2^6)
$ sysctl -a | grep tcp_syn_retries
net.ipv4.tcp_syn_retries = 6
F&Q
Linux SYNs包异常丢弃导致网络时断时续排查
使用 netstat 命令,查看网卡 syn/passive 的统计情况
[root@x ~]# netstat -s | grep -i syn
1523045 invalid SYN cookies received
46862 resets received for embryonic SYN_RECV sockets
1962353 SYNs to LISTEN sockets dropped
TCPSYNChallenge: 1874
TCPSynRetrans: 687620
TCPACKSkippedSynRecv: 18169
[root@x ~]# netstat -s | grep -i overflow
[root@x ~]#
[root@x ~]# netstat -s | grep -i passive
80469203 passive connection openings
1962935 passive connections rejected because of time stamp
SYNs to LISTEN sockets dropped
和 passive connections rejected because of time stamp
相差不大
将 /proc/sys/net/ipv4/tcp_tw_recycle
修改为 0
,drop情况就不发生
net.ipv4.tcp_tw_recycle = 1
表示开启TCP连接中 TIME-WAIT sockets
的快速回收,默认为0
,表示关闭- 修改方法如下
临时配置:
echo 0 > /proc/sys/net/ipv4/tcp_tw_recycle
永久配置:
$ vim /etc/sysctl.conf
net.ipv4.tcp_tw_recycle = 0
生效
sysctl -p
failed to create fsnotify watcher: too many open files
超过了系统默认的 fs.inotify.max_user_instances=128
,调整如下
sudo sysctl fs.inotify.max_user_instances=8192
echo fs.inotify.max_user_instances=8192| tee -a /etc/sysctl.conf && sudo sysctl -p