性能调优思路:从硬件、内核到应用层的整体优化观
服务器卡、高负载、响应慢,别急着加钱升级配置。主机选这篇 Linux 教程直接告诉你:性能调优不是拍脑袋调参数,而是从硬件、内核到应用层一层层排查。没有整体优化观,调了也是白调。

硬件层面:先看物理瓶颈在哪
CPU 和内存:别让资源空转
别一上来就怀疑程序写得烂。先跑 `top` 或 `htop`,看看 CPU 空闲率、内存使用率是不是真的爆了。很多情况是内存不够,系统开始用 swap,导致 IO 飙升,CPU 反而在等磁盘。
查看 CPU 和内存使用情况
top -bn1 | head -20
-b 是 batch 模式,-n1 只跑一次,head 截取前20行
如果 `%Cpu(s): us` 占满,说明用户态进程吃 CPU;`sy` 高,说明内核态在抢资源,可能是系统调用太频繁。
磁盘 IO:最容易忽略的隐形杀手
用 `iostat -x 1` 看 `%util` 和 `await`。`%util` 接近 100% 不代表磁盘坏了,但 `await` 超过 20ms 就说明磁盘响应慢了。
安装 sysstat 包后使用
iostat -x 1 3
每秒刷新,共3次,重点关注 avgqu-sz 和 await 列
老鸟叮嘱:别只看 iowait。iowait 高是磁盘慢,但 iowait 低不代表磁盘没问题,可能是 CPU 在等锁。
内核层面:调优不是改完就完事
文件描述符和连接数:默认值就是坑
默认 1024 的文件描述符上限,生产环境根本不够用。特别是 Nginx、MySQL 这类高并发服务,不改就是等着报错。
临时修改当前会话
ulimit -n 65535
永久修改
echo "* soft nofile 65535" >> /etc/security/limits.conf
echo "* hard nofile 65535" >> /etc/security/limits.conf
网络栈调优:别迷信单参数
很多人听说改 `net.core.somaxconn` 能提升性能,就改到 65535。但没改 `net.ipv4.tcp_max_syn_backlog` 和 `net.core.netdev_max_backlog`,结果连接还是丢包。要改就一起改:
写入 /etc/sysctl.conf 后执行 sysctl -p
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535
net.core.netdev_max_backlog = 65535
BBR 和拥塞控制:不是所有场景都适用
BBR 对丢包高的网络效果明显,但如果你服务器在内网互联、延迟极低,BBR 反而可能增加 CPU 开销。用 `ss -i` 看当前连接的拥塞算法:
ss -ti | grep cubic
如果显示 cubic,说明没用 BBR;显示 bbr 就是已开启
应用层:代码和配置才是大头
数据库慢查询:先抓再调
MySQL 慢查询日志是必须开的。别等用户投诉才去翻。
临时开启慢查询日志
SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = 2;
日志路径
SET GLOBAL slow_query_log_file = '/var/log/mysql/slow.log';
然后用 `pt-query-digest` 或 `mysqldumpslow` 分析,找到耗时最长的 SQL,再看索引是不是没建。
Web 服务器:别用默认配置跑生产
Nginx 默认的 `worker_processes` 是 1,并发一上来就崩。改成 `auto` 让系统根据 CPU 核心数自动分配:
nginx
worker_processes auto;
events {
worker_connections 10240;
}
PHP-FPM 的 `pm.max_children` 也得算好。设太大,内存爆;设太小,请求排队。公式:内存 / 每个进程内存 = 最大进程数。
老鸟叮嘱:改完配置一定要 `nginx -t` 测试语法,改错了直接 502 报错,别问为什么。
常见报错与排查
•too many open files:文件描述符不够,改 limits.conf 后重启服务。
•connection refused:端口被防火墙或 iptables 挡了,先 `systemctl status firewalld` 看看状态。
•Cannot allocate memory:内存不足,检查是否有进程泄漏,用 `ps aux –sort=-%mem` 找大内存进程。
FAQ
Linux SSH 连不上怎么办?
先确认服务器是否在线,ping 一下。能通的话,检查 SSH 服务是否运行:`systemctl status sshd`。如果没反应,可能是 IP 被 iptables 或云平台安全组拦截了。
VPS 防火墙端口放行后还是访问不了是什么原因?
常见坑:云平台安全组和服务器内部防火墙是两套系统。你放行了云平台,但服务器内部 `firewalld` 或 `iptables` 没放行,照样拒绝。检查 `firewall-cmd –list-all` 或 `iptables -L -n`。
Linux 小白可以直接用 root 账号操作吗?
不建议。root 权限太大,一个误操作 `rm -rf /` 就能让服务器变砖。日常用普通用户,需要提权时用 `sudo`。生产环境尤其注意,别图省事。
BBR 开启后为什么速度没有明显提升?
BBR 主要优化丢包场景。如果你本地到服务器的网络本身延迟低、丢包少,BBR 效果不明显。另外,BBR 只影响 TCP 传输,对 UDP 或短连接(如 HTTP/1.0)基本无效。
为什么调了内核参数后服务器重启就失效了?
因为改的是 `/proc` 下的临时文件,重启后恢复默认。必须写入 `/etc/sysctl.conf` 并执行 `sysctl -p` 才能永久生效。
CPU 使用率不高,但服务器很卡,是什么原因?
大概率是磁盘 IO 瓶颈或内存不足导致频繁 swap。用 `vmstat 1` 看 `si`(swap in)和 `so`(swap out)列,如果持续大于 0,说明内存不够了。
转载请注明出处:https://www.zhujixuan.com/jishujiaocheng/9529.html 商家投稿邮箱:zhujixuanblog@qq.com
