2013-10-09 3 views
2

mongod을 통해 Mongo를 시작한 후 초가 걸린 Mongo 쿼리를 실행했습니다. 내 "admin"db에 db.serverStatus()을 호출하면 Mongo가 resident 메모리가 1GB임을 나타냅니다. 문서에서는 "상주"메모리가 Mongo가 사용하는 실제 디스크/RAM의 양이라는 것을 설명합니다.Mongo 서버 상태 - "상주"메모리

그런 다음 동일한 쿼리를 다시 실행했지만 초가 걸렸습니다. 이번에 resident 메모리를 살펴보면 5GB를 보았습니다.

RAM이 크게 증가한 이유는 쿼리 시간이 300 초에서 8 초로 줄어든 이유를 설명하는 데 도움이되지만 거주 메모리가 왜 그렇게 빠르게 뛰어 났을까요?

300 초 검색어를 피하기 위해 Mongo를 준비하는 데 필요한 "예열"단계가 있습니까?

답변

4

MongoDB가 운영 체제의 mmap 기능을 사용한다는 이유가 있습니다. 이것은 적어도 Linux 시스템에서는 mongodb의 메모리 처리가 메모리 매핑 파일이라고하는 운영 체제의 일부 기능을 기반으로한다는 것을 의미합니다. 리눅스 시스템의 메모리는 여러 수준에서 다루어집니다. 기본적으로 모든 프로그램은 64 비트 시스템 128TB에서 2GB 이상의 32 비트 시스템에서 주소 공간을 볼 수 있습니다. 이것은 가상 주소 공간으로 32/64 비트에서 4KB 메모리 페이지 (페이지는 개별적으로 처리되는 메모리 부분)로 주소 지정이 가능합니다. 따라서 32 비트 시스템에서 mongoDB를 시작하면 해당 시스템의 데이터베이스가 2GB의 데이터 만 처리 할 수 ​​있다는 경고가 표시됩니다. 분명히이 가상 주소 공간은 실제 메모리 크기보다 크기 때문에 이러한 가상 주소와 실제 주소 간의 매핑이 있습니다. 가상 주소 중 일부는 실제로 실제 메모리에 있으므로 실제 메모리에 있지만 커널의 측면에있는 알고리즘을 보장합니다. Linux 시스템에서 실행되는 프로그램은 가상 주소 만 처리 할 수 ​​있습니다. 물리적 메모리에없는 가상 메모리 주소에 액세스하려고하면 pagefault가 발생합니다 (serverStatus 명령의 추가 정보 필드에서이를 추적 할 수 있음). (here에 대한 간략한 설명을 참조하십시오.)

실제 주소가 실제 메모리에있는 경우 가상 주소가 메모리와 마찬가지로 빠르며 실제 주소가없는 가상 주소는 디스크에서 메모리로 페이징된다는 것을 의미합니다. 랜덤하게 읽혀지는 디스크만큼 빨리 메모리를 읽으십시오.

mongoDB에서 컬렉션 또는 인덱스 캐싱을 시행 할 수있는 명령이 있습니다.이 명령은 touch 입니다.이 명령을 사용하여 이전에 메모리에 데이터를로드 한 경우 첫 번째 쿼리에서 8 초 만에 결과를 얻을 수 있습니다. 불행히도 OS가 메모리에 항상 이것을 유지하도록 강요 할 수는 없으므로, 다른 것들을 사용한다면 메모리 OS는이 데이터를 얼마 동안 페이지 아웃합니다.

실제 메모리가 충분하다면 mongoDB는 모든 데이터와 색인을 메모리에 보관합니다. 항상 필요한 것은 아닙니다. 방대한 양의 pagefaults를 피하기 위해 메모리에 있어야하는 데이터의 부분이 있습니다. 이것은 workingset입니다. db.runCommand({ serverStatus: 1, workingSet: 1 }) 명령을 사용하여 작업 세트의 크기를 확인할 수 있습니다.

OS 레벨 인 동안은 페이징을 처리 할 수 ​​없지만, 충분한 메모리가있는 경우 커널은 가능한 한 많은 정보를 캐시에 저장하는 것을 좋아합니다. 작업 세트가 메모리에 맞는다면 당신은 더 많거나 적을 것입니다. 일부 문서가 실제로 거의 액세스되지 않고 거기에 모든 것을 보관할만큼 메모리가 충분하지 않은 경우 어쨌든 페이징됩니다.

쿼리를 실행하면 여러 가지 일이 발생할 수 있습니다.인덱스가 커버 할 수있는 것은 어떤 문서도 전혀 터치되지 않는다는 것을 의미합니다. 쿼리가 일부 개념에서 선택적인 경우 인덱스의 일부만 만질 것입니다. 불행히도 메모리를 정의하는 것은 정말로 어렵습니다. 당신이 할 수있는 유일한 일은 모니터하는 것입니다 (워크 세트 메트릭은 추정치입니다). 메모리 부족으로 인한 증상을 확인하려면 presentation을 확인하십시오. 그리고 MMS을 사용하십시오.

+0

도움이되는 답변 주셔서 감사합니다. 그래서, 메모리에만 충분한 인덱스를 커버하는 RAM이 있다면, 발견 된 문서에서 인덱싱되지 않은 필드를 가져올 때 페이지 폴트가 여전히 발생할 수 있습니까? –

+0

문제는 여러 수준이 있습니다. 곧바로 내 대답을 업데이트하는 작업 세트 크기를 확인할 수 있습니다. – attish

+0

workingset 관련 부분을 업데이트했습니다. 나는 너를 도울 수있어서 기뻐. – attish