在Linux中,我正在使用/usr/bin/time -f %M
工具(以时间为单位)来获取用于单个进程/程序的内存峰值。但是每次我运行此命令时,都会得到不同的结果。
p.s。我已经使用了其他方法,例如从内存中获取快照的方法(例如从/proc/pid
中读取快照),但是由于我的程序结束得如此之快,所以我什至不希望采样率非常低。
答案 0 :(得分:1)
任何不确定的过程显然都可能导致每次使用不同的内存。例如,即使您执行相同的操作,也将永远无法运行大型程序(如Gimp或Chrome)并获得两次相同的编号。
但是,如果您看到一个简单的,高度确定性的过程的内存使用情况发生了变化,则可能已打开了“地址空间布局随机化”。
下面是一个示例foo.c
:
int main() {
return 0;
}
您会看到它每次都有不同的内存使用量:
$ gcc foo.c -o foo
$ /usr/bin/time -f +%M ./foo
+1144
$ /usr/bin/time -f +%M ./foo
+1048
$ /usr/bin/time -f +%M ./foo
+1060
这是因为ASLR已完全启用:
$ cat /proc/sys/kernel/randomize_va_space
2
如果您将其关闭:
$ sudo tee /proc/sys/kernel/randomize_va_space <<< 0
0
您将获得相同的值:
$ /usr/bin/time -f +%M ./foo
+1144
$ /usr/bin/time -f +%M ./foo
+1144
$ /usr/bin/time -f +%M ./foo
+1144
但是为了增强安全性,请不要忘记将其重新打开:
sudo tee /proc/sys/kernel/randomize_va_space <<< 2