要定位哪个页面占服务器CPU,核心方法是先看进程,再看访问日志,最后结合性能分析工具确认具体URL。很多站长遇到CPU飙高第一反应是升级配置,但如果不找到罪魁祸首,加再多资源也会被拖垮,下面从实操角度拆解整个排查链路。
服务器CPU占用率排查方法:从进程反推页面
服务器本身不会告诉你“哪个页面”在消耗CPU,它只展示进程ID和资源占用,所以第一步是锁定CPU消耗最高的进程,再顺着进程找到对应的网站和请求。
用top命令定位高CPU进程
登录服务器后,执行:
top -c
按下Shift + P按CPU使用率排序,这时能看到类似php-fpm、java、apache等进程的PID和CPU占比,如果某个php-fpm进程长期占用超过80%,基本可以断定是某个PHP页面出了问题。
但光看进程不够,因为多个PHP-FPM进程长得一样,下一步需要把PID翻译成具体的请求URL。
通过strace跟踪进程正在做什么
拿到PID后(假设为12345),执行:
strace -p 12345 -e trace=read,write,openat -o /tmp/trace.log
等待几秒后停止,查看日志中频繁出现的PHP脚本路径,比如重复读取/www/wwwroot/site/api/export.php,那这个页面就是嫌疑对象。
结合access.log确认具体页面
进程只是表象,真正的URL藏在Nginx或Apache的访问日志里,打开对应站点的access.log,筛选出请求耗时长的记录:
awk '{if ($NF > 3) print $0}' /www/wwwlogs/site.log | tail -100
$NF是响应时间字段,大于3秒的请求直接列出,再配合grep过滤出php-fpm进程的PID对应的请求ID,就能把CPU消耗和具体URL关联起来。
网站页面CPU占用高怎么查?按动静类型分场景
不同站点的架构差异很大,纯粹的静态页面几乎不占CPU,动态接口才是重灾区,下面按常见的三种场景给出对应检查路径。
LNMP环境下的PHP页面排查
如果你的服务器是Nginx + PHP-FPM,最常见的嫌疑是未开启OPcache或存在死循环,先用php-fpm -i | grep opcache检查缓存状态,然后打开/etc/php-fpm.d/www.conf,观察pm.max_children设置是否有问题进程数过多会让CPU频繁切换上下文。

更直接的验证方法是临时禁用某个页面,比如怀疑/api/export有问题,就在Nginx配置里将该路径转发到空页面,观察CPU曲线是否回落,回落后基本实锤。
数据库查询引发的CPU飙升
很多页面自身代码没问题,但要命的SQL查询把MySQL的CPU打满,这时用show processlist;查看当前正在执行的SQL,重点看Time字段超过5秒的记录,常见的坑是ORDER BY和LIKE '%xxx%',这类查询不走索引,CPU会被全表扫描耗尽。
如果你用的是MySQL 8.0以上版本,还可以开性能分析:
SET GLOBAL performance_schema = ON;
后续通过sys.statement_analysis表看哪类SQL总耗时最高。
爬虫和高频请求导致的CPU异常
有时候页面本身没问题,是外部爬虫或CC攻击在反复请求同一个URL,打开access.log,用awk '{print $1}'统计独立IP,再按IP去重看请求次数:
awk '{print $1}' site.log | sort | uniq -c | sort -rn | head -20
如果某个IP在短时间内请求了上千次同一个/index.php?m=home&c=view&id=1,那就需要封禁IP或对该页面做缓存,行业共识认为,超过90%的“页面CPU高”问题其实都来自异常流量而非代码逻辑。
Linux查CPU占用高的页面:三条命令行路径
对于习惯纯命令行操作的运维人员,这里给出三条不需要装额外工具的排查路径。
实时关联请求与进程
使用netstat或ss找出连接中的PHP-FPM进程号:
ss -tnp | grep php-fpm
输出里有pid=12345,再回头用top核对这个PID的CPU占用,确认是它之后,立刻在浏览器或curl重复请求网站,同时用tail -f观察access.log,就能捕捉到对应的URL。
重放请求定位CPU尖刺
如果页面请求是POST类型,日志不会显示完整参数,这时需要从Nginx的post_action或应用日志中读取请求体,更简单的做法是抓包:
tcpdump -i eth0 port 80 -w /tmp/req.pcap
然后用Wireshark打开,筛选出高并发时段内耗时最长的请求路径。
慢日志兜底
无论是PHP-FPM还是Nginx,都内置慢日志功能,以PHP-FPM为例,在配置文件中启用:

slowlog = /var/log/php-fpm-slow.log request_slowlog_timeout = 2s
一旦某个页面执行超过2秒,日志会记录完整的调用堆栈,直接显示是哪个函数在消耗CPU,这个方法对初学者最友好,缺点是只能在问题复现时生效。
宝塔面板查看CPU占用:图形化操作流程
如果用了宝塔面板,排查过程会更直观,进入“监控”页面的“CPU”图表,可以看到每个进程的CPU曲线,点击“进程列表”并排序,找到持续占满的php-fpm进程。
下一步进入“网站”页面,找到对应站点,点击“设置”中的“网站监控”,宝塔会记录每个站点的CPU使用率,注意是站点级别而非页面级别,要进一步定位页面,需要点击“日志”菜单,在“错误日志”和“访问日志”里搜索该时段内的URL,宝塔面板查看CPU占用时,最常被忽略的功能是“流量监控”里的“实时连接”,这里能看到正在请求的IP和路径。
宝塔环境下动态调试技巧
先在“软件商店”里安装“PHP扩展”中的xdebug,然后开启“性能分析”,接着用浏览器访问可疑页面,xdebug会生成cachegrind文件,使用cat /tmp/cachegrind.out. | grep "fn"查看函数耗时占比,基本能确定是哪个函数导致的CPU异常。
如果不想装扩展,还有一个野路子:在宝塔的文件管理里临时重命名index.php,改成index.php.bak,然后创建一个只输出空字符串的index.php,观察CPU是否下降,这个方法虽然粗暴但在紧急时刻非常有效。
页面CPU占用高怎么查?常见误区和可能被骗的坑
很多教程会让人直接看top然后杀掉高进程,但这治标不治本,下面列出三个容易走偏的地方。
误将磁盘IO当CPU问题
当top显示%wa(等待IO)很高时,其实是磁盘读写卡住了,此时页面的“CPU占用”看起来高,实际是磁盘瓶颈导致进程阻塞,需要检查iostat和dmesg,而不是盯着PHP代码。
忽略缓存插件的作用
一个页面如果频繁查询数据库,就算代码写得再漂亮,CPU也会被SQL拖累,对这类页面启用Redis或Memcached缓存后,CPU占用往往能下降80%以上,业内专家指出,缓存策略不当造成的CPU浪费比代码漏洞更普遍。
误判第三方接口调用

页面本身只做了一层封装,但内部调用了外部API,比如支付回调、短信验证码,如果第三方接口响应慢,PHP进程会一直等待,CPU占比居高不下,排查时需要借助strace查看connect和recvfrom系统调用,确认是否阻塞在外部网络请求上。
避免CPU飙升的技术措施:从源头下手
与其反复排查,不如提前做好防护,以下几项措施能大幅减少CPU被单个页面打满的概率。
- 为所有动态页面配置缓存:尤其是列表页和详情页,用
fastcgi_cache或Redis缓存结果,命中率高了CPU自然降下来。 - 限制单IP并发连接数:在Nginx的
limit_req_zone中设置每秒请求阈值,超出部分返回503。 - 启用OPcache并设置合理的
validate_timestamps=0:减少PHP文件重复编译。 - 数据库慢查询日志保持开启:并把
long_query_time设为1秒,每天检查一次。 - 部署监控工具:如
Netdata或Prometheus + Grafana,能在CPU异常时自动告警。
服务器CPU问题通常不是偶发的,而是某个页面被频繁请求或代码逻辑存在缺陷,掌握以上排查方法后,下次遇到CPU报警时,你可以在五分钟内锁定是一个具体的URL还是一个IP段。
如何知道哪个页面占服务器CPU:常见问题解答
为什么top里看到的是php-fpm进程,却找不到具体页面?
因为PHP-FPM进程在处理完请求后不会立即退出,进程本身不持有URL信息,你需要结合Nginx的access.log和请求时间戳,筛选出该进程工作时段内访问量最大的路径。
网站页面CPU占用高怎么查最快?
最快的方法是同时打开三个终端:一个执行top看进程,一个执行tail -f看访问日志,一个准备好strace,当CPU飙高时,先用top记住PID,再在日志里grep出包含该时间段内的URL,最后用strace确认它是否在循环执行某段代码。
宝塔面板查看CPU占用时,面板图表为什么和top对不上?
宝塔的监控图表是平均值的采样结果,top的CPU是瞬时值,两者存在几秒到几十秒的延迟差异,属于正常现象,建议以top的实时数据为准,用宝塔图表看趋势走向。
图片来源于AI模型,如侵权请联系管理员。作者:酷小编,如若转载,请注明出处:https://www.kufanyun.com/ask/750675.html

