지표 수집과 모니터링
- 서비스가 잘 동작하고 있는지 확인하기 위해서 사용한다.
- 서비스가 잘 동작하고 있는가?
- 에러가 발생하고 있지는 않은가?
- CPU, DISK 사용량 등 일정량을 넘지 않았는지?
- 지속적인 지표 수집이 필요하다.
- 서비스에서의 지표
* API Call 수
* API Latency -> 평균 속도가 아닌 Median 값, 99% 값, 최대값 등의 지표를 수집해야 한다. - 서비스 노드 지표
* 서버의 상태
* CPU 사용량
* 메모리 사용량
* 디스크 사용량
* 네트워크 사용량 (파일이나 데이터의 전송량이 얼마나 되는가?)
* 현재 동작중인 정상적인 서버의 수 - 에러 수집
- 서비스에서의 지표
- 알림 기능 사용
- 모니터링 지표가 특정 값을 넘는다면, 슬랙이나 메시저 등으로 알람을 보내서 항상 특정 상항에 대한 알람을 보낸다.
- 등급을 나눠서 알람을 전송한다.
- 모니터링 지표가 특정 값을 넘는다면, 슬랙이나 메시저 등으로 알람을 보내서 항상 특정 상항에 대한 알람을 보낸다.
AWS에서 제공하는 기본적인 지표들
* CloudWatch를 통해서 확인할 수 있다. -> 서비스 지표들은 자체적으로 수집해야 한다.
* Datadog, New Relic, Watap 등의 모니터링 서비스를 사용하는 것이 좋다.
Prometheus와 Grafana
Prometheus
- exporter라는 agent를 사용하여 여러 가지 필요한 툴들의 모니터링이 가능하다.
- MySQL, Redis 등의 컴포넌트에 대한 metric 수집을 위한 exporter가 이미 존재하고, 각 서버 노드의 필요 정보(CPU 사용량, 메모리 사용량, alive 여부, 네트워크 사용량)에 대한 exporter가 이미 존재한다.
- 데이터 수집을 PULL 방식을 사용하므로, Prmetheus 자체에 문제가 발생하더라도 모니터링 호스트에 장애가 전달되지 않는다.
Grafana
- Prometheus에서도 간단한 그래프를 사용하여 데이터의 Visualization이 가능하지만, Grafana를 적용하면 좀 더 다양한 그래프를 사용할 수 있다.
- 노드 정보를 보여주는 것과 서비스 지표를 보여주는 것이 서로 다른 정보의 형태이므로 Graph를 다양하게 사용할 필요가 있어 사용한다.
* 실제 모니터링은 Prometheus에서 진행하고 Visualization을 Grafana로 이용한다.
* Grafana의 DataSource에 Prometheus를 추가하여 제공 받은 정보를 바탕으로 Visualization을 할 수 있다.
테스트
- 서비스 출시 전에 해당 서비스가 어느 정도의 안정성을 가질 수 있는지 확인하는 테스트
- 성능 테스트/부하 테스트/ 스트레스 테스트로 나눌 수 있다.
성능 테스트
- 해당 서비스가 어느 정도의 성능을 내는지 알아보는 테스트
- Ex) 성능이 100TPS 정도 된다.
- Ex) 성능이 100TPS 정도 된다.
- 주의 사항
- 단순히 API 하나 호출하는 것이 아니라, 실제 서비스에서 사용되는 패턴으로 테스트가 필요하다.
- API 마다 부하의 종료가 다르다.
- 여러 API의 조합이 필요할 수 있다.
- 클라이언트의 성능 한계를 확인한다.
- 부하를 주는 클라이언트의 한계로 인해서 성능 측정이 어려울 수 있으니, 클라이언트를 점점 늘리면서 테스트를 진행해야 한다.
- 부하를 주는 클라이언트의 한계로 인해서 성능 측정이 어려울 수 있으니, 클라이언트를 점점 늘리면서 테스트를 진행해야 한다.
- OS 에서 설정하는 값들에 대한 확인이 필요하다.
- Open Files -> OS에서 열 수 있는 파일 개수, AWS의 경우 사양에 따라 다르게 설정되어 있다.
- Max User Processes 값의 튜닝이 필요하다.
- /etc/limis.conf 수정
- 단순히 API 하나 호출하는 것이 아니라, 실제 서비스에서 사용되는 패턴으로 테스트가 필요하다.
- 성능 테스트 툴
- Ngrinder
- 평균 TPS 확인 가능
- 최대 TPS 확인 가능
- 성공 수, 실패 수
- 실패 수가 전체의 30%이면, 테스트는 실패하게 된다.
- Locust
- JMeter
- Gatling
- ab
- Ngrinder
부하 테스트
- 해당 서비스의 어느 부분에서 어느 정도 부하가 걸리는 지를 알아보는 테스트
- Ex) 어느 함수에서 시간이 오래 걸린다.
스트레스 테스트
- 성능 테스트/부하 테스트가 특정 시간 이상 지속적이고 안정적으로 되는지 확인하는 테스트