繁体   English   中英

通过同时运行两个可执行文件来测量内存使用情况

[英]Measure memory usage by running two executables at the same time

我编译了一个代码并运行了两个可执行文件: exec1exec 2 它们都具有相同的代码,但是它们具有不同的输入。 我正在使用Kubuntu (非常新手)作为操作系统。

  • 每个可执行文件通过使用sqlite库与两个数据库进行exec1 :一个数据库用于exec1 ,另一个数据库用于exec2
  • 每个可执行文件都需要加载和解析一个xml文件

CPU信息

processor       : 5
vendor_id       : GenuineIntel
cpu family      : 6
model           : 44
model name      : Intel(R) Xeon(R) CPU           X5650  @ 2.67GHz
stepping        : 2
microcode       : 0x10
cpu MHz         : 2660.022
cache size      : 12288 KB
physical id     : 0
siblings        : 6
core id         : 10
cpu cores       : 6
apicid          : 20
initial apicid  : 20
fpu             : yes
fpu_exception   : yes
cpuid level     : 11
wp              : yes

问题

  • 是否可以知道同时运行两个可执行文件是否会影响两个可执行文件的速度?
  • 如何测量每个可执行文件使用的内存量?
  • 可以视觉上做吗?

使用脚本

通过使用以下脚本(需要更新):

echo "timestamp,VmSize,VmRSS";
while awk '{ printf "%s,%s,%s\n", systime(), $1, $2}' /proc/13417/statm; do sleep 1; done 


timestamp,VmSize,VmRSS
1427295959,92907,49655
1427295960,92907,49655
1427295961,92907,49655
1427295962,92907,49655
1427295964,92907,49655
1427295965,92907,49655

是否可以知道同时运行两个可执行文件是否会影响两个可执行文件的速度?

如果运行一个可执行文件需要N秒钟,而运行这些可执行文件中的两个可执行相同的N秒(无时间差),则它们不会相互影响。

如何测量每个可执行文件使用的内存量?

您可以使用此微型脚本每秒以csv格式输出时间戳和内存使用情况。

echo "timestamp,VmSizeKB,VmRssKB";
while awk '{ printf "%s,%s,%s\n", systime(), $1 * 4, $2 * 4}' /proc/<pid>/statm; do sleep 1; done

<pid>替换为您的进程ID。

可以视觉上做吗?

然后将该csv导入google docs或其他电子表格应用程序中,并构建一个漂亮的图表。 您仅对VmRSS列感兴趣,这是您的进程使用的物理内存量。

假定您具有(至少)两个物理CPU内核并且您的程序没有庞大的专用工作集,那么并行运行两个实例通常比一个又一个运行更快。 在某些情况下,情况恰恰相反,但通常在健康条件下,情况就是这样。

在正常情况下,任何两个实例(并发或一个接一个)将使用缓冲区高速缓存中的相同映射页来存储可执行数据和只读数据,但是同时运行的进程更有可能将内存置于最后一个高速缓存级别,并且它们同时在不同的CPU内核运行指令。
同样,使用fork创建的两个实例(请参见下文)将仅运行CRT初始化,并且在fork之前运行任何初始化代码,并且不需要额外的shell。

(现在,当然,如果您的进程执行大量锁定或大量并发的未缓冲I / O或消耗大量内存,则这些优点变得完全微不足道,并且变成缺点,因此,它们开始以不健康的方式进行干预。因此, ,“通常”,并非总是如此。)

两次运行同一程序(如果算上父级,实际上是三次)并进行测量(并比较它是否比一次调用快)的最简单方法是两次调用fork并自己进行测量。 实际上,只需调用一次 fork就足以运行两个实例,但是这样做有点扭曲,无法执行您想要执行的测量。

fork两次后,您将运行两个子进程(然后可以执行它们应做的任何事情)。 父进程使用clock_gettime获取当前时间,并在waitpid阻塞(两次)。

waitpid之后,父级再次调用clock_gettime并调用times

您现在可以使用:

  • 开始时间
  • 结束时间(您可以从中减去开始时间)
  • 孩子的用户和内核时间

这样,您就可以准确地知道执行子级(子级)所需的实时时间,以及执行该子级所需的CPU时间(用户和内核)。

你可以跑

myprogram argone &
myprogram argtwo &

运行两个在后台运行同一程序的进程。

您可能还对batchnohuptop感兴趣

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM