首页 > 解决方案 > 我的程序产生了许多页面错误。当输入数据大小增加 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
       ^^^^^^^^^^^^^^^^^^^^

标签: page-fault

解决方案


推荐阅读