我的情况是几乎一样的这个职位上serverfault。总结一下:
我有一个非常简单的C ++应用程序,该应用程序使用哈希映射来计数和合并大量大文件。std::unordered_map::reserve()
在填充它并开始迭代之前,我会用with保留内存。在使用大约60Gb的内存(系统有378Gb)时,该过程开始交换,并且哈希插入的速率降低为无。
该程序的准系统在这里。
一些注意事项:
swapoff -a
完全解决了这个问题-std=c++11 -fopenmp -O3
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] 删除。
我来说两句