우리는 세 대의 머신에서 mongodb 복제본 세트를 실행하고 있습니다. 세 시스템 모두 약 16GB이지만 스왑은 255MB에 불과합니다. Swappiness는 기본값 60으로 유지됩니다. 머신은 CentOS 6.4를 실행하고 있습니다. 데이터베이스는 16GB보다 훨씬 크지만 우리에게는 괜찮습니다. 실제 작업 세트는 훨씬 더 작습니다.
우리가 직면한 문제는 기본 소비가 사용 가능한 모든 메모리를 소모하고 OOM-Killed가 발생한다는 것입니다. 나는 이것이 mongodb가 메모리를 관리하는 방식이라는 것을 알고 있습니다.
서버가 OOM을 종료한 후 누군가 수동으로 서버를 다시 시작해야 합니다.
mongodb가 OOM이 종료되는 것을 방지할 수 있는 방법이 있습니까? 교환성을 조정하시겠습니까? 스왑 공간을 늘리시겠습니까? 나는 그러한 설정이 mongod가 죽기 전에 유예 기간을 늘릴 뿐이라고 생각합니다.
답변1
OOM 킬러는 방법이 아닙니다누구나메모리를 관리합니다. 시스템 잠금을 피하기 위한 마지막 희망으로 치명적인 오류를 처리하는 것은 Linux 커널 방식입니다!
당신이 해야 할 일은:
스왑이 충분한지 확인하세요. 확실하다면 더 추가하세요.
자원 제한을 구현하십시오! 최소한 응용 프로그램에 대해서는 메모리를 사용할 것으로 예상합니다(예상하지 않는 경우에는 더욱 그렇습니다. 이러한 응용 프로그램은 일반적으로 문제가 됩니다). 셸에서 ulimit -v(또는 주소 공간 제한) 명령을 확인하고 init 스크립트에서 애플리케이션 시작 전에 이를 입력하세요. 또한 다른 항목(예: 프로세스 수 -u 등)도 제한해야 합니다. 이렇게 하면 커널이 존재하지 않는 메모리를 제공하고 나중에 주변의 모든 것을 죽이는 대신 메모리가 충분하지 않을 때 응용 프로그램에 ENOMEM 오류가 발생합니다. !
커널에 메모리를 오버커밋하지 말라고 지시합니다. 당신은 할 수 있습니다 :
에코 "0" > /proc/sys/vm/overcommit_memory
또는 더 나은 (스왑 공간의 양에 따라)
에코 "2" > /proc/sys/vm/overcommit_memory; 에코 "80" > /proc/sys/vm/overcommit_ratio
보다오버커밋 끄기이에 대한 자세한 내용은
이는 커널이 실제로 가지고 있지 않은 메모리를 응용 프로그램에 제공할 때 더 조심하도록 지시할 것입니다(세계의 글로벌 경제 위기와 유사점이 놀랍습니다).
최후의 수단으로 MangoDB를 제외한 시스템의 모든 것이 소모성인 경우(그러나 먼저 위의 두 가지 사항을 수정하십시오!)살해당할 확률(또는 종료되지 않도록 할 수도 있습니다 - 대안이 아무것도 작동하지 않는 시스템 중단인 경우에도) /proc/$pid/oom_score_adj 및/또는 /proc/$pid/oom_score를 조정합니다.
echo "-1000" > /proc/`pidof mangod`/oom_score_adj
보다OOM 킬러 길들이기해당 주제에 대한 자세한 내용은