使用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即可启动。
你会看到一个类似于仪表盘的界面:
us)、系统空间(
sy)、空闲(
id)、I/O等待(
wa)等。
%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和内存交换情况,对于发现长期存在的性能问题非常有帮助。
当你在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分钟内,处于可运行状态和不可中断睡眠状态的平均进程数。
然后,关注
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确实很棒,但它们只是冰山一角。在需要深入挖掘内存使用细节时,还有一些工具能提供更细致的视图:
1. free -h
:快速总览,更易读
这是我最常用的一个命令。
free -h会以人类可读的格式(如GB、MB)显示系统的总内存、已用、空闲、共享、缓冲区/缓存以及“可用”内存。
available(可用) 内存,它表示应用程序可以立即使用的内存量,包括未被使用的物理内存和可以回收的缓存/缓冲区内存。很多新手会只看
free,然后误以为内存不足,但实际上Linux会尽量把空闲内存用作缓存,提高系统性能。
2. htop
:交互式增强版 top
如果你觉得
top的界面有点“硬核”,
htop绝对值得一试(可能需要安装,如
sudo apt install htop)。
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系统性能下降的常见元凶,它们会让人感觉系统“越来越慢”,甚至最终崩溃。识别和应对它们需要一些观察和策略。
识别内存泄漏:
内存泄漏是指应用程序在分配内存后未能正确释放,导致内存占用持续增长,即使在没有明显活动时也是如此。
症状:
free -h或
top中显示的
free内存持续减少,而
buff/cache并没有相应地大量增加。
vmstat的
swpd列持续增加,
si和
so列出现持续的非零值,表明系统正在频繁地将内存数据交换到硬盘上。
top或
ps aux --sort=-%mem中,某个或某几个进程的
RES(常驻内存) 或
VIRT(虚拟内存) 值持续、缓慢地增长,即使其活动量不大。
识别方法:
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)表示写入磁盘的交换页。只要它们持续有值,就说明系统正在频繁交换。
应对持续交换活动:
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进程列表,再到应用程序本身的日志和代码,一步步排查,才能找到真正的症结所在。