![检查 Linux 上程序的物理内存和 CPU 的总使用情况](https://linux22.com/image/1585790/%E6%A3%80%E6%9F%A5%20Linux%20%E4%B8%8A%E7%A8%8B%E5%BA%8F%E7%9A%84%E7%89%A9%E7%90%86%E5%86%85%E5%AD%98%E5%92%8C%20CPU%20%E7%9A%84%E6%80%BB%E4%BD%BF%E7%94%A8%E6%83%85%E5%86%B5.png)
我想比较 google chrome 和 firefox 使用的物理内存和 CPU 功率。因此,我尝试使用 htop 来执行此操作,我通常使用它来跟踪我的系统资源,但发现我无法得出结论。我已阅读了几个帖子,但我仍然感到困惑,原因如下:当我使用 F4 过滤例如 chrome 时,htop 会向我显示数十个我不知道是线程还是进程的任务。据我所知,线程共享相同的地址空间,但进程则不然。我可以按 F5 来查看树状视图,并且所有任务都有一个父任务。无论该程序使用多个进程还是线程,RES 列中父任务的值都表示总内存,CPU% 列中的值表示该程序的总 CPU 使用率,这显然是错误的。我通过做这个小实验发现了这一点:我运行了一个我找到的 python 程序,它使用多处理进行一些计算。这是我在 htop 中看到的:CPU% 列中的父值始终显示 0,但有 7 个任务上升到 100%(我的系统有 4 个物理核心,每个核心有 2 个线程)。
那么有人可以解释一下发生了什么吗?我如何检查程序的物理内存和 CPU 的总使用情况?
据我所知,确定确切的内存使用情况并不简单,但对我来说绝对值并不重要,我只需要可以用来比较的值。
答案1
你可以使用这个命令:
pgrep -P $(pgrep chrome) | xargs ps -o %mem,%cpu,cmd -p | awk '{memory+=$1;cpu+=$2} END {print memory,cpu}'
或者这个(更改 $9 来选择你的列):
top -b -n1 | grep chrome | awk '{ SUM += $9} END { print SUM }'
更多命令和建议可以在以下位置找到:
答案2
psgrep 给出错误:
$ pgrep -P $(pgrep chrome) | xargs ps -o %mem,%cpu,cmd -p | awk '{memory+=$1;cpu+=$2} END {print memory,cpu}'
pgrep: only one pattern can be provided
Try `pgrep --help' for more information.
error: list of process IDs must follow -p
Usage:
ps [options]
Try 'ps --help <simple|list|output|threads|misc|all>'
or 'ps --help <s|l|o|t|m|a>'
for additional help text.
For more details see ps(1).
我可以使用 htop PID 查看父任务并执行以下操作:
$ pgrep -P 1721 | xargs ps -o %mem,%cpu,cmd -p | awk '{memory+=$1;cpu+=$2} END {print memory,cpu}'
1.2 2.6
但 1.2% 的内存似乎太低了。
top 不会计算所有内容。例如:$ top -b -n1 | grep freeplane | awk '{ SUM += $9} END { print SUM }' 我得到 0,因为它只获取此命令:/usr/share/freeplane/freeplane.sh,但没有获取此命令:/usr/sbin/java -Xmx512m -Dorg.freeplane
ps auxf 似乎计算了所有内容,对于 chrome,我得到了这个:
$ ps auxf | grep chrome | awk '{ SUM += $4} END { print SUM }'
5.024G
这似乎更现实。但如果我用以下方法测量已用内存:
$ free -h
在关闭 Chrome 之前和之后,我看到了 2.4Gi 的差异。
编辑:我发现 ps_mem 可以很容易地检查和比较每个应用程序的内存使用情况。