본문 바로가기

Database

MongoDB의 CPU 사용량이 너무 높을 때?? : db.currentOp()를 통해 슬로우 쿼리 식별하기

 

MongoDB에서 CPU 사용량이 높아지는 원인은 다양하지만 주요 원인은 최적화되지 않은 query에서 발생합니다.

 

최적화되지 않은 query를 slowquery라고 부르며 db.currentOp() 명령어를 사용하여 느린 쿼리를 식별 할 수 있습니다.

 

 

1. mongodb에 접속합니다.

 

$ mongo

MongoDB shell version v3.4.18

conecting to: mongodb://localhost:30001/test

MongoDB server version: 3.4.18

 

2. db.currentOp()명령을 실행합니다

 

db.currentOp()는 데이터베이스 인스턴스에 대해 진행중인 작업에 대한 정보가 포함된 문서를 반환하는 명령어입니다.

 

 

 

 

{
                        "desc" : "conn131321",
                        "threadId" : "1324123124124",
                        "connectionId" : 113124,
                        "client" : "127.0.0.1:50262",
                        "clientMetadata" : {
                                "driver" : {
                                        "name" : "PyMongo",
                                        "version" : "3.6.1"
                                },
                                "os" : {
                                        "type" : "Linux",
                                        "name" : "Linux",
                                        "architecture" : "x86_64",
                                        "version" : "5.4.0-100-generic"
                                },
                                "platform" : "CPython 3.8.10.final.0"
                        },
                        "active" : true,
                        "opid" : 54790112,
                        "secs_running" : 1180,
                        "microsecs_running" : NumberLong(118781297),
                        "op" : "update",
                        "ns" : "testmongo.updatejson",
                        "query" : {
                                "$and" : [
                                        {
                                                "Hash_MD5" : "-----"
                                        },
                                        {
                                                "Collected Date" : {
                                                        "$gte" : "2020-04-25"
                                                }
                                        }
                                ]
                        },
                }

 

위는 db.currentOp의 결과이고 각각 태그의 내용은 다음과 같습니다.

 

desc : 작업에 대한 설명입니다.

 

client : 작업이 시작되는 클라이언트 연결의 IP 주소(또는 호스트 이름) 및 임시 포트입니다.

 

clientMetadata : 클라이언트에 대한 추가 정보입니다. 

 

active : 작업이 시작되었는지 여부를 알려줍니다

true일시 작업이 시작된것이며 , false일시 유휴 연결이거나 , 비활성 세션인 상태입니다.

 

opid : 작업의 식별자이며 db.killOp()로 전달하여 mongosh 작업을 종료할 수 있습니다.

 

sec_running : 이 글의 핵심이며 해당 query를 실행하는데 걸린 작업 시간(초단위) 입니다.

mongoDB는 작업 시작 시간에서 현재 시간을 빼서 해당 값을 계산합니다.

active 상태가 true일시에만 존재합니다.

 

op : 특정 작업 유형을 식별하는 문자열입니다.

none , update , insert , query , command, getmore , remove , killcursors등 대부분의 명령을 입력할 수 있습니다.

 

ns : 작업이 대상으로 하는 네임스페이스입니다.

네임스페이스는 [데이터베이스 이름.컬렉션 이름]으로 구성됩니다.

 

query 는 작업과 관련된 전체 명령을 출력합니다.

 

numYileds : 다른 작업이 완료될 수 있도록 작업이 양보한 횟수를 보고하는 카운터입니다


 

위 update 작업을 진행하는 query같은 경우에는 실행하는데 드는 시간이 1000초가 넘으므로

 

slowquery가 백그라운드에서 계속해서 돌아가고 있다면 서버의 cpu 점유율이 높게 잡힐 수 있습니다

 

 

해당 명령어를 통해 쿼리 실행시간을 확인하여

 

정상적으로 도는 쿼리는 맞으나 성능이 좋지 못한 관계로 쿼리를 리팩토링 하거나

 

정상 종료가 되지 않아 좀비프로세스처럼 남아버린 쿼리로 확인되여 강제로 종료시키는 방법으로

 

서버 cpu 자원을 관리할 수 있습니다.

 

'Database' 카테고리의 다른 글

MongoDB 레플리카셋의 priority 우선 순위 변경하기  (0) 2023.01.27