检索 Linux 上单个进程的 CPU 使用率和内存使用率?
- 2024-10-22 08:29:00
- admin 原创
- 56
问题描述:
我想获取 Linux 上单个进程的 CPU 和内存使用情况 - 我知道 PID。希望我能每秒获取一次并使用“watch”命令将其写入 CSV。我可以使用什么命令从 Linux 命令行获取此信息?
解决方案 1:
ps -p <pid> -o %cpu,%mem,cmd
(您可以省略“cmd”,但这可能有助于调试)。
请注意,这给出了进程运行期间的平均 CPU 使用率。
解决方案 2:
caf 答案的一个变体:top -p <pid>
这会自动刷新 CPU 使用率,因此有利于监控。
解决方案 3:
ps
命令(不应使用):
CPU 使用率目前表示为进程整个生命周期内运行时间的百分比。
top
命令(应该使用):
该任务自上次屏幕更新以来所占的 CPU 时间份额,以占总 CPU 时间的百分比表示。
用于top
实时获取CPU使用率(当前短间隔):
top -b -n 2 -d 0.2 -p 6962 | tail -1 | awk '{print $9}'
将会回显如下:78.6
-b
:批处理模式-n 2
:迭代次数,使用2
原因是:当您第一次运行它时,它没有以前的样本可以比较,所以这些初始值是自启动以来的百分比。-d 0.2
:延迟时间(单位:秒,此处为200ms)-p 6962
:监控 PIDtail -1
:最后一行awk '{print $9}'
:第 9 列(CPU 使用率)
解决方案 4:
您可以使用以下方式通过进程名称获取结果
ps -C chrome -o %cpu,%mem,cmd
该-C
选项允许您使用进程名称而不必知道其 pid。
解决方案 5:
使用 pidstat(来自 sysstat -参考链接)。
例如,每 5 秒监控这两个进程 ID(12345 和 11223),使用
$ pidstat -h -r -u -v -p 12345,11223 5
解决方案 6:
启动程序并监视它
如果您想轻松地对可执行文件进行基准测试,此形式很有用:
topp() (
if [ -n "$O" ]; then
$* &
else
$* &>/dev/null &
fi
pid="$!"
trap "kill $pid" SIGINT
o='%cpu,%mem,vsz,rss'
printf '%s
' "$o"
i=0
while s="$(ps --no-headers -o "$o" -p "$pid")"; do
printf "$i $s
"
i=$(($i + 1))
sleep "${T:-0.1}"
done
)
用法:
topp ./myprog arg1 arg2
示例输出:
%cpu,%mem,vsz
0 0.0 0.0 177584
1 0.0 0.1 588024
2 0.0 0.1 607084
3 0.0 0.2 637248
4 0.0 0.2 641692
5 68.0 0.2 637904
6 80.0 0.2 642832
其中 vsz 是以 KiB 为单位的总内存使用量,例如上面的使用量约为 600MiB。
如果程序完成,循环将停止并且我们退出topp
。
或者,如果你按 git Ctrl + C,程序也会由于以下原因停止trap
:当我的 shell 脚本退出时,如何终止后台进程/作业?
选项包括:
T=0.5 topp ./myprog
:更改轮询间隔O=1 topp ./myprog
:不隐藏程序 stdout/stderr。这有助于关联内存使用量与 stdout 爆发的时间点。
ps
`top`与即时 CPU 使用率相比
请注意,上面给出的 CPU 使用率ps
不是“瞬时”的(即在过去的 N 秒内),而是进程整个生命周期的平均值,如:https://unix.stackexchange.com/questions/58539/top-and-ps-not-showing-the-same-cpu-result ps
内存测量应该没问题。
该线程以及:如何从 shell 确定当前 CPU 利用率?建议 Linux 内核不再存储任何中间使用情况统计信息,因此唯一的方法是轮询并计算前一个时期,这就是它的作用top
。
因此,如果我们想要这样做,我们可以使用top -n1
而不是ps
:
toppp() (
$* &>/dev/null &
pid="$!"
trap exit SIGINT
i=1
top -b n1 -d "${T:-0.1}" -n1 -p "$pid"
while true; do top -b n1 -d "${T:-0.1}" -n1 -p "$pid" | tail -1; printf "$i "; i=$(($i + 1)); done
)
如上所述:https: //stackoverflow.com/a/62421136/895245产生以下类型的输出:
top - 17:36:59 up 9:25, 12 users, load average: 0.32, 1.75, 2.21
Tasks: 1 total, 1 running, 0 sleeping, 0 stopped, 0 zombie
%Cpu(s): 13.4 us, 2.5 sy, 0.0 ni, 84.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
MiB Mem : 31893.7 total, 13904.3 free, 15139.8 used, 2849.7 buff/cache
MiB Swap: 0.0 total, 0.0 free, 0.0 used. 16005.5 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
706287 ciro 20 0 590436 40352 20568 R 106.7 0.1 0:00.16 node
706287 ciro 20 0 607060 57172 21340 R 126.7 0.2 0:00.35 node
1 706287 ciro 20 0 642008 80276 21812 R 113.3 0.2 0:00.52 node
2 706287 ciro 20 0 641676 93108 21812 R 113.3 0.3 0:00.70 node
3 706287 ciro 20 0 647892 99956 21812 R 106.7 0.3 0:00.87 node
4 706287 ciro 20 0 655980 109564 21812 R 140.0 0.3 0:01.09 node
一些相关主题:
如何
top
只运行一次(-b -n1
)如何删除标题
top
:没有人有更好的解决方案,所以我们只是tail
:
我唯一的问题是,它top
对于交互式使用来说不太好:
Ctrl + C 不会退出上述命令,不确定为什么
trap exit
它不起作用,就像它与 一样ps
。我必须终止命令Ctrl +
,然后这不会终止继续在后台运行的进程本身,这意味着如果它像服务器一样是一个无限循环,我必须ps aux
然后终止它。当基准测试程序退出时不会自动退出
也许比我更精通 shell 的人可以找到解决方案。
ps
`top`如果您只关注内存,则内存测量应该与此相同。
有关的:
检索 Linux 上单个进程的 CPU 使用率和内存使用率?
https://unix.stackexchange.com/questions/554/how-to-monitor-cpu-memory-usage-of-a-single-process
在 Ubuntu 21.10 上测试。
解决方案 7:
正如上面caf 的回答中所述,ps 和某些情况下的 pidstat 会为您提供 pCPU 的生命周期平均值。要获得更准确的结果,请使用 top。如果您需要运行一次 top,您可以运行:
top -b -n 1 -p <PID>
或者仅处理数据和标题:
top -b -n 1 -p <PID> | tail -3 | head -2
无标题:
top -b -n 1 -p <PID> | tail -2 | head -1
解决方案 8:
您可以使用top -b
并 grep 出您想要的 pid(使用-b
标志 top 以批处理模式运行),或者也可以使用-p
标志并指定 pid 而不使用 grep。
解决方案 9:
对于那些挣扎了一段时间并想知道为什么所选答案不起作用的人来说:
ps -p <pid> -o %cpu,%mem
%cpu,
和之间没有空格%mem
。
解决方案 10:
以下命令获取特定进程 (pid) 每 40 秒的平均 CPU 和内存使用情况
pidstat 40 -ru -p <pid>
我的情况的输出(前两行表示 CPU 使用率,后两行表示内存):
02:15:07 PM PID %usr %system %guest %CPU CPU Command
02:15:47 PM 24563 0.65 0.07 0.00 0.73 3 java
02:15:07 PM PID minflt/s majflt/s VSZ RSS %MEM Command
02:15:47 PM 24563 6.95 0.00 13047972 2123268 6.52 java
解决方案 11:
ps aux | awk '{print $4" "$11}' | sort | uniq -c | awk '{print $2" "$1" "$3}' | sort -nr
或按流程
ps aux | awk '{print $4" "$11}' | sort | uniq -c | awk '{print $2" "$1" "$3}' | sort -nr |grep mysql
解决方案 12:
ps axo pid,etime,%cpu,%mem,cmd | grep 'processname' | grep -v grep
PID——进程 ID
etime - 进程运行/存活时长
%cpu——CPU 使用率
%mem——内存使用情况
cmd——命令
将 processname 替换为您要跟踪的任何进程,mysql nginx php-fpm 等等...
解决方案 13:
上面列出了 CPU 和内存消耗最大的进程
ps axo %cpu,%mem,command | sort -nr | head
解决方案 14:
这里的所有答案都仅显示 PID 的内存百分比。
下面是一个如何获取所有 apache 进程的 rss 内存使用情况(以 KB 为单位)的示例,如果您只想查看特定的 PID,请将“grep apache”替换为“grep PID”:
watch -n5 "ps aux -y | grep apache | awk '{print $2,$6}'"
这将打印:
Every 5.0s: ps aux -y | grep apache | awk '{print $2,$6}'
Thu Jan 25 15:44:13 2018
12588 9328
12589 8700
12590 9392
12591 9340
12592 8700
12811 15200
15453 9340
15693 3800
15694 2352
15695 1352
15697 948
22896 9360
使用 CPU %:
watch -n5 "ps aux -y | grep apache | awk '{print $2,$3,$6}'"
输出:
Every 5.0s: ps aux -y | grep apache | awk '{print $2,$3,$6}'
Thu Jan 25 15:46:00 2018
12588 0.0 9328
12589 0.0 8700
12590 0.0 9392
12591 0.0 9340
12592 0.0 8700
12811 0.0 15200
15453 0.0 9340
15778 0.0 3800
15779 0.0 2352
15780 0.0 1348
15782 0.0 948
22896 0.0 9360
解决方案 15:
要获取应用程序的内存使用情况(而不是它使用的共享库),您需要使用 Linux smaps 接口。这个答案很好地解释了这一点。
解决方案 16:
ps aux|awk '{print $2,$3,$4}'|grep PID
其中第一列是 PID,第二列是 CPU 使用率,第三列是内存使用率。
解决方案 17:
(如果你使用的是 MacOS 10.10,请尝试 top 的累积 -c 选项:
top -c a -pid PID
(该选项在其他 Linux 上不可用,已使用 Scientific Linux el6 和 RHEL6 尝试过)
解决方案 18:
这是一个很好的技巧,可以实时跟踪一个或多个程序,同时观察其他工具的输出:
watch "top -bn1 -p$(pidof foo),$(pidof bar); tool"
解决方案 19:
根据@caf 的回答,这对我来说很有效。
计算给定 PID 的平均值:
测量工具
times=100
total=0
for i in $(seq 1 $times)
do
OUTPUT=$(top -b -n 1 -d 0.1 -p $1 | tail -1 | awk '{print $9}')
echo -n "$i time: ${OUTPUT}"\\r
total=`echo "$total + $OUTPUT" | bc -l`
done
#echo "Average: $total / $times" | bc
average=`echo "scale=2; $total / $times" | bc`
echo "Average: $average"
用法:
# send PID as argument
sh measure.sh 3282
解决方案 20:
根据这个答案,N samples
我们可以通过sampling period T
以下方式收集数据来估计特定进程在特定时间内的平均 CPU 和内存利用率:
N=3;
T=1;
PROCESS_NAME="my_proc";
top -b -c -n $(let tmp=N+1; echo $tmp) -d ${T} -p $(pgrep ${PROCESS_NAME}) |
grep ${PROCESS_NAME} |
tee /var/tmp/foo.log |
tail -n +2 |
awk -v N=$N 'BEGIN{
c=0;
m=0
}{
c=c+$9;
m=m+$10
}END{
printf("%s %s
", c/N, m/N)
}';
为了能够评估结果,我们将顶部的输出收集到/var/tmp/foo.log
文件中。预期输出如下:
2.33333 6.9
我们的日志文件的内容:
196918 root 20 0 24.4g 1.3g 113872 S 0.0 6.9 39:58.15 my_proc
196918 root 20 0 24.4g 1.3g 113872 S 2.0 6.9 39:58.17 my_proc
196918 root 20 0 24.4g 1.3g 113872 S 3.0 6.9 39:58.20 my_proc
196918 root 20 0 24.4g 1.3g 113872 S 2.0 6.9 39:58.22 my_proc
请注意,我们忽略(tail -n +2
)top 命令的第一次执行。
解决方案 21:
我使用 htop
sudo apt install htop
htop
按F3
搜索您感兴趣的进程并记住 PID。退出q
并再次启动 htop,仅显示您想要的进程
htop -p $PID
解决方案 22:
根据@Neon 的回答,我的看法如下:
pidstat -h -r -u -v -p $(ps aux | grep <process name> | awk '{print $2}' | tr '
' ',')
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件