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

2024-10-22 08:29:00
admin
原创
219
摘要:问题描述:我想获取 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大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1565  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1354  
  信创国产芯片作为信息技术创新的核心领域,对于推动国家自主可控生态建设具有至关重要的意义。在全球科技竞争日益激烈的背景下,实现信息技术的自主可控,摆脱对国外技术的依赖,已成为保障国家信息安全和产业可持续发展的关键。国产芯片作为信创产业的基石,其发展水平直接影响着整个信创生态的构建与完善。通过不断提升国产芯片的技术实力、产...
国产信创系统   21  
  信创生态建设旨在实现信息技术领域的自主创新和安全可控,涵盖了从硬件到软件的全产业链。随着数字化转型的加速,信创生态建设的重要性日益凸显,它不仅关乎国家的信息安全,更是推动产业升级和经济高质量发展的关键力量。然而,在推进信创生态建设的过程中,面临着诸多复杂且严峻的挑战,需要深入剖析并寻找切实可行的解决方案。技术创新难题技...
信创操作系统   27  
  信创产业作为国家信息技术创新发展的重要领域,对于保障国家信息安全、推动产业升级具有关键意义。而国产芯片作为信创产业的核心基石,其研发进展备受关注。在信创国产芯片的研发征程中,面临着诸多复杂且艰巨的难点,这些难点犹如一道道关卡,阻碍着国产芯片的快速发展。然而,科研人员和相关企业并未退缩,积极探索并提出了一系列切实可行的解...
国产化替代产品目录   28  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

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

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

内置subversion和git源码管理

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

免费试用