1. 为什么说RockyLinux是内核调优的“正经选择”
先说结论:RockyLinux内核调优这件事,本质上不是“没事找事折腾系统”,而是在正式接手一批服务器之后,必须做的一次系统性体检和定向优化。我这些年经手过不少跑在CentOS 7、CentOS 8上的业务集群,自从上游转向CentOS Stream之后,生产环境里越来越多团队开始切RockyLinux。原因很简单:它是RHEL的社区重建版,和RHEL保持二进制兼容,稳定性、软件包生态、安全更新节奏都没掉链子,适合拿来当生产系统的底座。
内核调优的“调”字很关键。不是把参数改得越激进越好,而是根据你的业务形态——是高并发Web、消息队列、数据库、还是文件存储——把内核默认的“通用策略”改成“适配当前负载的策略”。RockyLinux默认内核是RHEL同源的企业级内核,默认参数保守稳定,适合绝大多数场景,但如果你需要支撑单机10万并发连接、或者跑高吞吐的MySQL/PostgreSQL、或者做KVM虚拟化宿主机,那默认参数一定会成为瓶颈。这篇东西就是围绕“明确场景、量化指标、逐项调优、验证回归”这条主线来展开的,适合刚接手RockyLinux服务器的新手,也适合已经在用但觉得性能总差口气的运维老手当作一份速查手册。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 调优前的摸底:别急着改参数,先搞清楚你的系统长什么样
2.1 确认当前内核版本与硬件基线
我见过太多人上来就改sysctl,改完发现系统负载反而更高了,回头一看连自己跑的内核是哪个小版本都没确认。RockyLinux 8系列默认内核是4.18那个分支,RockyLinux 9系列默认是5.14分支,这两个大版本在网络栈、调度器、文件系统层面的实现差异不小,对应的调优参数虽然大体通用,但有些细节完全不一样。所以第一步永远是执行这几个命令:
bash复制# 查看当前内核版本
uname -r
# 查看操作系统版本
cat /etc/os-release
# 查看CPU型号、核数、架构
lscpu
# 查看物理内存总量
free -h
# 查看磁盘类型(SSD还是HDD,是否NVMe)
lsblk -d -o name,rota,model
这里特别提醒一点,lscpu输出里的“NUMA节点”信息一定要看。现在的服务器动不动就是双路CPU,每个CPU有自己的内存控制器,跨NUMA访问内存的延迟比本地高不少。内核调优里有个很重要的思路就是“尽量让进程在本地NUMA节点上分配内存”,否则你调了半天内存参数,结果程序跑在Node 0的CPU上、内存却从Node 1分配,性能照样上不去。
2.2 安装必备的性能观测工具集
不装工具就调优,等于闭着眼开车。RockyLinux的官方源和EPEL源里工具很全,我习惯一上来就装一套标准的观测组合:
bash复制# 启用EPEL源
dnf install -y epel-release
# 安装性能观测与压测工具
dnf install -y sysstat htop iotop perf bpftool sysbench fio
说说每个工具的用途,纯新手可以记一下:sysstat里的sar、iostat、pidstat是看历史趋势和实时负载的主力,htop是交互式看进程CPU和内存占用,iotop看每个进程的磁盘I/O,perf是内核级性能剖析的利器,sysbench用于CPU/内存/线程压测,fio用于磁盘性能测试。
这些工具不只是调优前用,调优后的对比验证更离不开它们。我的习惯是调优前先跑一轮基准测试并把数据存档,调优后再跑同样的测试,用数据说话,而不是凭感觉觉得“好像快了一点”。这一条经验在团队协作时尤其重要——没有前后对比数据,你写的调优报告就是一张废纸。
3. 内核参数调优的核心战场:网络、内存、文件系统与CPU
3.1 网络协议栈参数:从“能用”到“能扛高并发”
网络参数是内核调优里最常被提及、也最容易抄作业抄出问题的一块。很多人一搜“Linux内核调优”就复制一整段sysctl配置,也不管自己到底是Web服务器还是数据库服务器。我建议按场景来,先理解每个参数在干什么,再决定改不改。
对于一个典型的Nginx/OpenResty前端或者API网关,首先关注连接队列和文件句柄:
bash复制# 全连接队列长度,默认128,高并发下很容易溢出
net.core.somaxconn = 65535
# 每个网络接口的接收/发送缓冲区默认值,单位字节
net.core.rmem_default = 262144
net.core.wmem_default = 262144
# 接收/发送缓冲区上限
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
# 单个TCP连接的读写缓冲区范围
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
somaxconn为什么对高并发Web很重要?因为TCP三次握手完成后,连接会进入accept队列,如果队列满了,多余的连接会被内核直接丢弃,客户端表现为“连接被重置”。Nginx里listen指令的backlog参数和这个内核参数是配合使用的,你光调了Nginx的backlog、内核队列不够大,一样会丢连接。
接下来是TIME_WAIT和端口范围的问题。短连接场景下,服务端主动关闭连接会产生大量TIME_WAIT状态的连接,如果本地端口范围不够用,新连接就没端口可用了。这里有两个经典参数:
bash复制# 允许回收TIME_WAIT连接,用于新连接(注意,这个参数在新内核里有些争议)
net.ipv4.tcp_tw_reuse = 1
# 本地可用端口范围,默认32768-60999,高并发下可以扩大
net.ipv4.ip_local_port_range = 1024 65535
# TIME_WAIT最大
