[英]Measure memory usage by running two executables at the same time
我编译了一个代码并运行了两个可执行文件: exec1
和exec 2
。 它们都具有相同的代码,但是它们具有不同的输入。 我正在使用Kubuntu
(非常新手)作为操作系统。
exec1
:一个数据库用于exec1
,另一个数据库用于exec2
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 &
运行两个在后台运行同一程序的进程。
您可能还对batch
, nohup
和top
感兴趣
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.