MongoDB의 CPU 사용률이 높은, 휴식하는 방법 (차례)

사용자는 종종 문의 : MongoDB의 CPU 사용률이 모두 전체 전력 질주 높은, 내가 어떻게해야합니까?

이 문제가 발생, 99.9999 %의 가능성이 높은 MongoDB의 CPU 사용률 문제를 해결하는 방법에의 적용 점에서이 논문에서는 "비이성적으로 인한 사용자의".

1 단계 : 요청 데이터베이스 분석이 수행되고있다

사용자가 다음 명령의 출력의 일례이며, 데이터베이스 조작은 실행되는 것을 볼 수 있고, 몽고 셸을 연결 db.currentOp () 명령을 수행 할 수 동작이 로고에서 수행된다. 여러 분야에 초점 :

  • 클라이언트 : 클라이언트에 의해 시작됩니다 요청?
  • OPID : OPID 동작, 필요한 경우, 수 db.killOp 직접 명에 의해 조작 (OPID);
  • secs_running / microsecs_running :이 값 초점, 시간이 값이 특히 큰 경우, 당신이 요청이 합리적입니다 있는지 확인하기 위해주의해야 할 요청을 대신 실행;
  • 쿼리 / NS :이은 어떤 컬렉션에 무엇을하는지 볼 수 있습니다;
  • * 잠금 : 잠금 및 일부 관련 매개 변수를 사용하면 문서,하지에 대한 자세한 설명이 될 수 알아야 할 네트워크 말해.
{ 
        "내림차순": "conn632530", 
        "threadId": "140298196924160", 
        "connectionId": 632530, 
        "클라이언트" "11.192.159.236:57052", 
        "활성": 사실, 
        "OPID": 1008837885, 
        "secs_running" 0, 
        "microsecs_running"NumberLong으로 (70), 
        "OP": "업데이트", 
        "NS": "mygame.players", 
        "쿼리"{ 
            "UID"NumberLong으로 (31,577,677) 
        }, 
        "numYields"0 , 
        "잠금": { 
            "글로벌 ":"w ", 
            "데이터베이스 ":"w ", 
            "컬렉션 ":" "w 
        } 
        .... 
}

여기에 () 작업이 결국 목적은 무엇이며, db.currentOp에 의해 수행되는 것을 볼 수, 그것에 대해 명확하게?

우리는 작업이 나열되어 수행하고 killOp 하나 하나를 죽일하고 싶은 말을하지,이 단계의 목적이 있는지에 "예상치 못한"시간이 많이 걸리는 요청이 수행되고 보는 것입니다.

예를 들어, 당신의 사업은 일반적으로 높은 CPU 사용률, 전체 테이블을 스캔하는 데 필요한 작업들을 수행하기 위해 데이터베이스에 연결 운영 및 유지 보수 관리 직원이, 갑자기 귀하의 비즈니스에 매우 느린 응답의 결과, 높은 CPU 사용률 급증하지, 우리는 다음에 집중해야 그 실행 시간이 매우 긴 작업입니다.

범죄자가 발견되면, 해당 요청은 OPID db.killOp (OPID)는 해당 요청을 없애 실행 얻는다.

당신이이 온라인으로 사용하는 경우 CPU 사용률이 높고,보다 심층적 인 분석 2 단계로 들어갈 수있다, 또한 어떤 특별한 요청을 찾을 수 없습니다 db.currentOp 결과에 의해 계속되고있다.

2 단계 : 분석 데이터베이스 느린 요청

지원 기능을 프로파일 링하여 MongoDB는에서 설정 한 것과 같은 DB의 system.profile에 요청 된 레코드의 구현은 프로파일 링은 세 가지 모드가 있습니다 :

  • 닫기 프로파일;
  • 모든 요청에 ​​대해 열기 프로파일은 모든 요청이 세트 system.profile하는 기록을 수행;
  • 느린 요청에 대한 프로파일 링, 요청이 설정 특정 임계 값이 system.profile 기록 초과합니다.

기본 요청으로 MongoDB를이 프로파일 링 기능을 직접 기본값이 100ms를 사용, 느린 요청 임계 값은 불확실성 등의 요구에 따라 사용자 정의 할 수있는 생산 환경을 설정하는 것이 좋습니다, 전원이 꺼집니다.

operationProfiling : 
  모드 : slowOp 
  slowOpThresholdMs : 100

위의 구성 기록을 바탕으로, 요청이 DB의 해당 세트 system.profile하여 MongoDB에이 100ms 이상 될 것 덮인 수집 1메가바이트 system.profile 기본은 대부분의 공간을 차지합니다.

최근 세 느린 요청을 참조, {natrual $ : -1} 역 삽입에 의한 서수 대표

db.system.profile.find () 종류 ({natrual $ : -1}).. 제한 (3)

아래 열린 느린 요청 프로파일의 경우 (MongoDB를 클라우드 데이터베이스가 느린 요청의 기본 프로파일 링으로 사용 가능), 우리는 일반적인 포함하여 가능한 최적화 지점을 식별하기 위해 요구 분석을 늦출 만족했다.

CPU의 킬러 1 : 전체 테이블 스캔

전체 콜렉션 (표) 쿼리 (또는 업데이트, 삭제) 요청이 전체 테이블 스캔을 필요로 할 때, COLLSCAN를 스캔 매우 시간이 CPU 리소스를 사용하므로 파일이나 system.profile의 발견 설정 COLLSCAN 키워드를 로그인 할 때, 당신은에 있습니다 확인, 이러한 요청이 더 자주, 그것은 쿼리에 대한 색인 필드를 최적화하기 위해 최선의 경우는주의, 이러한 쿼리가 CPU 자원을 먹을 가능성이 높습니다.

쿼리는 문서의 번호를 검색, 당신은 요청 CPU 오버 헤드가 큰 값이 클수록, docsExamined의 system.profile의 값을 볼 수 있습니다.

> 키워드 : COLLSCAN, docsExamined

CPU 킬러 2 : 비이성적 색인

때때로, 쿼리 요청이 인덱스를 이동하는 경우에도, 구현은 합리적인 합리적인하지의 설립 (또는 너무도 요청 최적화를 많이 지출되지 않습니다 인덱스를 복용 자체가 많은 경기의 결과입니다) 보통 있기 때문에, 매우 느립니다.

아래와 같이 필드의 Y 값이 매우 풍부하지만, 데이터 세트를 가정하여, 그 값은 (1,2 만 가정)의 작은 필드 X.

X {1, 1} 
{X : 1, 2} 
{X : 1, 3} 
...... 
{X : 1이며, : 100000} 
{X : 2, 1 } 
{X : 2, 2} 
{X : 2, 3} 
...... 
{X : 1이며, : 100000}

{X : 1을 : 예 : 2} 역할을하려면 이러한 쿼리

db.createIndex (X {1}) 비효율적 같은 X의 값이 너무 때문에, 
db.createIndex ({:. X 1, Y}. 1) 효과가 있기 때문에 동일한 x 값이 너무, 
DB. createIndex는 ({Y : 1}) 효과 때문에 같은 Y 값 이하 좋다; 
db.createIndex (Y :. {1, X}. 1) 양호한 결과, 이하 동일하기 때문에 Y 값;

및 {1}로서 {Y, Y 1, X : 1} 차이 참조 인덱스 MongoDB의 원리 및 그 지수 공식 문서 자체가 이해되지.

쿼리의 인덱스를 촬영, 인덱스를 스캔 얼마나 많은, 당신은 더 커 keysExamined 필드의 값, 더 큰 CPU 오버 헤드를 system.profile을 볼 수 있습니다.

> 키워드 : IXSCAN, keysExamined

CPU의 킬러 3 : 많은 양의 데이터를 정렬

쿼리 요청이 종류가 포함되어있는 경우, 정렬은, MongoDB를가 메모리 리 결과 순위, 매우 CPU 자원을 소비하는 그 자체로이 작업을 정렬 만족하는 색인을 통해 수행 될 수없는 경우, 최적화 방법은 아직 인덱싱, 종종 정렬 할 필요가 필드 색인.

당신이 수집 system.profile 또는 파일이 SORT 키워드를 발견 로그인하면 색인을 통해 일종의 최적화하기 위해 고려할 수 있습니다. 요청이 상을 정렬 포함하는 경우, hasSortStage 필드에 system.profile 사실 일 것입니다.

> 키워드 : SORT, hasSortStage

색인의 조합은 전체 테이블 스캔이 필요하지만, 또한 vaggeregation 탐색, 쿼리, 갱신, 정렬 및 기타 작업, 인덱싱, aggregationv 및 기타 작업도 매우 CPU 리소스를 사용하지만, 이러한 여러 장면의 성격에있을 수있는 다른 사람이있다.

3 단계 : 서비스 용량 평가

이 두 단계 후에는 전체 데이터베이스를 검색하는 것은 매우 합리적인 것을 발견, 모든 요청은 인덱스 최적화를위한 기본적 여지가 없어 효율적으로하는, 당신이 구성을 업그레이드해야합니다, 당신의 기계가 서비스 용량의 상한에 도달 한 것 같다 (또는 확장 샤딩 의해).

물론, 상황의 가장, MongoDB를 테스트로 진행 시간이 적시에 확장을 위해 상한에 해당하는 서비스 용량이 아니라 전체 자원을 가진 CPU보다는, 업그레이드, 장면에 알고, 사업은에 가기 전에 거의 완료가 평가를 수행.

 

출처 : HTTPS : //www.ywnds.com/ P = 9010?

출처 : Zhangyou 동아의 블로그


추천

출처www.cnblogs.com/zping/p/11230544.html