data engineering

mongodb profile설정하기.

qkqhxla1 2017. 11. 28. 10:19

공유로 몽고디비를 사용하다 보면 프로파일링이 꼭 필요하다.
갑자기 내 쿼리가 느려졌는데 그게 내 쿼리 때문인지, 다른 사람들이 사용하는 쿼리에서 락을 잡아서 내것이 느려졌다던지 이런것들을 알기 위해 프로파일링을 해야 한다. 이게 아니면 하나하나 삽질해서 알아내는 수밖에 없는데 만약 컬렉션이나 사용자가 많은 경우. 일일히 사용되는 쿼리를 물어봐서 확인할수도 없고,(오래된 경우 심지어 만든 사람이 기억 못하는 경우도 있고) 해서 프로파일링이 필요하다. 


https://docs.mongodb.com/manual/reference/method/db.setProfilingLevel/
db.setProfilingLevel(1, 1000) 을 실행시키면 프로파일링 컬렉션이 생성된다. 위의 docs에 있지만 첫번째 인자는 0(더이상 안보여줌), 1(보여줌) 이고 두번째 인자는 실행하는데 1000millisecond보다 더 오래 걸린 쿼리를 기록하겠다는 의미이다.

실행시킨 경우 

위처럼 db안의 System이라는 폴더가 생기고 그 안에 system.profile이라는 컬렉션이 생긴다. 그리고 차차 위에서 설정한 millisecond보다 더 오래 걸리는 쿼리들이 생성되기 시작한다. (아무것도 없으면 저거보다 오래걸리는 쿼리가 없다는뜻.)


예시로 하나를 가져와보았다. 내가 지운 부분에는 어떤 컬렉션에서 어떤 연산을 하는지가 적혀있고, millis필드에는 몇 밀리세컨드가 걸렸는지 적혀있다. 저걸 만들때 두번째 인자로 100을 줘서 100millis보다 더 오래 실행된 쿼리를 가져왔고, 

locks필드에서 어떤 락이 걸려있는지 알수 있다. 단순 db락일 경우 db를 분리하던가 해서 일시적으로 부하를 다른곳으로 돌릴수 있겠지만 global lock인 경우에는 쿼리 자체를 튜닝해야 한다. 아니면 서버를 바꾸던가... 

몽고디비는 처음 써봐서 느려졌을때 디버깅할줄 몰라서 엄청 애먹었는데 이거 하나덕분에 시간이 많이 줄었다.

참고로 재설정시 이미 있는 로그들은 남아있으므로, 새로 만들고자 한다면 헷갈리지 않게 저 테이블을 drop하고 다시 실행시키는걸 잊지 말자.