为什么我没有看到预期的页面错误?
Why am I not seeing as many page fault as I expect?
我正在尝试探索 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 的新手。任何见解都会非常有帮助!谢谢。
我找到问题了
- 我的代码的一个主要问题是,在第一次写入 malloc 页面时,不会发生页面错误,因为 Linux 不必从磁盘读取空页面。我更改了代码,使其运行代码的循环部分两次。
- 此外,我禁用了 Linux 预读(通过 echo "0" >> /proc/sys/vm/page-cluster)
通过这两个更改,我大约可以看到 2G / 4K = 524,288 个页面错误
(正好是 524,304)。
我正在尝试探索 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 的新手。任何见解都会非常有帮助!谢谢。
我找到问题了
- 我的代码的一个主要问题是,在第一次写入 malloc 页面时,不会发生页面错误,因为 Linux 不必从磁盘读取空页面。我更改了代码,使其运行代码的循环部分两次。
- 此外,我禁用了 Linux 预读(通过 echo "0" >> /proc/sys/vm/page-cluster)
通过这两个更改,我大约可以看到 2G / 4K = 524,288 个页面错误 (正好是 524,304)。