This question is covered here in great detail.
如何衡量Linux中应用程序或进程的内存使用情况?
在Understanding memory usage on Linux的博客文章中, ps
不是用于此意图的准确工具 .
为什么ps“错误”取决于你如何看待它,ps不报告进程的实际内存使用情况 . 它真正做的是显示每个进程在运行的唯一进程中将占用多少实内存 . 当然,典型的Linux机器在任何给定时间都有几十个进程运行,这意味着ps报告的VSZ和RSS数量几乎肯定是错误的 .
30 回答
我建议你使用atop . 您可以在this page上找到有关它的所有信息 . 它能够为您的流程提供所有必需的KPI,并且还可以捕获到文件 .
这里有另一个对valgrind的投票,但我想补充一点,你可以使用像Alleyoop这样的工具来帮助你解释valgrind生成的结果 .
我一直使用这两个工具,并始终使用精益,无泄漏的代码来自豪地展示它;)
如果您的代码是C或C,您可以使用
getrusage()
,它会返回有关进程的内存和时间使用情况的各种统计信息 .并非所有平台都支持此功能,并且将为内存使用选项返回0值 .
相反,您可以查看在
/proc/[pid]/statm
中创建的虚拟文件(其中[pid]
将替换为您的进程ID . 您可以从getpid()
获取此文件) .此文件看起来像一个包含7个整数的文本文件 . 您可能对此文件中的第一个(所有内存使用)和第六个(数据内存使用)数字最感兴趣 .
Valgrind 可以显示详细信息,但它显着地显示了目标应用程序,并且大多数时候它会更改应用程序的行为 .
Exmap 是我还不知道的东西,但似乎你需要一个 kernel module 来获取信息,这可能是一个障碍 .
我假设每个人都想知道WRT "memory usage"如下......
在linux中,单个进程可能使用的物理内存量大致可分为以下几类 .
M.a anonymous mapped memory
.p私有
.d dirty == malloc / mmapped堆和堆栈分配和写入的内存
.c clean == malloc / mmapped堆和堆栈内存一旦分配,写入,然后释放,但尚未回收
.s分享
.d dirty == malloc/mmaped heap could get copy-on-write and shared among processes (已编辑)
.c clean == malloc/mmaped heap could get copy-on-write and shared among processes (已编辑)
M.n named mapped memory
.p私有
.d dirty ==文件mmapped写入内存私有
.c clean ==映射程序/库文本私有映射
.s分享
.d dirty ==文件mmapped写入内存共享
.c clean ==映射库文本共享映射
Android中包含的名为 showmap 的实用程序非常有用
以root身份使用它,您可以获得每个进程的内存使用情况的清晰输出 .
输出示例:
命令行下方将为您提供在Linux机器上运行的各种进程使用的总内存(MB)
还有三种尝试方法:
ps aux --sort pmem
它按
%MEM
对输出进行排序 .ps aux | awk '{print $2, $4, $11}' | sort -k2r | head -n 15
它使用管道排序 .
top -a
它由
%MEM
开始排序(摘自here)
使用smem,这是ps的替代方案,可计算每个进程的USS和PSS . 你想要的可能是PSS .
USS - 独特的套装尺寸 . 这是该进程特有的非共享内存量(将其视为唯一内存的U) . 它不包括共享内存 . 因此,这将低估进程使用的内存量,但在您想要忽略共享内存时很有用 .
PSS - 比例集大小 . 这就是你想要的 . 它将唯一内存(USS)以及其共享内存的一部分除以共享该内存的其他进程的数量加在一起 . 因此,它将准确地表示每个进程使用多少实际物理内存 - 共享内存真正表示为共享 . 想想P是物理记忆 .
如何与 ps 和其他实用程序报告的RSS进行比较:
注意:smem还可以(可选)输出饼图等图形 . IMO你不需要任何这些 . 如果您只想在命令行中使用它,就像使用ps -A v一样,那么您不需要安装python-matplotlib推荐的依赖项 .
除了你的答案中列出的解决方案,你可以使用Linux命令“top”;它提供了运行系统的动态实时视图,它为整个系统以及每个程序提供CPU和内存使用百分比:
通过程序pid过滤:
按程序名称过滤:
“top”还提供了一些字段,例如:
VIRT - 虚拟映像(kb):任务使用的虚拟内存总量
RES - 驻留大小(kb):任务使用的非交换物理内存; RES =代码数据 .
数据 - 数据堆栈大小(kb):专用于可执行代码以外的物理内存量,也称为“数据驻留集”大小或DRS .
SHR - 共享内存大小(kb):任务使用的共享内存量 . 它只是反映了可能与其他进程共享的内存 .
参考here .
在最新版本的linux中,使用smaps子系统 . 例如,对于PID为1234的进程:
它会告诉你当时正在使用多少内存 . 更重要的是,它会将内存划分为私有和共享,因此您可以判断程序实例使用了多少内存,而不包括程序的多个实例之间共享的内存 .
time
怎么样?不是Bash内置
time
,而是你可以用which time
找到的那个,例如/usr/bin/time
这是它涵盖的内容,简单的
ls
:我正在使用Arch Linux,这是一个名为
ps_mem
的精彩软件包示例输出
虽然这个问题似乎是关于检查当前正在运行的进程,但我希望看到应用程序从头到尾使用的峰值内存 . 除了valgrind,你可以使用tstime,这更简单 . 它测量"highwater"内存使用情况(RSS和虚拟) . 来自this answer .
试试pmap命令:
很难说清楚,但这里有两个“关闭”的东西可以提供帮助 .
会给你虚拟尺寸(VSZ)
您还可以通过转到
/proc/$pid/status
从/ proc文件系统获取详细的统计信息最重要的是VmSize,它应该接近
ps aux
给出的值 .检查shell脚本以检查memory usage by application in linux . 也可在github和版本without paste and bc中找到 .
使用
ps
或类似工具,您只能获得该进程分配的内存页数 . 这个数字是正确的,但是:如果页面是共享的,
如果您真的想知道应用程序实际使用的内存量,则需要在分析器中运行它 . 例如,
valgrind
可以为您提供有关内存使用量的见解,更重要的是,可以为您提供有关程序中可能的内存泄漏的信息 . valgrind的堆分析器工具名为'massif':如valgrind documentation中所述,您需要通过valgrind运行程序:
Massif写了一个内存使用快照转储(例如
massif.out.12345
) . 它们提供(1)内存使用的时间线,(2)每个快照,记录程序内存的分配位置 . 用于分析这些文件的一个很棒的图形工具是massif-visualizer . 但我发现ms_print
,一个随valgrind一起提供的简单的基于文本的工具,已经有了很大的帮助 .要查找内存泄漏,请使用valgrind的(默认)
memcheck
工具 .如果你想要比使用Valgrind进行分析更快的东西并且你的内核更老并且你不能使用smaps,那么带有显示进程驻留集的选项的ps(使用
ps -o rss,command
)可以为你提供一个快速而合理的_aproximation_
真实正在使用的未交换内存量 .基于对相关question的回答 .
您可以使用SNMP来获取网络中特定设备中进程的内存和CPU使用情况:)
Requirements:
运行该进程的设备应安装并运行snmp
snmp应配置为接受下面运行脚本的请求(可能在snmpd.conf中配置)
您应该知道要监视的进程的进程ID(pid)
Notes:
HOST-RESOURCES-MIB::hrSWRunPerfCPU 是此进程占用的系统总CPU资源的厘秒数 . 请注意,在多处理器系统上,此值可能在实际(挂钟)时间的1厘米内增加超过1厘秒 .
HOST-RESOURCES-MIB::hrSWRunPerfMem 是分配给此进程的实际系统内存总量 .
**
Process monitoring script:
**
如果进程没有耗尽太多内存(或者是因为你希望是这种情况,或者其他命令已经给出了这个初始指示),那么进程可以承受在短时间内停止,您可以尝试使用gcore命令 .
检查生成的核心文件的大小,以便了解特定进程使用的内存量 .
如果进程使用数百个megs或gigs,这将无法正常工作,因为核心生成可能需要几秒或几分钟才能创建,具体取决于I / O性能 . 在核心创建期间,该过程被停止(或“冻结”)以防止记忆改变 . 所以要小心 .
还要确保生成核心的挂载点具有足够的磁盘空间,并且系统不会对在该特定目录中创建的核心文件产生负面反应 .
编辑: this works 100% well only when memory consumption increases
如果要监视给定进程(或已处理的共享公用名组,例如
google-chrome
)的内存使用情况,可以使用我的bash脚本:这将不断寻找变化并打印出来 .
对更多"real world"用法的一个很好的测试是打开应用程序,然后运行
vmstat -s
并检查"active memory"统计信息 . 关闭应用程序,等待几秒钟再次运行vmstat -s
. 然而,应用程序明显使用了很多活动内存 .没有简单的方法可以计算出来 . 但有些人试图得到一些好的答案:
ps_mem.py
ps_mem.py at github
使用ubuntu中提供的内置“ system monitor ”GUI工具
对此没有一个答案,因为您无法准确指出进程使用的内存量 . linux下的大多数进程都使用共享库 . 例如,假设您要计算'ls'进程的内存使用情况 . 您是否只计算可执行文件'ls'使用的内存(如果可以隔离它)? libc怎么样?或者所有这些运行'ls'所需的其他库?
你可以说它们是由其他进程共享的,但是如果没有加载它们就不能在系统上运行'ls' .
此外,如果您需要知道进程需要多少内存才能进行容量规划,则必须计算该进程的每个其他副本使用的内存量 . 我认为/ proc / PID / status可能会一次给你足够的内存使用信息 . 另一方面,valgrind将在程序的整个生命周期内为您提供更好的内存使用情况
这是对工具和问题的出色总结:archive.org link
我会引用它,以便更多开发者真正阅读它 .
如果你有时间运行它,Valgrind是惊人的 .
valgrind --tool=massif
是正确的解决方案 .但是,我开始运行更大的示例,并且使用valgrind不再实用 . 有没有办法告诉程序的最大内存使用量(模数页面大小和共享页面)?
在真正的unix系统上,
/usr/bin/time -v
有效 . 但是,在Linux上,这不起作用 .得到valgrind . 给它你的程序运行,它会告诉你很多关于它的内存使用情况 .
这仅适用于运行一段时间并停止的程序 . 我不知道valgrind是否可以在已经运行的进程中获取或者不应该停止诸如守护进程之类的进程 .
我正在使用
htop
;这是一个非常好的控制台程序,类似于Windows任务管理器 .