LinuxCPU内存监控:top与vmstat实用教程
掌握Linux服务器性能监控是运维的关键。本文以`top`和`vmstat`命令为切入点,深入讲解CPU和内存监控实操。通过`top`命令,你可以实时查看CPU使用率、进程列表以及系统负载,快速定位高CPU占用进程。`vmstat`则侧重于系统整体资源使用趋势,尤其擅长I/O和内存交换情况的监控,助你发现长期存在的性能瓶颈。本文还详细阐述了如何结合业务场景判断CPU利用率过高是否导致性能瓶颈,以及如何识别和应对Linux系统中的内存泄漏或持续的交换活动,并介绍了`free -h`、`htop`、`ps aux`等更深入的内存分析工具,助你全面掌握Linux系统性能监控技巧。
使用top命令查看%Cpu(s)行,若us和sy总和高且id接近0,则CPU繁忙;2. 检查wa值是否高,判断是否因I/O等待导致瓶颈;3. 查看load average是否持续超过CPU核心数;4. 分析top中进程列表,确认高CPU使用进程是否异常;5. 利用vmstat检查r和b值,判断进程是否等待CPU或阻塞;6. 结合业务场景和服务响应判断是否为实际瓶颈。要识别内存泄漏,1. 通过free -h或top观察free内存是否持续下降;2. 使用vmstat检查swpd、si/so是否增长;3. 在top或ps aux中查找RES/VIRT持续增长的进程;4. 长期监控并比对RSS值变化;5. 使用valgrind等工具深入分析应用层内存问题。应对措施包括重启服务、代码优化、更新软件、增加内存、关闭非必要进程、调整swappiness参数等。
在Linux系统上,要快速了解CPU和内存的使用状况,top
和vmstat
是两个最基础也最实用的工具。它们能提供实时的系统概览和关键性能指标,帮助我们迅速定位潜在的性能瓶颈。

解决方案
要监控Linux系统的CPU和内存使用,我们主要依赖top
和vmstat
这两个命令行工具。它们各有侧重,结合使用能提供相当全面的视角。
使用 top
进行实时概览:

top
是一个动态的实时进程查看器,它能显示系统中正在运行的进程列表,并按CPU使用率排序。
直接在终端输入 top
即可启动。
你会看到一个类似于仪表盘的界面:

- 顶部区域:显示系统总览,包括当前时间、系统运行时间、登录用户数、平均负载(load average)。
- Tasks(任务):显示进程总数、运行中、休眠中、停止和僵尸进程的数量。
- %Cpu(s):显示CPU使用率,包括用户空间(
us
)、系统空间(sy
)、空闲(id
)、I/O等待(wa
)等。 - MiB Mem(内存):显示物理内存的总量、已使用、空闲和缓存/缓冲区的大小。
- MiB Swap(交换空间):显示交换空间的总量、已使用、空闲和可用量。
- 进程列表:下方是按CPU使用率排序的进程列表,包含PID、用户、优先级、CPU使用率(
%CPU
)、内存使用率(%MEM
)、虚拟内存(VIRT
)、常驻内存(RES
)、共享内存(SHR
)等。
top
的常用交互命令:
P
:按CPU使用率排序(默认)。M
:按内存使用率排序。k
:终止一个进程(需要输入PID)。q
:退出top
。1
:在多核CPU系统上,切换显示所有CPU核心的独立使用率。z
:切换颜色模式,让输出更易读。
使用 vmstat
进行系统活动统计:
vmstat
(virtual memory statistics)提供关于进程、内存、分页、块IO、陷阱和CPU活动的信息。它不像 top
那样提供详细的进程列表,但它能以固定时间间隔输出数据,更适合观察系统随时间的变化趋势。
常用命令:vmstat 1
这会每秒输出一次系统统计信息。
vmstat
输出的关键指标:
procs
(进程):r
:等待运行的进程数。b
:处于不可中断睡眠状态的进程数(通常在等待I/O)。
memory
(内存):swpd
:已使用的虚拟内存(交换空间)。free
:空闲物理内存。buff
:用作缓冲区的内存。cache
:用作缓存的内存。
swap
(交换):si
:每秒从磁盘换入的内存量(KB)。so
:每秒写入磁盘的内存量(KB)。
io
(I/O):bi
:每秒从块设备接收的块数(读)。bo
:每秒发送到块设备的块数(写)。
system
(系统):in
:每秒中断次数。cs
:每秒上下文切换次数。
cpu
(CPU):us
:用户空间CPU使用率。sy
:系统空间CPU使用率。id
:空闲CPU使用率。wa
:等待I/O的CPU使用率。st
:被虚拟机管理程序“偷走”的CPU时间(仅在虚拟机中可见)。
top
提供的是一个快照和最活跃进程的视图,适合快速诊断。vmstat
则更侧重于系统整体资源的使用趋势,尤其是I/O和内存交换情况,对于发现长期存在的性能问题非常有帮助。
如何判断CPU利用率过高是否导致性能瓶颈?
当你在Linux服务器上看到CPU利用率飙升时,这确实是个警示信号。但高利用率本身不一定就是“瓶颈”,关键在于它是否影响了服务的响应速度或系统的整体吞吐量。
判断CPU是否成为瓶颈,通常我会这么看:
首先,用 top
命令。
观察顶部的 %Cpu(s)
行。
- 如果
us
(用户空间) 和sy
(系统空间) 的总和很高,而id
(空闲) 接近0,这意味着CPU确实非常繁忙。 - 更重要的是看
wa
(I/O等待)。如果wa
很高,比如达到20%甚至更高,那说明CPU大部分时间在等待磁盘I/O完成,而不是在执行计算。这种情况下,瓶颈可能在磁盘I/O,而不是CPU本身。
接着,看 load average
。
在 top
的第一行或直接运行 uptime
命令可以看到。它显示了过去1分钟、5分钟和15分钟内,处于可运行状态和不可中断睡眠状态的平均进程数。
- 一个简单的经验法则是,负载平均值不应持续超过你的CPU核心数。例如,一个4核CPU的服务器,如果负载平均值长时间稳定在4以上,那CPU可能确实是瓶颈。如果负载平均值远低于核心数,即使CPU利用率看起来很高,也可能是某些计算密集型任务在充分利用资源,而不是“瓶颈”。
然后,关注 top
进程列表中的具体进程。
- 哪个进程占用了最高的
%CPU
?是一个预期的应用进程(如数据库、Web服务)?还是一个意外的脚本或僵尸进程?如果是一个你预期的应用,那么它可能只是在努力工作。但如果它的CPU使用率高到离谱,并且服务响应变慢,那可能需要优化该应用或增加CPU资源。 - 检查
r
(运行队列) 和b
(阻塞队列) 在vmstat
中的值。如果r
持续很高,说明有很多进程在等待CPU,CPU资源确实紧张。如果b
持续很高,则可能暗示I/O或内存问题导致进程阻塞。
举个例子,如果你的Web服务器,在用户访问量暴增时,top
显示Nginx或PHP-FPM进程的%CPU
很高,同时load average
也相应上升,并且用户反馈页面加载缓慢,那么CPU很可能就是瓶颈。但如果是一个视频转码服务器,CPU长期跑满100%是正常的,因为它的任务就是充分利用CPU资源。所以,判断瓶颈需要结合业务场景和用户体验来综合分析。
除了top和vmstat,还有哪些工具可以提供更深入的内存使用分析?
top
和 vmstat
确实很棒,但它们只是冰山一角。在需要深入挖掘内存使用细节时,还有一些工具能提供更细致的视图:
1. free -h
:快速总览,更易读
这是我最常用的一个命令。free -h
会以人类可读的格式(如GB、MB)显示系统的总内存、已用、空闲、共享、缓冲区/缓存以及“可用”内存。
- 关键点:注意
available
(可用) 内存,它表示应用程序可以立即使用的内存量,包括未被使用的物理内存和可以回收的缓存/缓冲区内存。很多新手会只看free
,然后误以为内存不足,但实际上Linux会尽量把空闲内存用作缓存,提高系统性能。
2. htop
:交互式增强版 top
如果你觉得 top
的界面有点“硬核”,htop
绝对值得一试(可能需要安装,如 sudo apt install htop
)。
- 优点:它提供了彩色的、更直观的界面,可以方便地通过鼠标或键盘箭头选择进程、杀死进程、调整优先级。内存和CPU使用率以进度条形式展现,一目了然。它还支持进程树视图,方便查看父子进程关系。
3. ps aux --sort=-%mem
:按内存使用率排序的进程列表
当你想找出哪个进程是“内存大户”时,这个命令非常有用。
ps aux
列出所有用户的进程,包括它们的用户、PID、CPU和内存使用率等。--sort=-%mem
告诉ps
按内存使用率降序排列(%mem
前面的-
表示降序)。 这样你就能一眼看到哪些进程占用了最多的内存。
4. /proc/meminfo
:内核内存信息源
这个文件包含了内核关于内存使用的最原始、最详细的信息。它不是一个命令,而是一个虚拟文件。
- 你可以用
cat /proc/meminfo
来查看。 - 它提供了诸如
MemTotal
、MemFree
、Buffers
、Cache
、SwapTotal
、SwapFree
等详细指标,甚至包括各种内核内部结构(如Slab
、PageTables
)的内存使用情况。对于需要编写脚本来监控内存或进行深度分析的场景,它是一个宝贵的直接数据源。
5. smem
:更精确的内存报告smem
(需要安装) 是一个更高级的内存报告工具,它能显示进程的常驻内存(RSS)、共享内存(PSS)、以及独特的内存(USS)。
PSS
(Proportional Set Size) 是一个很有用的指标,它计算了进程实际使用的物理内存量,包括与其它进程共享的内存,但共享部分会按比例分配。这比RSS
更能反映一个进程的真实内存占用。
6. slabtop
:内核Slab缓存使用
对于内核开发者或需要诊断内核内存问题的场景,slabtop
可以显示内核Slab缓存的使用情况。Slab缓存是内核用来管理小对象内存分配的机制。如果这里出现异常增长,可能暗示内核层面的内存问题。
理解内存使用,特别是Linux的内存管理机制(如缓存、缓冲区、交换空间),是诊断内存问题的关键。这些工具能帮助你从不同维度观察内存状况,从而更准确地判断是否存在内存泄漏或内存压力。
如何识别和应对Linux系统中的内存泄漏或持续的交换活动?
内存泄漏和持续的交换活动是Linux系统性能下降的常见元凶,它们会让人感觉系统“越来越慢”,甚至最终崩溃。识别和应对它们需要一些观察和策略。
识别内存泄漏:
内存泄漏是指应用程序在分配内存后未能正确释放,导致内存占用持续增长,即使在没有明显活动时也是如此。
症状:
- 内存持续下降,无回收:
free -h
或top
中显示的free
内存持续减少,而buff/cache
并没有相应地大量增加。 - 交换空间持续增长:
vmstat
的swpd
列持续增加,si
和so
列出现持续的非零值,表明系统正在频繁地将内存数据交换到硬盘上。 - 特定进程内存飙升: 在
top
或ps aux --sort=-%mem
中,某个或某几个进程的RES
(常驻内存) 或VIRT
(虚拟内存) 值持续、缓慢地增长,即使其活动量不大。 - 系统响应变慢: 随着内存耗尽,系统开始频繁使用交换空间,导致磁盘I/O飙升,整体响应速度显著下降。
识别方法:
- 长期观察
top
或htop
: 周期性地查看进程列表,关注那些VIRT
和RES
值持续增长的进程。 ps aux --sort=-rss
: 运行这个命令,按常驻内存大小排序,找出当前内存占用最大的进程。然后可以记录下它们的PID和RSS值,过一段时间再运行一次,对比是否持续增长。vmstat
的swpd
和si
/so
: 持续观察vmstat 1
的输出,如果swpd
持续增加,并且si
/so
长期不为零,这是内存不足和交换活动频繁的明确信号。- 应用程序日志: 有些应用程序可能会在日志中记录内存使用情况或异常。
- 专业工具: 对于应用程序层面的内存泄漏,
valgrind
(针对C/C++程序) 或Go/Java
等语言自带的内存分析工具是更精确的利器。
应对内存泄漏:
- 定位源头: 确定是哪个应用程序或服务存在内存泄漏。
- 重启服务: 最直接但治标不治本的方法是重启有泄漏的服务,暂时释放内存。
- 代码审查与优化: 如果是自己开发的应用,需要深入代码,查找内存分配和释放不匹配的地方。
- 更新或降级: 如果是第三方应用,检查是否有更新版本修复了已知内存泄漏问题,或者尝试回滚到稳定版本。
识别持续的交换活动:
持续的交换活动(Swapping)意味着系统物理内存不足,正在频繁地将内存中的数据移到硬盘上的交换空间,或从交换空间移回内存。这会极大地降低系统性能,因为硬盘I/O比内存访问慢几个数量级。
症状:
vmstat
中si
和so
持续非零: 这是最直接的指标。si
(swap in)表示从磁盘读入交换页,so
(swap out)表示写入磁盘的交换页。只要它们持续有值,就说明系统正在频繁交换。- 磁盘活动灯常亮: 即使没有明显的读写操作,服务器的硬盘活动指示灯也频繁闪烁。
- 系统卡顿、响应缓慢: 无论是执行命令还是打开应用程序,都感觉明显迟滞。
应对持续交换活动:
- 增加物理内存: 最根本的解决方案。如果系统长期内存不足,增加RAM是最有效的办法。
- 优化内存使用:
- 关闭不必要的服务或进程: 找出并停止那些占用大量内存但并非必需的服务。
- 优化应用程序: 调整应用程序配置,减少其内存占用。例如,降低数据库的缓存大小,减少Web服务器的并发连接数等。
- 调整
swappiness
参数:swappiness
参数控制内核将进程数据从物理内存交换到硬盘的倾向。默认值通常是60(范围0-100)。sudo sysctl vm.swappiness=10
:将swappiness
设置为较低的值(如10),会减少内核将活跃进程交换出去的倾向,优先使用缓存。这通常能改善桌面和服务器的响应性,但可能会导致buff/cache
减少。- 要永久生效,需要修改
/etc/sysctl.conf
文件,添加或修改vm.swappiness = 10
,然后运行sudo sysctl -p
。
- 增加交换空间: 如果确实无法增加物理内存,并且内存压力巨大,可以考虑增加交换空间的大小。但这只是一个缓解措施,不能解决根本问题,因为交换空间的速度远不及物理内存。
- 检查内存泄漏: 持续的交换活动很可能是由内存泄漏引起的,所以要结合上述方法排查内存泄漏。
总的来说,处理这些问题需要耐心和细致的观察。从宏观的 vmstat
到微观的 top
进程列表,再到应用程序本身的日志和代码,一步步排查,才能找到真正的症结所在。
终于介绍完啦!小伙伴们,这篇关于《LinuxCPU内存监控:top与vmstat实用教程》的介绍应该让你收获多多了吧!欢迎大家收藏或分享给更多需要学习的朋友吧~golang学习网公众号也会发布文章相关知识,快来关注吧!

- 上一篇
- 新手必看!DeepSeekAI标题技巧,小红书爆款攻略!

- 下一篇
- AI模型搭配豆包制作教程详解
-
- 文章 · linux | 9分钟前 | dockercompose 性能优化 应用监控 多服务部署 Nginx+PHP+MySQL
- Docker多服务部署教程:Nginx+PHP+MySQL配置指南
- 398浏览 收藏
-
- 文章 · linux | 26分钟前 |
- Linux磁盘I/O优化技巧全解析
- 437浏览 收藏
-
- 文章 · linux | 1小时前 |
- Linux虚拟化教程:KVM与QEMU搭建指南
- 491浏览 收藏
-
- 文章 · linux | 1小时前 |
- Linux虚拟化部署:KVM与QEMU实战教程
- 414浏览 收藏
-
- 文章 · linux | 2小时前 |
- Linux负载均衡教程:HAProxy与Nginx详解
- 237浏览 收藏
-
- 文章 · linux | 3小时前 |
- Linux多用户资源管理:cgroups限制技巧
- 476浏览 收藏
-
- 文章 · linux | 3小时前 |
- Linux搭建Web服务器:Apache与Nginx配置教程
- 460浏览 收藏
-
- 文章 · linux | 3小时前 |
- LinuxNAT配置与iptables教程详解
- 129浏览 收藏
-
- 文章 · linux | 5小时前 |
- Linux系统NTP时间同步设置方法
- 320浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 542次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 511次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 498次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 484次学习
-
- 千音漫语
- 千音漫语,北京熠声科技倾力打造的智能声音创作助手,提供AI配音、音视频翻译、语音识别、声音克隆等强大功能,助力有声书制作、视频创作、教育培训等领域,官网:https://qianyin123.com
- 96次使用
-
- MiniWork
- MiniWork是一款智能高效的AI工具平台,专为提升工作与学习效率而设计。整合文本处理、图像生成、营销策划及运营管理等多元AI工具,提供精准智能解决方案,让复杂工作简单高效。
- 89次使用
-
- NoCode
- NoCode (nocode.cn)是领先的无代码开发平台,通过拖放、AI对话等简单操作,助您快速创建各类应用、网站与管理系统。无需编程知识,轻松实现个人生活、商业经营、企业管理多场景需求,大幅降低开发门槛,高效低成本。
- 107次使用
-
- 达医智影
- 达医智影,阿里巴巴达摩院医疗AI创新力作。全球率先利用平扫CT实现“一扫多筛”,仅一次CT扫描即可高效识别多种癌症、急症及慢病,为疾病早期发现提供智能、精准的AI影像早筛解决方案。
- 98次使用
-
- 智慧芽Eureka
- 智慧芽Eureka,专为技术创新打造的AI Agent平台。深度理解专利、研发、生物医药、材料、科创等复杂场景,通过专家级AI Agent精准执行任务,智能化工作流解放70%生产力,让您专注核心创新。
- 100次使用
-
- 命令行工具:应对Linux服务器安全挑战的利器
- 2023-10-04 501浏览
-
- 如何使用Docker进行容器的水平伸缩和负载均衡
- 2023-11-07 501浏览
-
- linux .profile的作用是什么
- 2024-04-07 501浏览
-
- 如何解决s权限位引发postfix及crontab异常
- 2024-11-21 501浏览
-
- 如何通过脚本自动化Linux上的K8S安装
- 2025-02-17 501浏览