【问题标题】:Why am I not seeing as many page fault as I expect?为什么我没有看到预期的页面错误?
【发布时间】:2019-09-26 19:39:51
【问题描述】:

我正在尝试探索 Linux 的页面错误行为。 我制作了一个 lxc 容器,将内存限制为 1GB (通过将 'lxc.cgroup.memory.limit_in_bytes = 1G' 添加到 /etc/lxc/default.conf)。 然后,我运行了一个访问 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 内部专家,但我认为操作系统可能足够聪明,可以重新映射多个页面以响应单个页面错误。如果您进行随机访问,它会如何变化?顺便说一句,当您将值 3069 分配给 char 时会发生什么?
  • 我尝试随机访问。现在我得到了更多的错误(~2K),但远少于我认为应该发生的 256K。

标签: linux paging lxc


【解决方案1】:

我发现了问题。

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

通过这两项更改,我可以看到大约 2G / 4K = 524,288 个页面错误 (正好是 524,304)。

【讨论】:

    猜你喜欢
    • 2020-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多