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

Measure memory usage by running two executables at the same time

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


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(), , }' /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

你可以运行

myprogram argone &
myprogram argtwo &

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

您可能还对 batchnohup 以及 top

感兴趣

Is it possible to know if running both executables at the same time will affect the speed of both executables?

如果 运行 一个可执行文件需要 N 秒,而 运行 其中两个可执行文件需要相同的 N 秒(没有时间差),那么它们不会相互影响。

How do I measure the amount memory used by every executable?

您可以使用这个小脚本每秒以 csv 格式输出时间戳和内存使用情况。

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

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

Is it possible to do it visually?

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

假设您有(至少)两个可用的物理 CPU 内核并且您的程序没有庞大的私有工作集,运行并行处理两个实例通常会更快比 运行 他们一个接一个。在某些情况下情况恰恰相反,但通常情况下,在健康的情况下,情况会如此。

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

(当然,如果您的进程进行大量锁定或大量并发无缓冲 I/O 或者如果它们消耗大量内存,那么这些优势将变得微不足道并变成劣势,因此它们开始以不健康的方式进行干预。因此,"usually",并非总是如此。)

运行使同一个程序运行两次(好吧,实际上是三次,如果算上 parent)和测量(并比较它是否比一次调用快)的最简单方法是调用fork 两次,然后自己测量。实际上调用 fork 一次 就足以 运行 连接两个实例,但是要进行您想做的测量会有点扭曲。

在你 fork twice, you have two child processes running (which can then do whatever they're supposed to do). The parent process gets the current time with clock_gettime 之后阻塞 waitpid(两次)。

waitpid 之后,parent 再次调用 clock_gettime 并调用 times

您现在有空:

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

有了它,你可以准确地知道执行 child (children) 需要多长时间,以及他们需要多少 CPU 时间(用户和内核)消耗这样做。