대용량 메모리 할당으로 인해 사용 가능한 메모리가 충분한 경우에도 커널 스와핑이 발생할 수 있습니다.

대용량 메모리 할당으로 인해 사용 가능한 메모리가 충분한 경우에도 커널 스와핑이 발생할 수 있습니다.

내 상황은 거의 똑같다.이것서버 장애에 게시되었습니다. 결론적으로:

해시 맵을 사용하여 많은 수의 대용량 파일을 계산하고 병합하는 매우 간단한 C++ 응용 프로그램이 있습니다. std::unordered_map::reserve()메모리를 채우고 반복을 시작하기 전에 메모리를 예약하기 위해 with를 사용합니다 . 약 60Gb의 메모리가 사용되면(시스템에는 378Gb가 있음) 프로세스가 스와핑을 시작하고 해시 삽입 속도가 0으로 떨어집니다.

프로그램의 기본 요점은여기.

몇 가지 참고사항:

  • swapoff -a문제를 완전히 해결하세요.
  • 교환성은 1로 설정됨
  • 더 나은 해시맵 구현(예:마티누스/로빈후드 해시) 문제가 해결되지 않습니다.
  • 모든 것이 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

답변1

최신 C++ 접근 방식이 무엇인지 잘 모르겠지만 mlock(2)메모리 페이지 스와핑을 비활성화하는 방법을 살펴보는 것이 좋습니다.

즉시 다시 실행하면 어떻게 될지 조금 궁금합니다. 나는 당신이 사용하고 있는 예약 호출이 실제로 모든 메모리 페이지를 건드리지 않기를 바라고 있습니다(따라서 실제로 할당되도록 강요하지도 않습니다). 그렇다면 잠시 후에 보게 될 내용은 다음과 같습니다. 시스템은 메모리를 교체하는 대신 애초에 메모리를 요청한 것을 실제로 제공하기 위해 고군분투하고 있습니다(상주 크기를 확인하여 이를 반박할 수 있어야 합니다).

관련 정보