较大的内存分配会导致内核交换,即使有足够多的可用内存

巴斯蒂安·希夫塔勒(Bastian Schiffthaler)

我的情况是几乎一样的这个职位上serverfault。总结一下:

我有一个非常简单的C ++应用程序,该应用程序使用哈希映射来计数和合并大量大文件。std::unordered_map::reserve()在填充它并开始迭代之前,我会用with保留内存在使用大约60Gb的内存(系统有378Gb)时,该过程开始交换,并且哈希插入的速率降低为无。

该程序的准系统在这里

一些注意事项:

  • swapoff -a 完全解决了这个问题
  • swappiness设置为1
  • 更好的hashmap实现(例如martinus / robin-hood-hashing)不能解决问题。
  • 一切都编译为64位,gcc的唯一选项是 -std=c++11 -fopenmp -O3
  • 程序在此步骤使用1个线程
  • 服务器上的高I / O负载似乎使问题变得更糟

更多信息

file 可执行文件的输出:

../script/jelly_union: ELF 64-bit LSB shared object, x86-64, version 1 (GNU/Linux), dynamically linked, interpreter /lib64/l, for GNU/Linux 3.2.0, BuildID[sha1]=65917c99ec9480c1dfb859f10920fce15a8fefc1, not stripped

uname -a

Linux picea 4.15.0-66-generic #75-Ubuntu SMP Tue Oct 1 05:24:09 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux

CPU信息(最后一个核心):

processor       : 63
vendor_id       : AuthenticAMD
cpu family      : 21
model           : 1
model name      : AMD Opteron(tm) Processor 6282 SE
stepping        : 2
microcode       : 0x600063e
cpu MHz         : 1156.138
cache size      : 2048 KB
physical id     : 3
siblings        : 16
core id         : 7
cpu cores       : 8
apicid          : 143
initial apicid  : 111
fpu             : yes
fpu_exception   : yes
cpuid level     : 13
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl nonstop_tsc cpuid extd_apicid amd_dcm aperfmperf pni pclmulqdq monitor ssse3 cx16 sse4_1 sse4_2 popcnt aes xsave avx lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs xop skinit wdt lwp fma4 nodeid_msr topoext perfctr_core perfctr_nb cpb hw_pstate ssbd ibpb vmmcall arat npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flushbyasid decodeassists pausefilter pfthreshold
bugs            : fxsave_leak sysret_ss_attrs null_seg spectre_v1 spectre_v2 spec_store_bypass
bogomips        : 5187.19
TLB size        : 1536 4K pages
clflush size    : 64
cache_alignment : 64
address sizes   : 48 bits physical, 48 bits virtual
power management: ts ttp tm 100mhzsteps hwpstate cpb
蓬图斯

我不确定现代C ++的实现方式是什么,但是您可能想研究mlock(2)禁用对内存页面的交换。

我也对如果立即重新运行会发生什么感到好奇。我希望您使用的保留调用不会真正触及所有内存页面(因此不会强迫它们被实际分配)-如果是这种情况,一段时间后您开始看到的是系统在努力提供实际的内存。首先,您要的是内存,而不要交换内存(您应该能够通过查看驻留大小来证明这一点)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

即使有足够的内存,内存分配也会失败

来自分类Dev

增加可用内存给Spark

来自分类Dev

检查系统中的可用内存以获取新分配

来自分类Dev

仅当有足够的可用内存时,才进行向量push_back

来自分类Dev

尽管有足够的可用内存,但Postgres仍然出现内存不足错误

来自分类Dev

即使有足够的内存,Vxworks内存分配也会失败

来自分类Dev

字节的可用内存[]

来自分类Dev

内存不足异常,即使似乎有足够的可用内存

来自分类Dev

即使我有超过10GB的可用内存,使用C ++读取大型(〜1GB)数据文件有时也会抛出bad_alloc

来自分类Dev

如何估算JVM是否有足够的可用内存用于特定数据结构?

来自分类Dev

具有大量可用内存的永久交换

来自分类Dev

即使有足够的可用内存,为什么用户进程仍会由于内存碎片而调用Linux OOM杀手?

来自分类Dev

具有大量可用内存的永久交换

来自分类Dev

是什么导致Win8.1内存不足警告,尽管有足够的可用内存?

来自分类Dev

我有足够的可用内存时出现Windows 10内存不足警告

来自分类Dev

当有足够的可用内存时,Windows 7会警告内存不足的情况-我可以设置一个阈值吗?

来自分类Dev

堆栈溢出,尽管有足够的可用内存

来自分类Dev

一旦有可用内存,将交换内容移回RAM

来自分类Dev

检查系统中的可用内存以获取新分配

来自分类Dev

即使有可用内存,系统也无法分配内存

来自分类Dev

没有足够的“可用内存”。可能诱使Windows认为它具有更多功能?

来自分类Dev

尽管有足够的可用内存,但malloc()失败

来自分类Dev

shared_ptr的可用内存是否分配在堆上?

来自分类Dev

当我有千兆字节的可用内存时,顶部显示“ swout”(交换)。为什么?

来自分类Dev

无法在R中分配具有足够可用内存的向量

来自分类Dev

没有足够的内存分配?

来自分类Dev

在 linux 内核中分配可交换内存

来自分类Dev

当交换接近限制时 Ubuntu 20 冻结,但有可用内存

来自分类Dev

无法缩放 tkinter PhotoImage: _tkinter.TclError: 没有足够的可用内存用于图像缓冲区

Related 相关文章

  1. 1

    即使有足够的内存,内存分配也会失败

  2. 2

    增加可用内存给Spark

  3. 3

    检查系统中的可用内存以获取新分配

  4. 4

    仅当有足够的可用内存时,才进行向量push_back

  5. 5

    尽管有足够的可用内存,但Postgres仍然出现内存不足错误

  6. 6

    即使有足够的内存,Vxworks内存分配也会失败

  7. 7

    字节的可用内存[]

  8. 8

    内存不足异常,即使似乎有足够的可用内存

  9. 9

    即使我有超过10GB的可用内存,使用C ++读取大型(〜1GB)数据文件有时也会抛出bad_alloc

  10. 10

    如何估算JVM是否有足够的可用内存用于特定数据结构?

  11. 11

    具有大量可用内存的永久交换

  12. 12

    即使有足够的可用内存,为什么用户进程仍会由于内存碎片而调用Linux OOM杀手?

  13. 13

    具有大量可用内存的永久交换

  14. 14

    是什么导致Win8.1内存不足警告,尽管有足够的可用内存?

  15. 15

    我有足够的可用内存时出现Windows 10内存不足警告

  16. 16

    当有足够的可用内存时,Windows 7会警告内存不足的情况-我可以设置一个阈值吗?

  17. 17

    堆栈溢出,尽管有足够的可用内存

  18. 18

    一旦有可用内存,将交换内容移回RAM

  19. 19

    检查系统中的可用内存以获取新分配

  20. 20

    即使有可用内存,系统也无法分配内存

  21. 21

    没有足够的“可用内存”。可能诱使Windows认为它具有更多功能?

  22. 22

    尽管有足够的可用内存,但malloc()失败

  23. 23

    shared_ptr的可用内存是否分配在堆上?

  24. 24

    当我有千兆字节的可用内存时,顶部显示“ swout”(交换)。为什么?

  25. 25

    无法在R中分配具有足够可用内存的向量

  26. 26

    没有足够的内存分配?

  27. 27

    在 linux 内核中分配可交换内存

  28. 28

    当交换接近限制时 Ubuntu 20 冻结,但有可用内存

  29. 29

    无法缩放 tkinter PhotoImage: _tkinter.TclError: 没有足够的可用内存用于图像缓冲区

热门标签

归档