老板催着加机器Linux性能调优先看这篇
IT小梁 / 梁雪云 | 2026-08-02
说个真事儿。去年我接手一个单位,他们采购了两台新服务器,双路至强、512G内存、全闪阵列,不算顶配但也不差。部署一个MySQL集群加一个Nginx,几百个用户在线,结果卡成PPT。领导开会问怎么办,厂商说加内存上SSD,我就问了句:大哥,您这台机子CPU负载多少?内存用了多少?IO等待多少?满场安静,愣是没人答上来。
你要问我Linux性能调优是个啥,我一句话说完——就是搞清楚你机器上每一分资源到底是咋用的,然后对症下药,拿最少的钱干最多的事,别一有问题就砸钱买硬件。
# 说白了是个啥
Linux是全世界搞IT的最爱吹的玩意儿。但性能调优这个概念,说穿了就是——你面前这台装Linux的机器,CPU、内存、存储、网络这几大件,你搞清楚它们各自的脾气,把它们都伺候舒服了。同样是跑一套业务,别人能并发扛住几千个请求,你几百个就挂了,不是机器烂,是人不会调。
# 打个比方你就懂了
就好比你开了一家饭店。厨房是CPU,餐厅是内存,仓库和后厨的冰柜是存储,传菜员是网络。
你生意起来了,客人多,但你发现出菜太慢。你第一反应是什么?加灶台?加厨子?加传菜员?砸钱扩店?
等等,你先别急着砸钱。你应该先看看——是不是只有十来个客人点菜,但你们一个菜要半小时才上?是不是配菜没提前备好?是不是某个厨师明明闲着,但另一个厨师累死,因为分工有问题?是不是传菜员老跑冤枉路,明明可以在一个区域转一圈送完所有菜,偏要一个个跑?
Linux调优就是干这个的。不是看你机器配置不够,而是看你配置没被用明白。
# 一层层拆开看
第一层:先学会看,别急着动
我见过太多人,上来就改参数,改完发现更慢了,然后又改回来,最后骂Linux垃圾。我跟你掏心窝子讲,别急着动手,先学会看。
Linux下看性能的工具,就那几个,用熟了够你走天下。
top 和 htop。命令敲下去,你首先看三行:
- 负载均值(load average),三个数字分别代表1分钟、5分钟、15分钟的平均负载
- 多个CPU核心的使用率
- 内存总量和使用量
很多二把刀看到负载5以上就喊“超载了”,纯扯淡。负载多少叫超载,得看你机器多少核。一个4核机器,负载4不算啥。负载8才叫真有问题。这里有个坑要注意,负载高不一定是CPU忙,也可能是进程在等IO。
vmstat 是查瓶颈神器,直接敲 `vmstat 1 5`,每1秒输出一次,共5次。看这几列:
- `r`:等待运行的进程,超过CPU核数说明CPU是瓶颈
- `b`:不可中断睡眠的进程,这数字嗷嗷高说明磁盘IO出问题
- `si` `so`:内存交换(换入换出),这数字不是0就说明内存不够用了
还有 `iostat`,看磁盘那块儿的 `%util` 和 `await`;`free -h` 看内存;`pidstat` 看每个进程的资源占用。这些命令先整明白,性能调优你就入门了一半。
第二层:CPU那块儿,你得学会分配

CPU调优,最常见的操作就是绑定进程——把一个进程固定在某个CPU核心上跑,别让它到处乱窜。
为啥要这么干?因为进程切换是有代价的,CPU跑一个进程,要缓存它的一部分数据。你一会儿让它跑这个核,一会儿让它跑那个核,缓存就全废了,性能自然上不来。
比如你给数据库设了专用CPU
```
taskset -c 0,1 /usr/bin/mysqld_safe &
```
就是在告诉系统,让MySQL只在0和1这两个核上跑。其他程序的雷再也炸不到它。
这个在虚拟化场景下特别有用——你虚拟机就得指定它用哪几个核心,不然宿主机的调度器会把你的VM折腾够呛。
还有中断绑核。有些网卡支持多队列,比如队列0到7,你可以在 `/proc/irq/` 下面找到网卡中断号,然后写入CPU列表,把每个中断队列固定到不同核上,这样多核分摊中断处理压力,网络性能能上去一个量级。
第三层:内存,看着大没用,得管住
有人一看512G内存就开心了,觉得这辈子内存问题不存在了。结果数据库一跑,卡。
内存这块儿,第一件事儿是把用来做缓存的那部分跟你的业务分清楚。你看到 `free -h` 显示used了400G,别慌,试试 `cat /proc/meminfo` 看看 `Cached` 哪一栏,那一大坨其实是磁盘缓存,给文件读写加速用的,系统随时可以拿回来给你跑程序。
然后看swap。内存快不够用了,系统就会把一部分冷数据放到swap分区。这一放,业务性能直接掉悬崖。不信你试试内存压力大的时候跑个程序,IO等待能给你拉满。
swap调优有个核心参数 `vm.swappiness`,范围0到100,默认60,表示系统“多爱用swap”。你要是追求低延迟,可以设成10,甚至设成0或1。设成0的意思是“除非内存实在没了,能不swap就不swap”,这种设置对延迟敏感的数据库特别好使。
再看看 `vm.dirty_ratio` 和 `vm.dirty_background_ratio`。这俩控制的是脏页——就是内存里改了但没写回磁盘的数据。第一个是内存写脏页的最大比例,到了就不能再往缓存写了,得先往磁盘写;第二个是后台写脏页的阈值,到了就启动后台线程慢慢刷盘。生产环境里,小比例频繁刷,适合数据库;大比例攒着一把刷,适合做批处理的。别乱调,照你业务需求来。
这里得提个有争议的:大页内存(HugePages)。有人一听说数据库适合用大页,马上就去搞,结果内存还分出去了520G,数据库还是慢。为啥呢?因为你得让应用支持大页内存分配才行,不是系统层开了就完事了。这个没搞明白之前少碰,否则运维有你哭的。
第四层:存储,最大的槽点
存储这块,我得狂吐槽下——大部分运维都只看容量,不看IOPS和延迟。你想想,你备份一个500G的文件,和数据库每秒做几千次随机读写,能是一回事吗?前者看带宽,后者看延迟,两者性能差距大了去了。
我建议你下个 `fio`,测测你这个存储到底啥水平。比如模拟4KB随机读写:
```
fio -filename=/test -direct=1 -iodepth=32 -ioengine=libaio -rw=randwrite -bs=4k -size=1G -numjobs=4 -group_reporting
```
跑完你看看延迟和IOPS,心里就有数了。如果你的存储延迟本身就200毫秒,那调啥都白瞎,这就是硬件不行。
真到存储性能调优这里,Linux给的工具是 `ionice` 和 I/O调度器。
调度器有三个流派:
- noop:无脑按序发,适合SSD、NVMe这类不乱跳的
- deadline:给每个I/O设个期限,优先处理快到期的,这是数据库最喜欢的那种
- cfq:公平排队,桌面环境用得多
这种设置怎么选,要看你的设备是HDD、SSD还是NVMe。SSD选 `noop` 或 `none` 就行;机械硬盘,用 `deadline` 防止请求饿死。多路径存储,建议用 `noop`。
第五层:网络调优,别乱改

最后一个大头:网络。很多新手直接把 `tcp_rmem` 和 `tcp_wmem` 调大到几兆,觉得内存够大,网络就快了。错。我见过有人把收缓冲区调大到16M,结果内存全被占满了,并发一上来,内存直接爆掉。
网络调优这块,可以做的:
- `net.core.somaxconn`:把监听队列调大,从默认的128改成1024甚至更大,能扛住高并发短连接
- `net.ipv4.tcp_tw_reuse`:开了之后,TIME-WAIT状态的连接可以尽快复用,大量短连接场景下CPU占用能减很多
- `net.ipv4.tcp_fin_timeout`:快速回收TIME-WAIT,默认60秒,调成30或者更小也行
这些参数真要调,建议先用 `sysctl -w` 临时改,测完,确信没问题,再往 `/etc/sysctl.conf` 里写死,不然写进去了还得花半天改回来。
# 实际能用在哪儿
第一类人,用云主机的。带宽先保证,然后重点调 CPU进程绑定、文件描述符数量(`ulimit -n` 默认1024,太少了,用这个做Web服务的必须调),还有TCP参数。这些东西都是零采购成本,纯纯的“白捡钱”。
第二类人,自己管理物理服务器的。你得把CPU调优和内存分配认真对待了——这俩是你能做优化效率最高的两块。存储千万别乱调,先测延迟再说,IOPS太高的硬件没必要神话,IOPS不够的软件也救不了。
第三类人,跑数据库的。核心思想就一条,专注调IO调度器、关闭swap、调整刷盘参数。网络和CPU相对没那么救急,但前面几个必须调好。
# 几个大坑你得绕开
坑一:调优变玄幻。很多人不测基准就直接乱搞,调整后凭感觉说“感觉快了”,这不是调优,这是自嗨。调之前先得用基准测试工具跑一遍,调完之后再跑一遍,数据对比你才知道哪个参数是玄学,哪个是真有效。
坑二:追求极限配置。比如 `somaxconn` 调到10240,`swappiness` 设成0,看着挺专业,结果系统异常后你连日志都查不了。说实话,这是一台生产服务器不是表演道具,稳定比性能重要得多。
坑三:动态调优是愚人金。别信那些什么“自动化性能调优工具”,机器自己分析瓶颈然后改参数?我干了十几年没见过靠谱的。性能瓶颈是需要人去理解的,工具只能给你的推理提供数据。
我给老哥们的建议其实很朴素:先用好监控工具,搞清楚你的业务堵在哪,然后再去优化,不要拍脑袋。调完必须做回归测试。别追求极限,够用就行,留些余量给未来业务增长。这才是Linux性能调优的本质——用管理的思维,把资源效率最大化。