一、内存利用率高

最近服务器一直收到警告
在这里插入图片描述
我们来详细地排查一下 Linux 服务器内存利用率达到 90.311% 的原因。这是一个非常常见的情况,但高内存利用率本身并不一定代表问题,关键是要弄清楚这些内存被谁、以什么方式占用。

Linux 的内存管理机制和 Windows 不同,它会充分利用空闲内存来做缓存(cache)和缓冲(buffer),以提升系统性能。因此,你看到的“高利用率”很可能大部分是这些可以随时释放的缓存。

以下是系统的、循序渐进的排查步骤:

第 1 步:获取整体内存概览 - free 命令

首先,我们使用 free -h 命令(-h 表示以人类易读的格式显示,如 G, M),这是最重要的第一步。

free -h

输出示例

              total        used        free      shared  buff/cache   available
Mem:           7.6G        3.2G        200M         16M        4.2G        4.0G
Swap:          2.0G        0B          2.0G

关键分析

  • 不要看 free 列:这个值通常很小,因为 Linux 会把空闲内存拿去做缓存。

  • 重点关注 available 列:这个值表示系统当前可用于启动新应用程序的内存量,而无需交换。在上面的例子中,虽然 used 很高(3.2G + 4.2G 的 buff/cache ≈ 7.4G,利用率很高),但 available 还有 4.0G,这说明内存非常健康,大部分“占用”都是缓存。

  • 如果你的 available 值也很低(例如只剩几百 M 甚至几十 M),那才说明真正可用的内存不足了,需要继续排查。

第 2 步:查看具体进程的内存使用 - topps 命令

如果 available 确实很低,下一步就是找出是哪些进程占用了最多的内存。

使用 top 命令

  • 在命令行输入 top。

  • 默认按 CPU 排序,按下大写 M 可以按内存使用率(%MEM)排序。

  • 查看排在最前面的几个进程,关注 RES(常驻内存,即实际使用的物理内存)和 %MEM(内存使用百分比)列。

在这里插入图片描述

使用 ps 命令(更适用于脚本或快速查看)

ps aux --sort=-%mem | head -10

这条命令会列出按内存使用率降序排列的前 10 个进程。

常见的内存消耗大户

  • Java 应用(如 Tomcat, Elasticsearch, Kafka)

  • 数据库(如 MySQL, PostgreSQL, Redis)

  • 监控代理(如 Datadog agent, Zabbix agent)

  • 大型应用(如 PHP-FPM, Nginx 的多个工作进程)

二、CPU 利用率高

和前面类似,高 CPU 使用率通常意味着一个或多个进程正在大量进行计算,这可能是正常服务(如繁忙的网站)、异常进程(如脚本失控)或被攻击(如挖矿病毒)的表现。

以下是详细的排查步骤:

第 1 步:快速定位高 CPU 进程 - top

这是最重要的一步,可以快速看清全局。

使用 top 命令

top
  • 运行后,界面会动态刷新。默认按 CPU 使用率(%CPU)排序。

  • 查看第一行(Cpu(s):),确认整体使用率。

  • 重点关注排在最前面的几个进程,看是哪个 PID(进程ID)、哪个 USER(用户)、哪个 COMMAND(命令)占用了最多的 CPU。

  • 按下数字 1 可以展开显示所有 CPU 核心的单独使用情况,看是否是单个核心跑满还是所有核心都高。

示例输出分析
如果看到某个 java、php-fpm、nginx、mysql 进程或一个不认识的奇怪进程长期占用 80%+ 的 CPU,那它就是怀疑对象。

第 2 步:深入分析进程细节

找到可疑进程后,需要进一步分析。

查看进程的完整路径和启动命令
使用 ps 命令查看上面找到的高 CPU 进程的详细信息。

ps aux | grep <PID>
# 或者用这个更清晰的命令
ps -ef | grep <PID>

这会显示该进程的完整启动命令路径,帮助你判断它是否是合法服务。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐