服务覆盖:昆明·曲靖·玉溪·保山·昭通·丽江·普洱·临沧·楚雄·红河·文山·西双版纳·大理·德宏·怒江·迪庆

Linux服务器卡顿?几个内核参数调优,QPS翻倍不夸张

eycit 2026-04-17 -6 次阅读 系统安装
---

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//fdwc -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 -Ttail -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专家。

上一篇
SSD用了两年速度减半?四个设置让硬盘满血复活...
下一篇
你的密码在黑客眼里就是明文:7个原则让账号固若金汤...