2013-02-05 3 views
0

MongoDB를은 96기가바이트 루트 서버의 메모리 부족합니다.메모리 안전한 MongoDB를 작업

합니까 MongoDB를, 예를 들어를 "안전 모드"에서 쿼리 또는 작업을 실행할 수있는 옵션이 있습니다 기억을 너무 많이 자르지 않고? 매우 민감하여 충돌이 발생할 수 있습니다. 인덱싱되지 않은 타임 스탬프 필드에서 $ lte/$ gt를 사용하여 일부 검색 쿼리를 실행합니다.

+0

Linux를 사용하고 있습니까? – Adil

+0

예, 2.6.32-5-amd64, debian. – ledy

+0

님이 mongo와 호환되지 않습니까? dmesg | grep -i numa [0.000000] NUMA : 할당 된 memnodemap이 40000 - 58840 [0.000000] NUMA : 해시 이동에 20을 사용합니다. – ledy

답변

1

내가 그것을 통제 할 수없는,하지만해야 거기 해제해야한다 "안전"에 대한 MongoDB의의 구성 설정 RAM이 일단 한계를 넘으면? 어쩌면 다른 프로세스를 차단하거나 oom killer에 의해 중단되기 전에?

MongoDB를 자체 메모리 관리를 사용하지 않습니다. 대신 OS의 LRU를 사용합니다. OS는 그것이 당신의 작업 집합의 모든 당신이 대부분의 페이지 폴트를 교환되어, MongoDB를 같이 MongoDB를위한 예비있는 RAM의 양보다 더 큰되지 않습니다 일명 mongod에 할당 된 메모리의 양을 사용했기 때문에 그렇게 크게 문서를 페이징 귀하 데이터 (페이징에 대한 좋은 참조 : http://en.wikipedia.org/wiki/Paging).

는 그러나 더 나쁜 실행하기 때문에 난 강력하게 당신이 실제로 당신이 mongod를 실행하는 데 사용하는 mongo 사용자에 ulimit을 사용할 수 있습니다, 특히 리눅스에,이 경우 MongoDB를 제한 권하고 싶지 않다 : http://docs.mongodb.org/manual/administration/ulimit/

합니까를 MongoDB는 쿼리 나 작업을 "안전 모드"로 실행할 수있는 옵션을 가지고 있습니다. 기억을 너무 많이 자르지 않고?

아니요.

매우 민감하고 충돌이 발생할 수 있습니다 (예 : 인덱싱되지 않은 타임 스탬프 필드에서 $ lte/$ gt를 사용하여 일부 검색 쿼리를 실행합니다.

당연히이 MongoDB를위한 OOM 예외가 발생하지해야 어딘가에 메모리 누수를 나타낼 수 있습니다 : 당신이 MongoDB를 실행하는 시스템에 상주 메모리의 크기를 제한하는 경우 http://docs.mongodb.org/manual/administration/ulimit/

당신은 운영을 허용 위험 시스템을 사용하여 일반적인 상황에서 mongod 프로세스를 종료합니다. 이 값을 설정하지 마십시오. 운영 체제 (예 :리눅스)는 OOM 킬러와 함께 mongod를 죽이고 serverStatus의 출력을 검사하여 MongoDB가 메모리를 누출시키지 않도록합니다.

+0

나는 내 RAM이 적다는 것을 믿을 수 없다. 유일하게 사용하는 컬렉션은 50GB이고, 총 RAM은 96GB 미만입니다. 해시 필드에는 단 하나의 단일 색인 만 있습니다. 물론, "주문"을 받으려면 타임 스탬프에 대한 색인을 시험해 보는 것이 좋습니다. 그러나 이것은 일부 .find 쿼리가 수행 될 때 oom killer에 의해 현재 그리고 정기적으로 죽어 불안정한 이유가되어서는 안됩니다. .find와는 별도로 초당 약 20 개의 인서트가 있습니다. 내 의견으로는, 특히 색인이 거의없는 경우가 많지 않습니다. – ledy

+0

@ledy 여기에 또 다른 문제가있을 수는 없겠지만, 메모리 누수가 발생했을 수도 있습니다. 그에 대한 편집을 추가했습니다. – Sammaye

+0

ulimit은 잘되어야합니다 : ulimit -a http://nopaste.info/340ff18546. HTML과 serverStatus는 경고가 없습니다 : NumberInt (64), "상주": \t { "비트"는 mem (35877)를 NumberInt을 "가상"NumberInt (393373), "지원"사실, "매핑을 ": NumberInt (196545), "mappedWithJournal ": NumberInt (393090) } – ledy

0

매우 민감한 것으로 보인다 예를 들어, 추락 할 수있다 인덱싱되지 않은 타임 스탬프 필드에서 $ lte/$ gt를 사용하여 일부 검색 쿼리를 실행합니다.

mongod 인스턴스가 많은 페이지를 RAM으로 스왑하기 때문에 OOM 킬러가 그것을 죽입니다. RAM에 대해 대다수의 프로세스가있을 수 있습니다. 당신은 다음과 같이 mongod 데몬을 죽이지 리눅스를 지시 할 수 있습니다 :

sudo echo -17 > /proc/<process if of mongod>/oom_adj 

당신은 불행하게도, 메모리 MongoDB를 사용하는 양을 제어 할 수 없습니다. background indexing docs on mongodb을 살펴 보시기 바랍니다. 그리고 좀 더 유용한 링크 :

  1. See the related thread on stackoverflow
  2. How do i limit the cache size?
+0

나는 그것을 제어 할 수는 없지만 일단 mongodb 설정이 "안전"에 대한 한계를 깨뜨린 후에 RAM을 해제하도록해야합니까? 어쩌면 다른 프로세스를 차단하거나 oom killer에 의해 중단되기 전에? – ledy

+0

하나도 없다. mongodb는 OS의 가상 메모리 관리자를 사용하여 데이터 파일을 교환한다. 관련 링크를 통해 답변을 업데이트했습니다. – Adil