page-fault - 我的程序产生了许多页面错误。当输入数据大小增加 1 时,缺页次数减少到 1/10。什么可能导致这种情况?
问题描述
我编写了一个程序来测试排序合并性能。该程序只是从两个相同大小的数组中读取条目,对条目的键进行排序合并,然后将结果写入一个新数组。每个条目占用 140 个字节。第一个数组的键为偶数 0,2,4,6 ....,第二个数组的键为奇数 1,3,5,7... 所以合并后的数组包含来自输入的所有条目.
我使用谷歌基准来收集数据。
当我将输入数组大小设置为 32410 时,该过程需要 14429772 ns。当我将输入数组大小增加 1 至 32411 时,总运行时间减少一半至 6862094 ns。该观察可以稳定地再现。
我试图找出原因,并perf stat
给出以下结果。我看到输入较小的那个会产生 10 倍以上的页面错误,并且在 sys cpu 时间上花费了一半时间。我认为页面错误是使输入较小的程序变慢的根本原因。但我不明白为什么。
CPU 是 Intel(R) Xeon(R) Gold 6126 CPU @ 2.60GHz,操作系统是 Ubuntu 20.04。
谁能提供一些提示?谢谢!
对于 32410 的输入大小
Performance counter stats for './vert_block_merge_benchmark':
916.54 msec task-clock # 0.981 CPUs utilized
2 context-switches # 0.002 K/sec
0 cpu-migrations # 0.000 K/sec
275135 page-faults # 0.300 M/sec
^^^^^^^^^^^^^^^^^^^^^^^
3293532138 cycles # 3.593 GHz
4520763031 instructions # 1.37 insn per cycle
1019018940 branches # 1111.815 M/sec
2147399 branch-misses # 0.21% of all branches
0.934126606 seconds time elapsed
0.494751000 seconds user
0.422348000 seconds sys
^^^^^^^^^^^^^^
对于 32411 的输入大小
Performance counter stats for './vert_block_merge_benchmark':
835.87 msec task-clock # 0.980 CPUs utilized
2 context-switches # 0.002 K/sec
0 cpu-migrations # 0.000 K/sec
21868 page-faults # 0.026 M/sec
^^^^^^^^^^^^^^^^^
2983972313 cycles # 3.570 GHz
6322080505 instructions # 2.12 insn per cycle
1508755500 branches # 1805.002 M/sec
2364763 branch-misses # 0.16% of all branches
0.853299790 seconds time elapsed
0.792227000 seconds user
0.044236000 seconds sys
^^^^^^^^^^^^^^^^^^^^
解决方案
推荐阅读
- macos - 如何在 MacOS 终端中使用大于 10 的基数指定范围
- swift - 了解权利和既定课程配置
- c++ - 如何在 MFC 中更改按钮大小
- sql - 在元数据库仪表板中按日期过滤不
- asp.net-core - 我们如何将 identityserver4 和 web api 集成到同一个项目(端口)中,而不是为每个项目创建不同的项目?
- r - 删除 plotly 中的某些配置选项
- php - 如何使用正则表达式在字符串中准确查找单词或字符串?
- .net - Asp.Net Core 2.2 Docker HTTPS 问题
- php - Laravel OR 验证 URL 或 IP
- python - 从 kworb.net 抓取数据时,if 条件不在 for 循环中执行