网站加载慢,linux服务器接口请求响应变慢,怎么排查,一般是什么原因

发布于:2025-08-30 ⋅ 阅读:(28) ⋅ 点赞:(0)

一般常见原因总结

类别 可能原因 简单排查命令
服务器资源 CPU占用高(计算/GC) top, htop, vmstat 1
内存不足,使用Swap free -h, vmstat 1
磁盘I/O瓶颈(日志/数据库) iostat -x 1
网络带宽打满 iftop, nethogs
数据库 慢SQL查询(最最常见) 查看数据库慢日志
数据库连接池打满 show processlist
表锁/行锁等待 show engine innodb status
缓存 Redis慢查询/高延迟 redis-cli --latency, SLOWLOG GET
Redis内存不足 info memory
应用代码 异常过多 查看应用错误日志
GC频繁 jstat -gcutil <pid>
线程池打满/死锁 jstack <pid>
代码性能问题(循环、算法) 使用Profiling工具(Arthas, pprof)
外部依赖 第三方API响应慢 链路追踪
中间件(MQ, ES)响应慢 查看对应监控
其他 流量激增(爬虫/活动) 查看访问日志、监控流量图表
网络问题(DNS、机房网络) ping, traceroute, mtr
日志级别过低(如DEBUG),大量写日志 查看日志配置和磁盘IO

一、内存排查

在这里插入图片描述
我们来分析一下你提供的 free -h 命令的截图信息。

根据你提供的数据:

  • Total (总内存): 14G 。
  • used (已使用): 2.3G
  • free (未使用): 7.3G
  • shared (共享内存): 247M (很小,正常)
  • buff/cache (缓存/缓冲): 5.3G
  • available (可用内存): 12G

结论:这非常正常,而且是健康的状态!

你的系统内存使用情况是 理想状态。下面是详细解释:

1. 核心指标解读:available (可用内存)

这是最关键的一个指标,它的值是 12G。这个数字的含义是:

系统估算出,如果应用程序现在需要申请内存,大概有 12GB 的内存可以立刻分配给它(包括当前空闲的内存和可回收的缓存/缓冲内存)。

这意味着你的系统有非常充足的可用内存资源,完全没有任何内存压力。

2. 关于 buff/cache 占用 5.3 G

不是 内存被浪费了,恰恰相反,这证明了你的系统在智能地利用资源提升性能

  • Linux 内核会把暂时用不到的内存(总共约 12G 的 available 中的大部分)拿来当做 buff/cache,用来缓存磁盘数据。
  • 这样做的目的是:极大加速后续的磁盘读写操作。因为从内存读取比从磁盘读取快成千上万倍。
  • 当你的应用程序(比如数据库、Web服务)需要更多内存时,内核会瞬间、自动地缩减 buff/cache 的大小,把这 5.3G 中的大部分归还给应用程序使用。这个过程对你来说是透明的,无需干预。

二、CPU占用

在这里插入图片描述
top 命令是排查性能问题的神器。看到有程序CPU占用50%多,这很可能就是导致接口变慢的“元凶”。下面我教你如何一步步看懂 top 并找出这些程序。

第1步:登录服务器,运行 top 命令

直接在SSH终端输入:

top

你会看到一个动态刷新的界面,分为上部汇总信息下部进程列表


第2步:看懂顶部的系统汇总信息(关键!)

顶部前几行提供了整个服务器的健康状况概览,这是判断瓶颈在哪的第一步。

第1行:系统概览

top - 18:20:30 up 10 days,  1:15,  1 user,  load average: 2.50, 1.80, 1.20
  • 18:20:30:当前时间。
  • up 10 days:系统已运行时间。
  • load average: 2.50, 1.80, 1.20系统平均负载,这是非常关键的指标!
    • 3个数字分别代表过去1分钟、5分钟、15分钟的平均负载。
    • 如何理解? 假设你的CPU是4核心,那么:
      • 负载 ≤ 4.00:比较轻松。
      • 负载 > 4.00:表示有进程在排队等待CPU,系统压力大。
      • 你例子中的 2.50 对于4核CPU来说,表示CPU有压力但未完全饱和。

第2/3行:任务和CPU状态

Tasks: 200 total,   1 running, 199 sleeping,   0 stopped,   0 zombie
%Cpu(s): 50.0 us,  20.0 sy,   0.0 ni,  30.0 id,   0.0 wa,   0.0 hi,   0.0 si,   0.0 st
  • %Cpu(s):这是CPU使用率的明细,至关重要!
    • us (user)用户进程占用CPU的百分比。这个值高,通常就是你的应用程序(如Java, Python程序)吃掉了大量CPU。
    • sy (system)系统内核占用CPU的百分比。这个值高,表示系统调用频繁,可能IO操作多。
    • id (idle)CPU空闲百分比。这个值越小,说明CPU越忙。你希望这个值高。
    • wa (iowait)CPU等待IO完成的百分比这是另一个关键指标! 如果这个值很高(比如 > 20%),说明磁盘IO是瓶颈,CPU在空转等着读/写数据。
    • 你的情况:如果 us 很高(比如50%),说明是应用程序本身消耗了大量CPU。

第4/5行:内存和交换分区

MiB Mem :   7856.4 total,    100.2 free,   2000.0 used,   5756.2 buff/cache
MiB Swap:   2048.0 total,   2048.0 free,      0.0 used.   5600.0 avail Mem
  • 这里我们之前分析过了,你的内存很健康,avail Mem 很大,所以问题不在内存。

第3步:找出CPU高的罪魁祸首(排序进程列表)

默认情况下,top 的进程列表可能不是按CPU排序的。你需要做的是:

  1. 按下键盘上的 P (大写,Shift+p)。这是按CPU使用百分比排序的命令。列表最上面的进程,就是吃掉CPU最多的那个。你看到的50%多的程序肯定排在前面。

  2. 现在看进程列表的每一列,重点关注这几列:

PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
1234 mysql     20   0  10.5g   2.1g   1.2g S  55.2  27.4 100:05.66 mysqld
5678 www-data  20   0 123456   9876   1234 R  30.1   0.1   0:10.25 php-fpm
9012 root      20   0   10000   5000   2000 S   1.0   0.1   0:00.01 sshd
  • PID: 进程ID。
  • USER: 进程所属用户。
  • %CPU: 该进程占用CPU的百分比。这就是你要找的!
  • %MEM: 该进程占用内存的百分比。
  • COMMAND: 进程的名称/命令。这是识别进程的关键(例如 mysqld, java, nginx, php-fpm)。

现在,你就能一眼看出是哪个进程(COMMAND)占用了多的CPU了。

第4步:定位具体是哪个 PHP 脚本和哪行代码

首先,让我们看一下这个高CPU的 php 进程到底在运行什么脚本。使用 ps 命令查看进程的完整命令行:

ps aux | grep 25866

或者更精确的:

ps -fp 25866

查看输出中的 COMMAND 或 CMD 列,这通常会显示出执行的PHP脚本路径,例如:

/usr/bin/php /path/to/your/script.php
php /path/to/your/script.php

第5步:检查PHP-FPM/PHP日志

查看PHP的错误日志和慢日志,看是否有大量报错或记录下执行缓慢的脚本。PHP-FPM有一个类似MySQL慢查询日志的功能,它能直接告诉你哪个脚本慢、慢在哪里。

  • PHP错误日志:通常可以在 php.ini 或 PHP-FPM 池配置中找到 error_log 的路径。
    在这里插入图片描述

  • PHP-FPM慢日志:如果你配置了 request_slowlog_timeout,定义一个请求执行超过x秒即为慢请求,慢日志会记录下执行时间过长的请求及其当时的调用栈,这是非常有用的信息。slowlog 定义慢日志文件路径,绝对路径其实是:/www/server/php/74/var/log/slow.log
    在这里插入图片描述


网站公告

今日签到

点亮在社区的每一天
去签到