Linux内核调优实战:从卡顿到丝滑的5个核心技巧

69 阅读3分钟

你是不是也遇到过服务器明明配置很高,却总在高并发时卡顿?其实问题可能藏在内核的“默认设置”里。今天就用5个实战技巧,带你解锁内核潜能,让系统性能翻倍!

一、网络子系统:让TCP连接“跑”起来

  1. 缩短连接回收时间 默认情况下,TCP连接关闭后会在 FIN-WAIT-2 状态等待60秒才释放资源,高并发场景下容易堆积大量 TIME_WAIT 连接。通过缩短超时时间(如设为15秒),能快速释放端口资源:

sysctl -w net.ipv4.tcp_fin_timeout=15  

同时开启 TIME_WAIT 复用( net.ipv4.tcp_tw_reuse=1 ),让旧连接端口“二次利用”,解决端口耗尽问题。

  1. 扩大临时端口范围 系统默认临时端口范围(32768-61000)仅约2.8万个,高并发时根本不够用!直接扩容到1024-65535,瞬间提升连接容量:

sysctl -w net.ipv4.ip_local_port_range="1024 65535"  

  1. 切换BBR拥塞算法 传统CUBIC算法在高速网络中容易“堵车”,而BBR算法能动态探测带宽,减少延迟。一行命令切换,让长距离传输速度提升30%+:

sysctl -w net.ipv4.tcp_congestion_control=bbr



二、I/O调度器:给磁盘“找个好管家”
1. SSD选“无调度”,HDD用“ deadline”
- 固态硬盘(SSD):没有机械延迟,推荐`none`或`kyber`调度器,减少“画蛇添足”的排序开销:  
  ```bash
  echo none > /sys/block/sda/queue/scheduler
 

- 机械硬盘(HDD):用 mq-deadline 调度器按“截止时间”排序请求,减少磁头来回移动,提升吞吐量。

2. 调整I/O队列深度
磁盘队列深度( nr_requests )就像“快递中转站容量”,太少会“堵车”,太多会“爆仓”。SSD建议设为64-128,HDD设为32-64,平衡并行性和延迟:


echo 64 > /sys/block/sda/queue/nr_requests
 

三、内存管理:让“缓存”更聪明

1. 优化页缓存刷新策略
系统默认每30秒刷新一次磁盘缓存( dirty_writeback_centisecs=3000 ),高I/O场景下可缩短至5秒(500厘秒),避免缓存堆积导致“瞬间卡顿”:


sysctl -w vm.dirty_writeback_centisecs=500
 

2. 限制Swap使用
内存充足时,让系统“少碰”Swap分区!通过 vm.swappiness=10 (默认60)告诉内核:非必要不换出内存数据,减少磁盘I/O。

四、进程调度:给CPU“分好工”

1. 绑定核心,避免“来回跳槽”
把关键进程(如数据库)绑定到固定CPU核心,减少上下文切换开销。比如让MySQL跑在CPU0-3:


taskset -cp 0-3 $(pidof mysql)
 

2. 调整进程优先级
用 nice 命令给重要进程“开绿灯”,比如让Nginx优先级+5(值越小优先级越高):


nice -n -5 nginx
 

五、内核参数持久化:重启不“归零”

所有优化参数默认重启后失效!把它们写入 /etc/sysctl.conf ,执行 sysctl -p 永久生效:


net.ipv4.tcp_fin_timeout=15
net.ipv4.tcp_tw_reuse=1
net.ipv4.tcp_congestion_control=bbr
vm.swappiness=10
 

最后:调优前必做的“体检”

优化不是“盲目调大参数”!先通过 top 、 iostat 、 netstat 找到瓶颈:

- CPU高?查进程调度和优先级;
- I/O慢?换调度器+调队列深度;
- 网络卡?检查TCP连接数和拥塞算法。

试试这些技巧吧,一定会让你工作学习事半功倍的。