为什么在找到内存使用高峰时会得到不同的结果?

时间:2019-02-20 19:21:20

标签: linux memory-management

在Linux中,我正在使用/usr/bin/time -f %M工具(以时间为单位)来获取用于单个进程/程序的内存峰值。但是每次我运行此命令时,都会得到不同的结果。

  1. 这种差异的原因是什么?
  2. 如何获取进程消耗的最大内存的准确值?

p.s。我已经使用了其他方法,例如从内存中获取快照的方法(例如从/proc/pid中读取快照),但是由于我的程序结束得如此之快,所以我什至不希望采样率非常低。

1 个答案:

答案 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