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

2024-10-22 08:29:00
admin
原创
57
摘要:问题描述:我想获取 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 '
' ',')
相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   601  
  华为IPD与传统研发模式的8大差异在快速变化的商业环境中,产品研发模式的选择直接决定了企业的市场响应速度和竞争力。华为作为全球领先的通信技术解决方案供应商,其成功在很大程度上得益于对产品研发模式的持续创新。华为引入并深度定制的集成产品开发(IPD)体系,相较于传统的研发模式,展现出了显著的差异和优势。本文将详细探讨华为...
IPD流程是谁发明的   7  
  如何通过IPD流程缩短产品上市时间?在快速变化的市场环境中,产品上市时间成为企业竞争力的关键因素之一。集成产品开发(IPD, Integrated Product Development)作为一种先进的产品研发管理方法,通过其结构化的流程设计和跨部门协作机制,显著缩短了产品上市时间,提高了市场响应速度。本文将深入探讨如...
华为IPD流程   9  
  在项目管理领域,IPD(Integrated Product Development,集成产品开发)流程图是连接创意、设计与市场成功的桥梁。它不仅是一个视觉工具,更是一种战略思维方式的体现,帮助团队高效协同,确保产品按时、按质、按量推向市场。尽管IPD流程图可能初看之下显得错综复杂,但只需掌握几个关键点,你便能轻松驾驭...
IPD开发流程管理   8  
  在项目管理领域,集成产品开发(IPD)流程被视为提升产品上市速度、增强团队协作与创新能力的重要工具。然而,尽管IPD流程拥有诸多优势,其实施过程中仍可能遭遇多种挑战,导致项目失败。本文旨在深入探讨八个常见的IPD流程失败原因,并提出相应的解决方法,以帮助项目管理者规避风险,确保项目成功。缺乏明确的项目目标与战略对齐IP...
IPD流程图   8  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

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

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

内置subversion和git源码管理

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

免费试用