内核参数说明

参考: https://help.aliyun.com/document_detail/41334.html#h2–linux-


sysctl命令常用参数

sysctl命令能时动态地修改内核参数;
sysctl命令常用参数:
https://www.linuxcool.com/sysctl
https://wangchujiang.com/linux-command/c/sysctl.html

# 查看所有内核参数配置
sysctl -a

# 从所有配置中过滤指定配置
sysctl -a | grep net.ipv4.tcp_ecn

在这里插入图片描述

# 加载所有的sysctl配置文件
sysctl --system

# 加载/etc/sysctl.conf默认配置文件
sysctl -p

# 加载指定sysctl配置文件
sysctl -p /etc/sysctl.d/diy.conf

高可用优化

https://blog.51cto.com/yangrong/1321594
https://blog.51cto.com/oldboy/1336488


swap配置

https://blog.csdn.net/omaidb/article/details/106674391

# 当剩余多少系统内存时,再使用swap
vm.swappiness=0

# 当剩余10%内存时再使用swap
vm.swappiness=10

内存分配模式

vm.overcommit_memory 决定了内核如何处理内存分配请求的策略

# 启发式过度分配(默认)
vm.overcommit_memory=0

# 总是过度分配
vm.overcommit_memory=1

# 从不过度分配,避免系统因过度分配内存而崩溃
vm.overcommit_memory=2

关闭OOM机制

参考: https://wangshangyou.com/linux-oom.html

# 开启OOM,进程瞬间占满内存
## 默认为0表示开启OOM,开启后会自动kill掉瞬间占满内存的进程
## 1 表示关闭,内存不足时,直接系统重启
echo "
# 关闭OOM
vm.panic_on_oom=1 " >> /etc/sysctl.conf

热生效

# 立即关闭OOM机制
sysctl -w vm.panic_on_oom=1

# 等价于
echo 1 >/proc/sys/vm/panic_on_oom

调高内存预留水位线

在这里插入图片描述


自动释放cache,防止oom

我之前遇到过程序去请求内存资源,但是cache剩余内存打满且没释放导致请求内存失败,直接oom;

不检查物理内存是否够用

RHEL管理内存不足状态

https://www.modb.pro/db/25985
值为0:内存不足时,启动 OOM killer
值为1:内存不足时,有可能会触发 kernel panic(系统重启),也有可能启动 OOM killer
值为2:内存不足时,表示强制触发 kernel panic,内核崩溃GG(系统重启)。内核不会对内存请求进行限制,允许物理内存+交换空间总和的分配。

echo "
# 自动释放cache防止oom
vm.overcommit_memory=2" >> /etc/sysctl.conf

# 热生效
echo 2 >/proc/sys/vm/overcommit_memory

同一用户同时可以添加的watch数目

https://www.cnblogs.com/cheyunhua/p/14325314.html

# 同一用户同时可以添加的watch数目
## 默认值8192
fs.inotify.max_user_watches=524288

# 防止容器数量增加导致fs.inotify.max_user_instances超过限制
# 默认128
fs.inotify.max_user_instances=8192

解除Linux进程数和线程数及文件打开数


允许开启的线程数量

# 加大允许开启的线程数量
vm.max_map_count=262144

系统中可同时打开的文件数

# 系统中可同时打开的最大文件数目
fs.file-max=52706963

# 单个进程可分配的最大文件数
fs.nr_open=52706963

# 查看系统中可同时打开的最大文件数
sysctl fs.file-max

# 查看单进程可打开的最大文件数
sysctl fs.nr_open

在这里插入图片描述

在这里插入图片描述


限制用户最大进程数和最大文件打开数限制

参考: limits.conf配置文件说明

针对用户(*表示所有用户)限制方法限制类型限制的值
* 代表针对所有用户soft: 软限制noproc最大进程数11000
*hard: 硬限制nofile最大文件打开数4100
*-softhard全部限制noproc1100
*-nofile4100

修改Linux最大文件描述符及ulimit相关使用

osopenfile值,建议加大。
配置文件在/etc/security/limits.conf

# 针对所有用户软限制最大进程数
* soft noproc 11000
# 针对所有用户硬限制最大进程数
* hard noproc 11000

# 针对所有用户软限制最大文件打开数
* soft nofile 4100
# 针对所有用户硬限制最大文件打开数
* hard nofile 4100

软硬一起限制

# *代表针对所有用户,noproc是最大进程数
* - noproc 11000

# *代表针对所有用户,nofile是最大文件打开数
* - nofile 4100

使配置生效

重启系统或者重新登录用户才会让/etc/security/limits.conf 配置生效;

也可以通过重新加载PAM配置的方法让limits.conf配置热生效
重新加载 PAM 配置可能会导致当前用户会话中断或其他不可预测的结果。

# 重新加载 PAM(Pluggable Authentication Modules)配置
sudo systemctl restart systemd-logind

网络优化


提高网速

# 发送缓冲区(byte)
net.core.wmem_max=16777216
# 接收缓冲区(byte)
net.core.rmem_max=16777216

# 禁用 SYN Cookies,提高 TCP 连接的建立速度
## 不能防止 SYN 洪水攻击
net.ipv4.tcp_syncookies=0

# 最大 SYN 队列长度(默认128)
net.ipv4.tcp_max_syn_backlog=256

# FIN 超时时间
net.ipv4.tcp_fin_timeout=10

修改网络最大连接数

# 查看网络最大连接数
cat /proc/sys/net/core/somaxconn

在这里插入图片描述

# 默认网络最大连接数是128
net.core.somaxconn=1024

内核开启数据包转发功能

echo "
# 开启内核开启数据包转发
## 1为开启;0为关闭
net.ipv4.ip_forward=1 " >> /etc/sysctl.conf && sysctl -p

执行sysctl -p使内核配置生效

# 热生效
## 1为开启;0为关闭
echo 1 >/proc/sys/net/ipv4/ip_forward

启用arp代理

# 启用 ARP 代理(Proxy ARP)功能
net.ipv4.conf.all.proxy_arp=1

# 0:禁用 ARP 代理功能
# 1:启用 ARP 代理功能
# 2:只对连接到同一接口的主机进行代理
echo 1 >/proc/sys/net/ipv4/conf/all/proxy_arp

回应代理APR的数据包此网卡出去

# 回应代理ARP的数据包从接收到此代理ARP请求的网络接口出去
## 0:禁用在 PVLAN 中使用代理 ARP。
## 1:启用在 PVLAN 中使用代理 ARP
net.ipv4.conf.all.proxy_arp_pvlan=1

自动MTU

# 开启MTU黑洞检测,动态地调整数据包的大小
net.ipv4.tcp_mtu_probing=1

启用TCP窗口自动调整

TCP窗口大小可以动态地根据网络延迟和带宽进行调整,从而实现更高的数据传输效率。
启用TCP窗口缩放可以提高大带宽延迟产品网络的性能。这对于高速长距离网络连接非常有用。

# 启用TCP窗口缩放
net.ipv4.tcp_window_scaling=1

开启TCP低延时模式

TCP小缓冲区功能,并设置TCP连接为低延迟模式。这有助于减少延迟提高网络性能

# 低延迟模式
## 在高吞吐量情况下,这个选项应该禁用
net.ipv4.tcp_low_latency=1

# 连接结束时保存TCP连接信息,能提高性能,但会导致无法进行网络分析
net.ipv4.tcp_no_metrics_save=1

# 设置TCP延迟确认时间为1毫秒(默认40ms)
## Linux内核2.6.39之后的版本已移除该参数
net.ipv4.tcp_delack_min=1

TCP快速重传和快速恢复算法

# RFC 1337规范中的TCP快速重传和快速恢复算法
net.ipv4.tcp_rfc1337=1

开启快速TCP

在TCP第一次握手时就传输数据。

谨慎启用TFO:https://candrews.integralblue.com/2019/03/the-sad-story-of-tcp-fast-open/

0 — 表示TFO未开启
1 — 表示TFO开启了,但是只对客户端有效
2 — 表示TFO开启了,但是只对服务器端有效
3 — 表示TFO开启了,同时对客户端和服务器端有效

# 开启快速tcp
net.ipv4.tcp_fastopen=3

# TCP Fast Acknowledgment(快速确认)功能
net.ipv4.tcp_fack=1

# 热生效
echo 3 > /proc/sys/net/ipv4/tcp_fastopen

开启SACK(减少重传)

TCP Selective Acknowledgment(SACK)是一种扩展TCP协议的机制,用于改善网络拥塞控制和数据传输可靠性。其主要作用如下:

  1. 减少重传:在传输数据时,如果发生数据包丢失,传统的TCP协议会重传丢失的数据包及其后续数据包。而使用SACK机制后,接收方可以告诉发送方哪些数据包已经接收到,从而发送方只需要重传丢失的部分。

  2. 改善网络拥塞控制:SACK机制可以帮助TCP协议更准确地判断网络拥塞情况。当发生网络拥塞时,SACK机制可以帮助TCP协议更快地进行拥塞控制,从而减少网络拥塞对数据传输的影响。

  3. 提高数据传输可靠性:SACK机制可以更准确地标记已经接收到的数据包,从而提高数据传输的可靠性。即使发生一些数据包的丢失,SACK机制也可以让TCP协议更快地恢复数据传输。

综上所述,TCP Selective Acknowledgment(SACK)机制可以提高TCP协议在网络中的表现,减少数据重传,改善网络拥塞控制,提高数据传输可靠性。

禁用TCP延迟确认

: "减少重传"

# 启用 TIME_WAIT 状态的 TCP 连接的快速重用
net.ipv4.tcp_tw_reuse=1

# 启用 TIME_WAIT 状态的 TCP 连接的快速回收
net.ipv4.tw_recycle=1

# 减少段丢失时需要重传的段数目
## 默认为1
## 修改为0 ,表示 关闭checksum
# 开启SACK减少重传,改善丢包
# 启用选择性确认(Selective Acknowledgements)可以提高网络效率,尤其是在有丢包的情况下。
net.ipv4.tcp_sack=1

# 对sack的改进,能够检测不必要的重传
## 默认为1
net.ipv4.tcp_dsack=1

# 关闭checksum
# 参考:https://blog.51cto.com/u_15538975/10596897
net.ipv4.tcp_checksum=0

减少TCP发送KeepAlive消息间隔

# 设置 SYN+ACK 的重试次数。推荐值为 2。
## 默认值为5
net.ipv4.tcp_synack_retries = 2 

# 设置SYN的重试次数。推荐值为2
## 默认值为6
net.ipv4.tcp_syn_retries = 2

# 当TCP连接队列溢出时,启用rst复位以通知客户端
net.ipv4.tcp_abort_on_overflow = 1

# 将TCP连接空闲时发送KeepAlive消息的时间间隔设置为300秒(5分钟)
## 默认是7200秒(2小时)
net.ipv4.tcp_keepalive_time = 50

# 设置TCP keepalive探测的次数,推荐值为 5。
## 默认值为9
net.ipv4.tcp_keepalive_probes = 5

# 设置TCP keepalive探测的时间间隔。推荐值为15
## 默认值为75
net.ipv4.tcp_keepalive_intvl = 15

允许TCP/IP堆栈接受其他网络接口的数据包,使用不同的L3设备

Linux4.4+开始支持该参数.

# 允许TCP/IP堆栈接受其他网络接口的数据包,使用不同的L3设备
## 对虚拟机可能有用
## 在一些负载平衡或故障转移场景下可能很有用
net.ipv4.udp_l3mdev_accept = 1
net.ipv4.tcp_l3mdev_accept = 1

减少孤儿连接重试次数

# 孤儿连接重试次数
## 默认值是0(8次),调整为3次
net.ipv4.tcp_orphan_retries = 3

防止TCP不回包

https://blog.csdn.net/chenlycly/article/details/80369408

# 快速重用处于TIME_WAIT状态的tcp连接--只适用于rhel7
## 1为开启;降低系统负载
## 0为关闭,防止TCP不回包
net.ipv4.tcp_tw_recycle = 1

# 精确TCP时间戳,能提高网络性能,同时增加资源开销
## 发送数据时,会将一个timestamp(表示发送时间)放在包里面
# 启用TCP时间戳可以提高网络的性能,尤其是在有重复数据包的情况下
## 0为关闭,降低系统负载
## 默认为1,1为开启,防止TCP不回包
net.ipv4.tcp_timestamps = 0

# 热生效
echo "0" > /proc/sys/net/ipv4/tcp_tw_recycle

# 可能没这个文件
echo "0" > /proc/sys/net/ipv4/tcp_timestamps

调整GRO/LRO/GSO/UFO/UDP校验和

# 开启GRO,将一组连续的 UDP 数据报片段合并为单个数据报
ethtool -K ethX gro on

# 开启LRO,将多个接收到的 UDP 数据报组合成一个更大的数据报
ethtool -K ethX lro on

# GSO是将TCP大包拆分成多个小包
ethtool -K eth0 gso on

# UFO是将UDP大包拆分成多个小包 
ethtool -K eth0 ufo on

# 关闭UDP校验和计算
ethtool -K eth0 rx-checksumming off

调整网卡的RingBuffer(环形缓冲区)

# 查看网卡的RingBuffer(环形缓冲区)大小
ethtool -g <interface>

在这里插入图片描述

# 加大网卡的RingBuffer(环形缓冲区)
ethtool -G ens3 rx 4096 tx 4096

## 收到"netlink error: Operation not supported"错误消息;
## 这表示您的网络接口不支持通过ethtool命令调整RingBuffer大小。

启用BBR拥塞控制算法

结果让人失望,bbr2,bbr3 都不如 bbr1

# 加载tcp_bbr内核模块
modprobe tcp_bbr

# 在系统启动时自动加载tcp_bbr内核模块
echo tcp_bbr >/etc/modules-load.d/tcp_bbr.conf

# 查看tcp_bbr内核模块是否被加载
lsmod | grep bbr

在这里插入图片描述

# 查看支持的拥塞控制算法
sysctl net.ipv4.tcp_available_congestion_control

在这里插入图片描述

# 查看当前使用的拥塞控制算法
sysctl net.ipv4.tcp_congestion_control

在这里插入图片描述
启用BBR拥塞控制算法

# 指定Fair Queuing 公平队列调度器
net.core.default_qdisc=fq

# 启用BBR
net.ipv4.tcp_congestion_control=bbr

UDP优化

# 参考:https://leohsiao.com/Linux/系统内核/内核.html
# 指定 UDP 接收缓冲区的最小大小
## 1M==1048576
## 默认值 4096
net.ipv4.udp_rmem_min = 4096
# 指定 UDP 发送缓冲区的最小大小
## 1M==1048576
## 默认值 4096
net.ipv4.udp_wmem_min = 4096

# 调整 UDP 接收缓冲区的内存分配
## 最小值10M  默认值25M  最大值32M
## 默认值 18276        24371   36552 
# net.ipv4.udp_mem = 10485760  26214400  33554432
net.ipv4.udp_mem = 4096  33554432  33554432

网络安全优化

常见配置:https://eulixos.com/docs/2.0/SecHarden/%E5%86%85%E6%A0%B8%E5%8F%82%E6%95%B0.html#%E5%8A%A0%E5%9B%BA%E5%86%85%E6%A0%B8%E5%8F%82%E6%95%B0


禁用IPV6

https://help.aliyun.com/document_detail/162676.htm

echo "
# 关闭IPV6
## 1为开启;0为关闭
# 禁用系统中所有网络接口的 IPv6 功能
net.ipv6.conf.all.disable_ipv6=1
# 禁用默认网络接口的 IPv6 功能
## 默认网络接口是系统中除了 lo(回环接口)以外的所有网络接口
net.ipv6.conf.default.disable_ipv6=1
# 禁用回环接口 (lo) 的 IPv6 功能
net.ipv6.conf.lo.disable_ipv6=1" >> /etc/sysctl.conf

执行sysctl -p使内核配置生效

禁用指定网卡的IPV6

# 禁用指定网卡的IPV6
net.ipv6.conf.eth0.disable_ipv6=1

关闭IPV6内核模块的加载选项

# 指定内核模块的加载选项:关闭IPV6加载
echo "options ipv6 disable =1">/etc/modprobe.d/disable_ipv6.conf

热生效

# 热生效
## 1为开启‘禁用IPV6’;0为关闭‘禁用IPV6’
echo 1>/proc/sys/net/ipv6/conf/all/disable_ipv6
echo 1>/proc/sys/net/ipv6/conf/default/disable_ipv6
echo 1>/proc/sys/net/ipv6/conf/lo/disable_ipv6

禁止ping

echo "
# 禁ping
## 1为开启禁ping;0为关闭禁ping
net.ipv4.icmp_echo_ignore_all=1" >> /etc/sysctl.conf

执行sysctl -p使内核配置生效

0为允许ping(系统默认值),1为禁ping.

# 热生效
## 1为开启禁ping;0为关闭禁ping
echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_all

Centos7服务器优化脚本

参考: CentOS7一键优化安装脚本

Logo

更多推荐