Linux内核参数优化提升性能:Linux内核参数优化
很多新手买了一台 Linux 服务器,配好环境后总觉得响应慢,却又不知道问题出在哪里。
其实只要调整几个内核参数,就能在不花一分钱的前提下让性能明显改善。
本文把 Linux内核参数优化提升性能 这件事拆成五步,零基础也能跟着做。
调整前必须确认的两件事
动手之前先确认两样东西:一是当前内核版本(影响参数是否可用),二是给系统拍个“快照”。
登录服务器后依次执行:
uname -r # 看版本,比如 5.4.0
sysctl -a > /tmp/sysctl_bak.txt # 备份全部当前参数
备份这一步非常关键——万一改错了,可以用 sysctl -p /tmp/sysctl_bak.txt 恢复(不过更安全的做法是记住改了哪些行)。
建议用 root 或具有 sudo 权限的用户操作。
最值得先动起来的五个参数
不要一次性修改几百个参数,新手只需要关注下面五个,性价比最高。
1. 提升并发连接能力:net.core.somaxconn
此参数控制 socket 监听队列的最大长度。
默认 128,并发稍高就会丢连接,比如 Nginx 或 Node.js 常见报错。
改成 1024:
echo "net.core.somaxconn = 1024" >> /etc/sysctl.conf
2. 降低 TIME_WAIT 堆积:net.ipv4.tcp_fin_timeout
缩短 TCP 连接关闭后的等待时间,默认 60 秒,改为 30 秒能释放更多端口:
echo "net.ipv4.tcp_fin_timeout = 30" >> /etc/sysctl.conf
3. 减少磁盘交换:vm.swappiness
控制系统使用交换分区的倾向,默认 60(偏高),对于内存充足的服务器建议改成 10 甚至 0:
echo "vm.swappiness = 10" >> /etc/sysctl.conf
4. 增大文件句柄限制:fs.file-max
高负载服务器很容易达到文件描述符上限,导致“Too many open files”。
先看当前值:
cat /proc/sys/fs/file-max
如果低于 100000,可以改成 1000000:
echo "fs.file-max = 1000000" >> /etc/sysctl.conf
5. 加快 TIME_WAIT 重用:net.ipv4.tcp_tw_reuse
注意:tcp_tw_recycle 已在较新内核中被移除,不要再用。tcp_tw_reuse 仍然可用,它允许将 TIME_WAIT 状态的 socket 用于新连接:
echo "net.ipv4.tcp_tw_reuse = 1" >> /etc/sysctl.conf
全部添加完后执行生效:
sysctl -p
最容易翻车的三个坑
- 不要在已有业务运行的服务器上一次性批量修改。改完后最好观察一两天,如果出现连接异常,优先回退。
- tcp_tw_recycle 不要碰。这个参数在 NAT 环境下会引起丢包,而且从内核 4.12 开始已经被移除,写进去只会报错。
- vm.swappiness 设为 0 并不适合所有场景。如果内存紧张(比如只有 1G),建议保持 10 以上,否则 OOM Killer 会更频繁。
如果修改后系统启动异常,可以进入单用户模式或者挂载 LiveCD 后编辑 /etc/sysctl.conf 删除有问题的行。
如何确认参数已经生效
最简单的方法是用 sysctl 直接查:
sysctl net.core.somaxconn
sysctl vm.swappiness
返回的值就是你设置的值。
更彻底的验证可以用 sysctl -a | grep <参数名> 看所有。
想测试并发性能提升,可以用 Apache Bench 或 wrk 简单压测一下。
比如:
# 安装 ab(Apache Bench),CentOS 用 yum install httpd-tools,Ubuntu 用 apt install apache2-utils
ab -n 10000 -c 200 http://localhost/
对比优化前后的 Requests per second 和 Failed requests,数字会说话。
写在最后
Linux内核参数优化提升性能 这件事核心就是“对症下药”。
不要为了调优而调优,先明确你的瓶颈是连接数、磁盘交换还是文件句柄,再对应调整上面几个参数。
遇到异常时,第一时间查看 /var/log/messages 或 dmesg 输出,并用最开始的备份文件做恢复。
按照本文的步骤走一遍,你的服务器通常会有立竿见影的改善。