检索 Linux 上单个进程的 CPU 使用率和内存使用率?

2024-10-22 08:29:00
admin
原创
238
摘要:问题描述:我想获取 Linux 上单个进程的 CPU 和内存使用情况 - 我知道 PID。希望我能每秒获取一次并使用“watch”命令将其写入 CSV。我可以使用什么命令从 Linux 命令行获取此信息?解决方案 1:ps -p <pid> -o %cpu,%mem,cmd (您可以省略“...

问题描述:

我想获取 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:监控 PID

  • tail -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对于交互式使用来说不太好:

  • Ctrl + C 不会退出上述命令,不确定为什么trap exit它不起作用,就像它与 一样ps。我必须终止命令Ctrl + ,然后这不会终止继续在后台运行的进程本身,这意味着如果它像服务器一样是一个无限循环,我必须ps aux然后终止它。

  • 当基准测试程序退出时不会自动退出

也许比我更精通 shell 的人可以找到解决方案。

ps`top`如果您只关注内存,则内存测量应该与此相同。

有关的:

在 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 '
' ',')
相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   2560  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1552  
  IPD(Integrated Product Development)流程作为一种先进的产品开发管理模式,在众多企业中得到了广泛应用。其中,技术评审与决策评审是IPD流程中至关重要的环节,它们既有明显的区别,又存在紧密的协同关系。深入理解这两者的区别与协同,对于企业有效实施IPD流程,提升产品开发效率与质量具有重要意义...
IPD管理流程   1  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、ClickUp、Freshdesk、GanttPRO、Planview、Smartsheet、Asana、Nifty、HubPlanner、Teamwork。在当今快速变化的商业环境中,项目管理软件已成为企业提升效率、优化资源分配和确保项目按时交付的关键工具。然而...
项目管理系统   2  
  建设工程项目质量关乎社会公众的生命财产安全,也影响着企业的声誉和可持续发展。高质量的建设工程不仅能为使用者提供舒适、安全的环境,还能提升城市形象,推动经济的健康发展。在实际的项目操作中,诸多因素会对工程质量产生影响,从规划设计到施工建设,再到后期的验收维护,每一个环节都至关重要。因此,探寻并运用有效的方法来提升建设工程...
工程项目管理制度   3  
热门文章
项目管理软件有哪些?
曾咪二维码

扫码咨询,免费领取项目管理大礼包!

云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用