为什么我没有看到预期的页面错误?

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

我正在尝试探索Linux的页面错误行为。我做了一个lxc容器,将内存限制为1GB(通过在/etc/lxc/default.conf中添加“ lxc.cgroup.memory.limit_in_bytes = 1G”)。然后,我运行了一个简单的代码,可以访问2GB的数据。

int main() {
  char* buf = malloc(1024*1024*1024);
  char* buf2 = malloc(1024*1024*1024);
  if (buf == 0 || buf2 == 0) {
    printf("Malloc failed!\n");
    return 0;
  }
  int i,j,k;
  for (i=0; i<1024; i++)
    for (j=0; j<1024; j++)
      for (k=0; k<1024; k++)
        buf[i*1024*1024 + j*1024 + k] = i+j+k;
  for (i=0; i<1024; i++)
    for (j=0; j<1024; j++)
      for (k=0; k<1024; k++)
        buf2[i*1024*1024 + j*1024 + k] = i+j+k;
  free(buf);
  free(buf2);
  while(1);
  return 0;
}

该代码使用-O0编译,并在容器内运行。当程序到达while(1);时,我用

检查它遇到了多少页错误。
ps -eo maj_flt,cmd | grep a.out

其中a.out是已编译的可执行文件。有时会出现200〜300页错误;但是,有时我只会看到10到20页错误。因为内存只有1G,所以我认为至少应该总是发生1G / 4K = 256K页面错误。为什么有时我只看到10〜20页错误?我确认我的Linux默认使用4K页面。

我是Linux新手。任何见解将非常有帮助!谢谢。

linux paging lxc
1个回答
0
投票

我想出了问题。

  1. 我的代码的主要问题是,第一次写入malloc的页面时,不会发生页面错误,因为Linux不必从磁盘读取空页面。我更改了代码,以使其两次运行代码的循环部分。
  2. 此外,我禁用了Linux预读功能(通过回显“ 0” >> / proc / sys / vm / page-cluster)

通过这两个更改,我能够大致看到2G / 4K = 524,288页错误(精确到524,304)。

© www.soinside.com 2019 - 2024. All rights reserved.