1. 首页 > 技术教程 > 正文

性能调优思路:从硬件、内核到应用层的整体优化观

性能调优思路:从硬件、内核到应用层的整体优化观

服务器卡、高负载、响应慢,别急着加钱升级配置。主机选这篇 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