theme: default themeName: "默认主题" title: "Linux服务器卡顿?几个内核参数调优,QPS翻倍不夸张"
Linux服务器卡顿?几个内核参数调优,QPS翻倍不夸张
Linux系统的默认内核参数是为通用场景设计的,对高并发、高IO的场景来说,这些保守的默认值反而成了性能瓶颈。我见过很多服务器,CPU和内存都还很宽裕,但请求就是跑不快,一查sysctl参数,十有八九全是默认值。
今天说几个实战中最常用、效果最明显的内核参数调优。
文件描述符限制:默认值太小了
Linux对每个进程能打开的文件数量有限制,默认是1024。这个数字对于一个跑着Web服务、数据库连接、日志文件的服务器来说,分分钟不够用。
检查当前限制:
ulimit -n
修改方法:编辑`/etc/security/limits.conf`,添加:
* soft nofile 65535
* hard nofile 65535 * soft nproc 65535 * hard nproc 65535
然后编辑`/etc/pam.d/common-session`或`/etc/pam.d/system-auth`,确保有:
session required pam_limits.so
最后编辑`/etc/sysctl.conf`,添加:
fs.file-max = 2097152
执行`sysctl -p`让配置生效。
| 对于Nginx、MySQL、Redis这些需要大量连接的服务,这个改动是必须的。改完后观察进程的实际打开文件数是否符合预期:`ls /proc/ | wc -l`。 |
网络参数调优:应对高并发连接
高并发场景下,Linux默认的网络参数会产生大量TIME_WAIT状态的连接,占用端口和内存资源,影响新连接建立。
在`/etc/sysctl.conf`里添加以下参数:
# 复用TIME_WAIT状态的连接
net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_tw_recycle = 1
减少TIME_WAIT超时时间
net.ipv4.tcp_fin_timeout = 15
扩大端口范围,支持更多连接
net.ipv4.ip_local_port_range = 1024 65535
TCP缓冲区调大
net.core.rmem_max = 16777216 net.core.wmem_max = 16777216 net.ipv4.tcp_rmem = 4096 87380 16777216 net.ipv4.tcp_wmem = 4096 65536 16777216
监听队列长度
net.core.somaxconn = 65535 net.core.netdev_max_backlog = 65535
开启TCP快速打开
net.ipv4.tcp_fastopen = 3
解释一下关键参数的作用:
tcp_tw_reuse=1 允许将TIME_WAIT状态的socket重新用于新的TCP连接,这对HTTP短连接场景特别有用。tcp_fin_timeout调小可以更快释放FIN_WAIT状态的连接。
somaxconn和netdev_max_backlog是Nginx、Redis等服务器监听队列的长度,如果业务并发量很大但连接经常报错"connection refused",大概率是这两个值太小了。
内存参数:swappiness和oom_adj
swappiness参数控制Linux使用swap的激进程度,默认是60(满60% RAM就开始swap out)。对于物理内存充足的服务器,这个默认值太保守了,会导致系统频繁把不常用的内存页换出到磁盘,拖慢响应速度。
建议把swappiness调低:
vm.swappiness = 10
对于数据库服务器,swappiness设成0都不为过——宁可OOM杀掉进程,也不要用swap,因为数据库对内存的实时性要求很高,一旦开始swap,性能会崩溃式下降。
另外,对于重要的服务进程,可以用oom_adj调整其OOM优先级,让它在内存紧张时更容易存活:
echo -15 > /proc//oom_adj
数值范围是-17到15,数值越小优先级越高。MySQL、Nginx、Redis这些核心服务建议设置成-10或-15。
磁盘IO调度:选对算法很重要
Linux有多种IO调度算法,不同的场景应该用不同的调度器:
- deadline:对延迟敏感的场景最优,MySQL、Redis等数据库推荐
- mq-deadline:多队列版本的deadline,SSD/NVMe推荐
- bfq:适合桌面场景,多媒体应用优先
- noop:FIFO队列,最适合SSD,SSD本身有独立的调度算法,内核层的调度是多余的
查看当前调度器:
cat /sys/block/sda/queue/scheduler
临时修改(重启失效):
echo deadline > /sys/block/sda/queue/scheduler
永久修改:编辑/etc/default/grub,找到GRUB_CMDLINE_LINUX行,添加:
elevator=deadline
然后执行update-grub并重启。
对于NVMe盘,noop调度器通常是最优选择,因为NVMe自带强大的内部调度,不需要操作系统层再做一次调度。
生效验证:调完参数怎么确认
参数改完后,最重要的事情是验证是否生效、是否有副作用。
查看当前生效的所有sysctl参数:sysctl -a | grep <关键词>
压测验证:
用wrk或ab对服务做压力测试,对比调参前后的QPS和延迟数据。不要凭感觉,要用数据说话。
监控异常:| 调参后用dmesg -T | tail -50查看内核日志,看有没有错误信息。内存参数改错了容易触发OOM killer,网络参数改激进了在高并发时可能产生问题。 |
一个调优效果明显的案例
给一家电商客户做服务器优化,16核CPU、64G内存的MySQL服务器,单机QPS只能跑到8000左右,但CPU利用率只有30%,内存也没跑满,明显是系统参数限制而不是硬件瓶颈。
检查后发现:
- somaxconn默认值128,Nginx过来的连接队列根本接不住
- file-max默认值太低,MySQL最大连接数被系统限制
- swappiness默认60,数据库内存充足但系统还是频繁swap
调参后重新压测,QPS直接拉到22000,整整2.7倍提升。而这次改动没有动任何一行代码、没有升级任何硬件,纯粹是参数调整。
这就是系统参数调优的价值:让硬件资源被真正用起来,而不是被保守的系统设置卡住。
希望本文的教程对你有所帮助。如有疑问或需要专业技术支持,可通过以下方式联系我们:
📞 服务热线:13708730161 💬 微信:eyc1689 📧 邮箱:service@eycit.com
易云城IT服务,您身边的IT专家。