内存分配太慢

时间:2019-03-27 05:15:49

标签: memory amazon-ec2 linux-kernel huge-pages

我正在AWS(1.0.0-beta3-71025m4.15xlarge实例)上运行一些内存密集型服务,并且注意到在某些情况下(通常在特定内存限制之后),分配更多内存所花费的时间增加了(最多50倍)。

发生这种情况时,m5.12xlarge在内核模式(红色)下显示100%,htop如下所示:

perf top

在正常操作期间,它看起来像这样:

  62.82%  [kernel]                                           [k] pageblock_pfn_to_page                                                              
  15.21%  [kernel]                                           [k] clear_page_c_e                                                                     
   5.78%  [kernel]                                           [k] get_pfnblock_flags_mask                                                            
   3.06%  [kernel]                                           [k] compaction_alloc                                                                   
   1.59%  [kernel]                                           [k] clear_huge_page                                                                    
   1.49%  [kernel]                                           [k] _raw_spin_lock                                                                     
   1.41%  [kernel]                                           [k] async_page_fault                                                                   
   1.29%  a.out                                              [.] memTest                                                                            
   0.99%  [kernel]                                           [k] get_page_from_freelist                                                             
   0.85%  [kernel]                                           [k] compact_zone                                                                       
   0.69%  [kernel]                                           [k] try_charge                                                                         
   0.51%  [kernel]                                           [k] error_entry                                                                        
...

我不完全理解是什么触发了该行为。有时候很难复制,但有时它一直在发生。

我有一个假设,认为这与AWS虚拟化有关(因此,该问题是间歇性的,我认为这是“邻居”上发生的事情)(请参阅更新)。我也无法在 66.29% [kernel] [k] clear_page_c_e 7.05% [kernel] [k] clear_huge_page 3.91% a.out [.] memTest 3.66% [kernel] [k] _raw_spin_lock 3.12% [kernel] [k] async_page_fault 2.68% [kernel] [k] get_page_from_freelist 1.93% [kernel] [k] _cond_resched 1.49% [kernel] [k] try_charge 1.12% [kernel] [k] error_entry 1.01% [kernel] [k] retint_user 0.93% [kernel] [k] handle_mm_fault 0.77% [kernel] [k] mem_cgroup_try_charge 0.67% [kernel] [k] pmd_pfn 0.66% [kernel] [k] __rmqueue.isra.80 ... 机器上重现该问题。

我能够使用一个简单的C程序在循环中分配和初始化内存来重现该问题:

m5.metal
void memTest(long chunk, long total) {
    struct timeval prev, cur = {0,0}, lastProgress = {0,0};
    int i, j;
    int num = total / chunk;
    int p, progress = -1;
    uint8_t *data[num];

    get_now(&prev);

    for (i = 0; i < num; i++) {
        data[i] = malloc(chunk);
        for (j = 0; j < chunk; j += 4096) {
            data[i][j] = rand()%265;
        }

        get_now(&cur);
        add(delta(&prev, &cur));
        prev = cur;

        p = (i * 20) / num * 5;

        if (p != progress) {
            if (lastProgress.tv_sec == 0) {
                printf("%s: %02d%%\n", format(&cur), p);
            } else {
                double elapsed = delta(&lastProgress, &cur);
                printf("%s: %02d%% (%gms)\n", format(&cur), p, elapsed);
            }
            lastProgress = cur;
            progress = p;
        }
    }
}

这一次我只能使问题接近内存限制,但即使在20Gb(可用186Gb)中也可以解决。

如果有人能对正在发生的事情以及如何消除这种影响有所了解,我将不胜感激。

更新

我已经对该问题进行了更多处理,目前归咎于m5.12xlarge$ ./a.out --total 182714368000 --chunk 16777216 2019-03-27 05:03:22.805827: 00% 2019-03-27 05:03:25.035575: 05% (2229.75ms) 2019-03-27 05:03:27.244955: 10% (2209.38ms) 2019-03-27 05:03:29.458160: 15% (2213.2ms) 2019-03-27 05:03:31.665313: 20% (2207.15ms) 2019-03-27 05:03:33.871949: 25% (2206.64ms) 2019-03-27 05:03:36.075955: 30% (2204.01ms) 2019-03-27 05:03:38.284512: 35% (2208.56ms) 2019-03-27 05:03:40.489039: 40% (2204.53ms) 2019-03-27 05:03:42.697444: 45% (2208.41ms) 2019-03-27 05:03:44.902268: 50% (2204.82ms) 2019-03-27 05:03:47.110703: 55% (2208.43ms) 2019-03-27 05:03:49.315001: 60% (2204.3ms) 2019-03-27 05:03:51.523370: 65% (2208.37ms) 2019-03-27 05:03:53.728535: 70% (2205.16ms) 2019-03-27 05:03:55.936081: 75% (2207.55ms) 2019-03-27 05:03:58.141149: 80% (2205.07ms) 2019-03-27 05:04:00.349740: 85% (2208.59ms) 2019-03-27 05:04:02.553894: 90% (2204.15ms) 2019-03-27 05:04:04.762675: 95% (2208.78ms) 2019-03-27 05:04:41.470692: 100% (36708ms) . <--- 上启用(always)和{{1}上禁用(m5.12xlarge)的透明页支持(THP) {1}}。在计算机上切换设置后,我能够在madvise上解决问题,而在m5.metal上解决了问题。

1 个答案:

答案 0 :(得分:2)

更新部分中所建议,此问题似乎是由透明大页面(THP)支持引起的。 MongoDB和其他一些linklink已经发现有问题,建议将其禁用。

关于如何在stackoverflow和stackexchange上禁用THP,存在许多问题。例如: