图片压了、缓存开了、CDN 上了,前端能做的几乎都做了,可页面还是要两秒多才出来。这种“前端优化到顶还是慢”的情况,瓶颈往往不在浏览器,而在服务端——数据库、应用进程或者外部依赖在悄悄拖后腿。前端再怎么优化,也救不了后端一秒的处理时间。
下面按“先定位、再对症”的思路,把服务端常见的四类慢点逐一拆开,每一项都带检测命令和判断标准。
一、先确认慢在哪一层
不要上来就猜。先看 TTFB:如果 TTFB 本身就接近总耗时,说明慢在服务端处理;如果 TTFB 正常但整体慢,那才该回头查前端。下面这段在服务器上用 curl 测一下本站 TTFB,几秒出结果。要改的是把网址换成你的域名。
# 测量本站 TTFB(Time To First Byte)
#!/bin/bash
curl -s -o /dev/null -w "connect=%{time_connect} ttfb=%{time_starttransfer} total=%{time_total}\n" https://www.example.com/
# ttfb 超过 0.8s 说明服务端处理偏慢,往下查数据库和进程
跑完看 ttfb 那一项:低于 0.5 秒算健康,0.8 秒以上就值得往服务端深挖。time_connect 高则是网络或 TLS 问题,不在本文范围。
二、数据库慢查询是头号嫌疑
绝大多数服务端慢,根子在数据库:缺索引的查询全表扫、N+1 次循环查库、没分页拉了几万条。MySQL 的慢查询日志能直接把 culprit 列出来。下面这段开启慢查询日志并记录超过一秒的语句,过一段时间去查日志,就能看到是哪条 SQL 在拖。
# 开启 MySQL 慢查询日志,捕获执行超 1 秒的语句
#!/bin/bash
mysql -u root -p"$ROOT_PASS" -e "
SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = 1;
SET GLOBAL slow_query_log_file = '/var/log/mysql/slow.log';
"
# 观察一段时间后:
# mysqldumpslow -s t /var/log/mysql/slow.log | head
# 输出排第一的 SQL 就是最该优化的查询
用 mysqldumpslow 排个序,排在最前面的那条 SQL 就是元凶。给它对应的字段加索引,或者改写成分页查询,TTFB 通常能肉眼可见地掉下来。
三、应用进程与连接数瓶颈
PHP-FPM 或应用服务器的进程池太小,并发一上来就排队,表现是低峰快、高峰慢。看一眼 php-fpm 的活跃进程和等待数,如果 active 长期打满、listen queue 在涨,就说明进程不够。下面这段实时看 php-fpm 的队列情况,路径按你的 pool 调整。
# 实时观察 php-fpm 进程池是否打满
#!/bin/bash
watch -n 2 "ss -pl | grep php-fpm; \
grep -E 'active processes|listen queue' /var/run/php-fpm/www-status.txt 2>/dev/null"
# 若 listen queue 持续增长,调大 pm.max_children 并重启 php-fpm
队列持续增长,就把 pm.max_children 往上提一档,同时盯住内存别超。调完再用上面的 TTFB 脚本复测,确认高峰时段也压得住了。
四、外部依赖拖慢整页
页面里如果同步调用了外部接口(统计、支付、第三方 API),其中任意一个慢,整页就跟着卡。判断方法是临时把外部调用注释掉测一次 TTFB,如果明显变快,说明问题在外部依赖。做法是改为异步加载、加超时和失败降级,不让第三方拖死自己的页面。
相关阅读:
A5创业网 版权所有