为什么我会找到不同的结果来查找内存使用量的峰值?

问题描述 投票:1回答:1

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

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

附:我已经使用过其他方法,比如从内存中获取快照的方法(比如从/proc/pid读取),但由于我的程序结束得太快,我不想要任何甚至非常小的采样率。

linux memory-management
1个回答
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
© www.soinside.com 2019 - 2024. All rights reserved.