[개발] 뉴렐릭(Newrelic)모니터링 기본활용법
스쿼드(Squad)조직과 같이 린(Lean)하고 애자일(Agile)하게 개발을 하며 사업의 방향을 검증하기 위해서는, 그만큼 개발팀에서도 빠르게 대응을 해 나가는 상황이 비일비제합니다.
때로는 하드코딩이 있을 때도 있고, 기존 모델링에서 덧붙여서 개발을 하다보면 성능상에 문제가 발생할수도 사이드이펙트가 발생할수도 있습니다.
“목적지향조직(Squad)”에서 빠르게 가설 검증하는 것이 중요한만큼, “테크기능조직(Backend, Frontend, Mobile)”에서는 그 과정중에서 서비스를 사용하는 유저가 불편함을 느낀다는 것을 빠르게 감지하여 사용자의 나쁜 경험을 최소화 하는 것 또한 중요한 과제로 인지하고 있어야 합니다.
1. 뉴렐릭모니터링(Newrelic) 소개
잡플래닛은 뉴렐릭(Newrelic) APM 툴을 사용합니다. APM은 “Application Performance Monitoring” 의 약어입니다.
타 기업에서 흔히 사용하고 있는 APM 모니터링 툴 로는 DataDog, Zenniffer와 같은 솔루션도 있습니다.
처음에 뉴렐릭을 사용하는 분들은 상당히 높은 진입장벽에 애를 먹을 수도 있습니다. 일단은 영어로 되어 있기 때문에(?) 진정한 기능들을 사용하기에는 한계가 있습니다. (메뉴트리 또한 워낙 광범하기도 하고..)
입문자들(신규입사자)은 거의 실시간 대시보드정도 사용하면서 현재 서비스의 헬스체크정도만 합니다만 조금만 더 관심을 가지고 메뉴트리를 살펴보면 정말 다양한 기능을 제공한다는 것을 알 수 있습니다.
- Application(Server) Monitoring : APM의 기본이라고 불리울 수 있는 Transaction Count, Response Time 등등 성능 메트릭을 모니터링하고 분석합니다.
- Transaction Analyzer : 특정 Transaction을 추적하여 어느 부분에서 딜레이가 되고 있는지 체크 할 수 있습니다. 이러한 병목 현상을 확인함으로 인해 서버 성능저하의 원인을 파악하고 개선할 수 있습니다.
- Infrastructure Monitoring : 잡플래닛에서 구성하고 있는 인프라 상태(CPU, Memory 등등)를 모니터링 하여 현재 시스템이 안정적인지, 유저 방문대비 가용범위가 적절한지 체크할 수 있습니다.
- Error Ratings : 실시간으로 서버에 오류가 나는 페이지들을 대시보드에서 제공해주며 더 나아가 Stack Trace를 통해 코드라인 어느 부분에서 오류를 야기시켰는지 까지 제공해줍니다. 이러한 모니터링툴이 있을 때 장점으로는 직접 서버에 접속하지 않아도 로그를 확인할 수 있기 때문에 생산성 또한 향상된다는 점이라고 볼 수 있을 것 같습니다.
- Alert : 특정 이상 상황에 대해 정의해고 슬랙 또는 메일 등등 메신저에 알림을 연동하여 식속하게 대응 할 수 있습니다.
- Report : 매 주 퍼포먼스 보고서를 제공해줍니다.
이러한 기본적인 기능 외에도 조금만 더 Deep하게 파고들면 고급적인 전문가기능들도 다량 제공하니, 한번에 모든것을 습득하려 하지말고 시간을 두면서 하나씩 기능들을 테스트해보면서 회사에 유용한 기능으로 발전시킬 수 있는 노력이 필요합니다.
최근에는 Newrelic Korea에서 Monthly Webinar(Web Seminar)를 진행해주면서 좀 더 모니터링 툴을 잘 사용할 수 있는 방법에대해 많은 노력을 해주고 계십니다.
이번 포스트에서는 잡플래닛이 성능튜닝을 위해 뉴렐릭을 어떻게 사용하는지에 대한 위주 로 설명을 드리도록 하겠습니다.
2. Web Transactions
우선 잡플래닛 서비스에 사용되는 스펙 구성 및 디테일한 퍼포먼스에 대해서는 블라인드 한 점 양해부탁드립니다.
위에 보여진 화면이 현재 실시간으로 보여지고 있는 서버의 응답 상태입니다. 분단위, 시간단위, 일단위, 주단위 등등 여러가지 범위로 체크할 수 있습니다.
차트에서 색깔이 다른 부분은 어떤 인프라스트럭쳐에서 더 많은 비중을 차지하고 있는지를 체크할 수 있는 부분입니다. 예를 들면 잡플래닛의 주 언어인 Ruby on Rails 서버는 얼마나 Transaction 에 비중을 차지고 하고 있는지, 주 데이터베이스인 MySQL은 얼마나 비중을 차지하고 있는지 등등 해당 대시보드를 통해 확인할 수 있습니다.
위의 대시보드에서는 현재 시간 기준 가장 느린 Transaction을 차지하고 있는 페이지(라우트)는 무엇인지 체크를 할 수 있습니다.
한번의 call time중 가장 느리게 작동했던 시간(Slowest trace)도 확인 할 수 있으며, 여러번의 call time에 대한 평균 지연 시간(Average duration)도 확인 할 수 있습니다.
해당 대시보드에서 문제가 되고 있다고 리포팅 되고 있는 부분을 조금 더 디테일하게 볼 수도 있습니다. (링크 기반으로 세부 대시보드가 오픈되는 구조입니다.)
먼저 Breakdown table은 Transaction 정보를 세분화하여 카테고리화 시켜, 각 카테고리별로 어떤 행위를 했는지를 표로 표현합니다. 이것과 연관되어 있는 것이 바로 마지막 캡쳐본인 Transaction detail 화면이며, 어느 부분에서 딜레이현상이 나타나고 있는지 성능개선 포인트가 어느 부분인지 체크가 가능하게 됩니다.
위의 캡쳐본에서는 N+1 쿼리와 같이 여러번 반복호출하는 부분에서 딜레이가 생겼던 부분으로, 저희는 밑에 소개할 ‘퀵실버 프로젝트’로 개선을 진행하였습니다.
3. Databases
웹/모바일 기반의 플랫폼 서비스를 하는 기업에서는 빼놓을 수 없는 것이 바로 데이터베이스입니다.
처음 깔끔하게 설계되어 있는 데이터베이스 구조에서도 시간이 지나면 지날수록 데이터가 많이 쌓이게 되면서 느려지게 되는 경우 또한 많이 볼 수 있습니다.
뉴렐릭에서는 운영중인 데이터베이스의 성능 및 쿼리플랜에 대해서도 대시보드를 제공해줍니다.
Slowest Transaction 과 마찬가지로 어떤 데이터베이스 쿼리가 성능에 악영향을 미치고 있는지에 대해서 제공을 해줍니다.
더 디테일하게 링크를 타고 들어가면
- 현재 몇개의 row를 스캔했는지
- 인덱스가 적용되고 있지 않는 부분
- 현재 해당 쿼리가 실행되고 있는 페이지의 Stack Trace
까지 힌트를 제공해줍니다. (물론 뉴렐릭이 제공해주는 모든 힌트를 믿으면 안되지만, 어느정도 참고를 하여 성능개선에 큰 결과물을 만들기도 합니다.)
잡플래닛은 뉴렐릭 모니터링의 도움을 받아 대부분 데이터처리에 대한 개선건에 대해서는 다음과 같은 부분을 고려합니다.
- 첫번째 시도 : 인덱스의 재구성
- 두번째 시도 : 캐시사용에 대한 고려
- 세번째 시도 : 엘라스틱서치(Elasticsearch)로의 이중 동기화 작업
위의 내용을 토대로 수많은 슬로우 쿼리 처리를 해결해나갔으며, 지금 이 순간에도 데이터베이스 튜닝에 대한 부분은 적극적으로 모니터링을 통해 잡아나가고 있습니다.
4. Performance
기능이 릴리즈가 되면 가장 먼저 체크하는 부분이 위의 ‘Web Transactions’ 와 ‘Databases’ 입니다. 해당 대시보드를 통해 우리의 기능 배포가 정상적으로 진행 된 것이 맞는 것인지, 사이드이펙트는 없는지 단기간으로 체크하는 용도로 많이 사용되고 있습니다. 여기에 덧붙여 뉴렐릭의 Performace 비교 기능에 대해서도 저희는 체크를 하고 있습니다. 해당 기능은 잡플래닛 서비스가 어제 대비 오늘은 얼마나 안정적인지 / 지난주 이 시간대에 비해 오늘은 얼마나 안정적인지 / 최근 일주일동안 평균 안정성은 어느정도인지를 체크할 수 있습니다.
위의 표에서 보여지는 ‘Throughput’은 특정 시간 동안 처리한 작업의 양을 나타내는 부분이고, ‘Total time’ 은 해당 트랜젝션을 얼마나 많이 호출했는지, ‘Average time’은 평균 응답시간, ‘Apdex score’ 사용자의 서비스 경험이 얼마나 좋았는지를 체크해주는 지표입니다.
해당 페이지 또한 링크를 이용하여 디테일한 대시보드가 오픈이 되기 떄문에 성능개선요소가 어떤 부분이 있는지 눈으로 바로 확인이 가능한 것이 장점입니다.
또한 해당 퍼포먼스 기능은 위와 같은 표를 통해 우리가 확인하고 싶은 라우트 또는 컨트롤러를 찾아서 성능 체크 또한 가능합니다.
‘Apdex score’에 대해 조금 더 자세히 설명을 드리자면
- 사용자가 실행하는 업무에 대한 반응 속도를 “0 (불만족) ~ 1 (만족) 사이”의 만족도 표현 값으로 수치화 합니다.
- 반응 속도 = 사용자가 화면을 클릭 해서 작업을 시작하고 그 결과가 사용자의 눈에 보이기까지 기다리는 시간
- 계산 방법 = ((satisfied count * 1) + (tolerating count * 0.5)) / total task count
ex) (60 * 1) + (30 * 0.5)) / 100 = (60 + 15) / 100 = 0.75
와 같은 공식으로 서비스경험 점수가 매겨집니다.
5. 퀵실버 프로젝트
해당 포스트에서 설명해드린 기본적인 기능을 가지고 잡플래닛은 성능개선 및 운영대응을 진행 하고 있습니다.
Delay Time이 심한 트랜젝션 및 데이터베이스에 대해서 인지를 하게 될 경우, 저희는 JIRA에 ‘퀵실버 프로젝트’라는 별칭으로 테크 과제를 해결해나가고 있습니다.
‘퀵실버’는 마블 코믹스에 나오는 히어로이며, 그의 특별한 능력은 초고속으로 달리거나 움직일 수 있는 능력을 가지고 있습니다. 잡플래닛의 서버 성능 또한 퀵실버가 되길 바라는 마음에 지어진 이름입니다.ㅎㅎ
(참고로 잡플래닛의 MSA Auth Server 이름 또한 마블 코믹스에 나오는 문지기인 ‘헤임달’ 이라는 이름을 가지고 있습니다.)
해당 프로젝트를 지속적으로 개선하고 유지보수해나가면서 잡플래닛 서비스의 안정성은 더욱더 높아져가고 있고, 실제로 드라마틱하게 빠르게 랜더링 되는 화면을 보고 있을 때의 뿌듯함과 희열은 개발자로써 늘 느끼고 싶은 상황이 되어가는 것 같습니다.
백엔드팀을 이끌어가고 있는 팀장엔 저부터 작지만 소박하게 시작했던 성능개선 작업은 이제 백엔드팀 개발자라면 절대로 간과하지 않고 ‘책임감’과 ‘프로의식’을 가지며 실행하는 발전하는 테크문화로 발돋음하고 있습니다.
마지막으로 백엔드팀 개발 세미나에서 진행 했던 발표자료(영화 범죄와의 전쟁을 패러디하여 만든 자료라서 제목이 이렇습니다 ㅎㅎ)중 일부 성능개선의 결과를 공유 드리며 포스트를 마무리 짓도록 하겠습니다.
해당 발표자료는 뉴렐릭 퍼포먼스 페이지의 구 화면으로, 포스트에서 소개드린 화면과는 다소 차이가 있는 점 참고 부탁드립니다.