Linux如何查看进程的CPU和内存占用

40次阅读

kquote>要查看Linux进程的CPU和内存占用,最直接的方法是使用topps和htop命令。top提供实时动态监控,可按P键以CPU使用率排序,按M键以内存使用率排序,显示各进程的%CPU和%MEM等关键指标;ps用于获取某一时刻的进程快照,常用ps aux或结合grep查找特定进程,如ps aux | grep nginx;htoptop的增强版,界面更友好,支持鼠标操作和树状视图,便于直观分析。对于特定进程,可通过ps -p PID -o %cpu,%mem,cmd精确查询其资源占用,或使用pidstat进行细粒度采样分析。内存方面需重点理解VIRT(虚拟内存总量)、RES(实际物理内存占用)和SHR(共享内存大小),其中RES是判断内存压力的核心指标,VIRT反映地址空间大小,SHR表示共享部分,避免误判内存消耗。kquote>

Linux如何查看进程的CPU和内存占用

在Linux系统上,要查看进程的CPU和内存占用,最直接有效的方法就是使用

top

htop

(如果已安装)和

ps

这些命令行工具。它们能让你快速了解系统整体或特定进程的资源消耗情况,是诊断性能问题的利器。

解决方案

要详细了解Linux进程的CPU和内存占用,我们通常会用到以下几个工具,它们各有侧重:

1.

top

命令:实时动态监控

top

是一个非常强大的实时监控工具,它会动态刷新显示当前系统中所有进程的资源使用情况。

top

运行后,你会看到一个交互式的界面,其中包含了许多重要的信息列:

  • PID: 进程ID。
  • USER: 进程所有者。
  • PR: 优先级。
  • NI: Nice值,负值表示高优先级,正值表示低优先级。
  • VIRT: 进程使用的虚拟内存总量(Virtual Memory Size)。
  • RES: 进程当前使用的物理内存总量(Resident Set Size)。
  • SHR: 进程使用的共享内存大小(Shared Memory Size)。
  • S: 进程状态(R运行,S睡眠,T停止,Z僵尸)。
  • %CPU: 进程使用的CPU百分比。
  • %MEM: 进程使用的物理内存百分比。
  • TIME+: 进程启动后占用的CPU总时间。
  • COMMAND: 启动进程的命令名。

top

界面中,你可以按

P

键按CPU使用率排序,按

M

键按内存使用率排序,按

k

键输入PID来杀死一个进程,按

q

键退出。这使得

top

成为快速诊断系统瓶颈的首选。

2.

ps

命令:快照式查看

ps

命令提供的是系统某一时刻的进程快照,不像

top

那样实时更新。它非常适合查找特定进程或进行脚本处理。

查看所有进程的详细信息:

ps aux

或者使用更详细的格式:

ps -ef
ps aux

的输出中,

%CPU

%MEM

列会直接显示CPU和内存占用百分比。如果你想查找特定进程,可以结合

grep

ps aux | grep nginx

这将列出所有包含”nginx“关键字的进程及其资源占用。

3.

htop

命令:增强型交互式监控

htop

top

的一个增强版本,提供了更友好的交互界面、彩色显示和更直观的操作。如果你的系统上没有,通常可以通过包管理器安装(例如,

sudo apt install htop

sudo yum install htop

)。

htop
htop

允许你使用鼠标或方向键轻松选择进程,按

F6

进行排序,按

F9

发送信号(杀死进程)等,非常方便。

Linux如何查看进程的CPU和内存占用

如何实时监控Linux进程的资源使用情况?

当系统出现卡顿或者某个服务响应变慢时,我最先想到的就是实时监控工具。

top

htop

无疑是这方面的佼佼者。它们不仅仅是显示数据,更提供了一个动态的窗口,让你能“看”到系统的呼吸。

top

的优势在于其普遍性,几乎所有Linux发行版都自带,无需额外安装。进入

top

界面后,我通常会先按

P

键,让CPU占用最高的进程排在最前面,看看是不是有某个失控的进程在“吃”CPU。接着,我可能会按

M

键,检查内存大户,特别是那些

%MEM

值异常高的进程。理解

VIRT

RES

SHR

这三列内存指标非常重要,稍后我们会详细讨论。

top

的交互性让它在快速定位问题时非常高效,比如发现一个异常进程,可以直接按

k

输入PID将其杀死,当然这需要谨慎操作。

htop

则更像是一个升级版的

top

。它的彩色界面、更直观的CPU核心使用图、以及方便的鼠标操作,让我在长时间监控或需要频繁筛选、排序时更偏爱它。

htop

的树状视图(按

F5

)能清晰地展示父子进程关系,这在调试某些复杂应用时非常有用,比如一个Web服务器可能启动了多个工作进程,通过树状视图可以一目了然。我经常用

htop

来观察某个服务启动后的资源曲线,看看它是不是有内存泄漏的迹象,或者在特定负载下CPU使用是否合理。

除了这两个,偶尔我也会用

watch -n 1 'ps aux --sort=-%cpu | head -n 10'

这样的命令组合,每秒刷新一次,显示CPU占用最高的10个进程,虽然不如

top

/

htop

交互性强,但在某些脚本或自动化场景下也挺实用。

Linux如何查看进程的CPU和内存占用

如何查找特定进程的CPU和内存占用?

很多时候,我们并不想看整个系统的资源情况,而是想聚焦到某个特定的应用或服务上,比如一个数据库进程、一个Web服务器或者我正在开发的某个程序。这时候,

ps

命令就显得非常灵活了。

最常用的方法是结合

grep

ps aux | grep my_application

这会列出所有名称中包含

my_application

的进程。但要注意,

grep

本身也会作为一个进程出现在输出中,所以通常我们会再加一个

grep -v grep

来排除它:

ps aux | grep my_application | grep -v grep

这样就能得到干净的进程列表,其中包含

PID

%CPU

%MEM

等信息。

如果我已经知道进程的PID,那么可以直接用

ps -p <PID> -o %cpu,%mem,cmd

来精确获取其CPU和内存百分比以及完整的命令。例如,如果我的应用PID是12345:

ps -p 12345 -o %cpu,%mem,cmd

这种方式非常精确,尤其是在脚本中处理时。

对于更高级的场景,例如需要查看进程在一段时间内的资源变化趋势,

pidstat

(属于

sysstat

工具包)就非常强大了。它可以提供更详细的进程级别CPU、内存、I/O等统计信息,并且可以指定采样间隔和次数。

# 每秒采样一次,共采样5次,查看PID为12345的进程CPU使用情况 pidstat -u -p 12345 1 5  # 查看PID为12345的进程内存使用情况 pidstat -r -p 12345 1 5
pidstat

给出的数据颗粒度更细,对于性能分析和容量规划非常有帮助。我个人在排查一些偶发性性能问题时,会倾向于用

pidstat

来捕捉特定进程在某个时间段的行为模式。

Linux如何查看进程的CPU和内存占用

Linux进程内存占用中的VIRTRESSHR分别代表什么?

这三个内存指标,初看起来容易混淆,但理解它们之间的区别对于准确评估进程的内存需求至关重要。我见过太多人因为只看

VIRT

值就误判内存压力的例子。

  • VIRT (Virtual Memory Size)

    VIRT

    代表的是进程当前可能使用的虚拟内存总量。这包括了进程的代码段、数据段、堆、栈,以及所有映射到进程地址空间的共享库、文件,甚至包括已经交换到磁盘上的内存页。它是一个理论上的上限,很多时候远大于进程实际占用的物理内存。例如,一个程序可能加载了大量的共享库,即使它只使用了其中一小部分功能,这些库的全部虚拟地址空间也会计入

    VIRT

    。所以,

    VIRT

    值很高并不一定意味着进程消耗了大量的物理内存,它更多地反映了进程的地址空间布局。

  • RES (Resident Set Size)

    RES

    是进程当前实际占用物理内存(RAM)的大小。这才是我们通常所说的“真实内存占用”。它不包括被交换到磁盘上的内存,也不包括共享给其他进程但当前未被当前进程使用的部分。当你在评估一个进程是否是“内存大户”时,

    RES

    是最关键的指标。如果

    RES

    持续增长,那很可能意味着内存泄漏或者进程确实需要大量内存来运行。

  • SHR (Shared Memory Size)

    SHR

    表示进程与其他进程共享的物理内存大小。这部分内存通常是共享库(如libc)的代码和数据。当多个进程都使用同一个共享库时,这个库的代码和数据只会在物理内存中加载一份,然后映射到每个进程的地址空间。

    SHR

    值高,说明该进程使用了较多的共享内存,这部分内存的消耗是分摊到多个进程上的,所以它并不会完全计入当前进程的独立内存开销。

简单来说,

RES

是衡量进程对系统物理内存压力的最直接指标。

VIRT

是潜力,

RES

是现实,

SHR

是共享。理解了这三者,就能更准确地判断一个进程的内存行为,避免被庞大的

VIRT

值所迷惑。在排查内存问题时,我总是先看

RES

,如果

RES

很高,再结合

SHR

来判断这部分内存是独占的还是共享的,从而更精确地定位问题。

相关标签:

k="hits_log(2,'www',this);" href-data="/zt/15718.html" target="_blank">linux k="hits_log(2,'www',this);" href-data="/zt/16000.html" target="_blank">nginx k="hits_log(2,'www',this);" href-data="/zt/16186.html" target="_blank">app k="hits_log(2,'www',this);" href-data="/zt/16887.html" target="_blank">工具 k="hits_log(2,'www',this);" href-data="/zt/17328.html" target="_blank">虚拟内存 k="hits_log(2,'www',this);" href-data="/zt/21592.html" target="_blank">linux系统 k="hits_log(2,'www',this);" href-data="/zt/27988.html" target="_blank">区别 k="hits_log(2,'www',this);" href-data="/zt/38616.html" target="_blank">内存占用 k="hits_log(2,'www',this);" href-data="/zt/122037.html" target="_blank">red k="hits_log(2,'www',this);" href-data="/search?word=nginx" target="_blank">nginx k="hits_log(2,'www',this);" href-data="/search?word=sort" target="_blank">sort k="hits_log(2,'www',this);" href-data="/search?word=栈" target="_blank">栈 k="hits_log(2,'www',this);" href-data="/search?word=堆" target="_blank">堆 k="hits_log(2,'www',this);" href-data="/search?word=数据库" target="_blank">数据库 k="hits_log(2,'www',this);" href-data="/search?word=linux" target="_blank">linux k="hits_log(2,'www',this);" href-data="/search?word=自动化" target="_blank">自动化

k="hits_log(2,'www',this);" href-data="/zt/15718.html" target="_blank">linux k="hits_log(2,'www',this);" href-data="/zt/16000.html" target="_blank">nginx k="hits_log(2,'www',this);" href-data="/zt/16186.html" target="_blank">app k="hits_log(2,'www',this);" href-data="/zt/16887.html" target="_blank">工具 k="hits_log(2,'www',this);" href-data="/zt/17328.html" target="_blank">虚拟内存 k="hits_log(2,'www',this);" href-data="/zt/21592.html" target="_blank">linux系统 k="hits_log(2,'www',this);" href-data="/zt/27988.html" target="_blank">区别 k="hits_log(2,'www',this);" href-data="/zt/38616.html" target="_blank">内存占用 k="hits_log(2,'www',this);" href-data="/zt/122037.html" target="_blank">red k="hits_log(2,'www',this);" href-data="/search?word=nginx" target="_blank">nginx k="hits_log(2,'www',this);" href-data="/search?word=sort" target="_blank">sort k="hits_log(2,'www',this);" href-data="/search?word=栈" target="_blank">栈 k="hits_log(2,'www',this);" href-data="/search?word=堆" target="_blank">堆 k="hits_log(2,'www',this);" href-data="/search?word=数据库" target="_blank">数据库 k="hits_log(2,'www',this);" href-data="/search?word=linux" target="_blank">linux k="hits_log(2,'www',this);" href-data="/search?word=自动化" target="_blank">自动化

text=ZqhQzanResources