
서버 성능 모니터링을 위한 Python 사이드카 구축하기
경량 Python 사이드카로 서버 모니터링 강화하기
최신 클라우드 및 마이크로서비스 아키텍처에서 사이드카는 메인 애플리케이션에서 보조 작업을 오프로드하여 필수적인 역할을 합니다. Python 사이드카는 기본 애플리케이션에 부담을 주지 않으면서 시스템 상태를 모니터링하는 데 특히 유용할 수 있습니다. 이 가이드에서는 서버 성능 메트릭을 지속적으로 수집하고, 이를 기록하고, 임계값을 초과하면 선택적으로 경고를 보내는 경량 Python 스크립트를 만드는 방법을 안내합니다.

Python 기반 사이드카는 서버 성능을 실시간으로 모니터링할 수 있는 간단하면서도 효과적인 방법입니다. 경고 및 원격 로깅과 같은 확장 기능을 통해 시스템 안정성과 사전 예방적 문제 해결을 보장할 수 있습니다. 이를 인프라에 통합하여 핵심 서비스에 영향을 주지 않으면서 통합 가시성을 향상시켜 보세요.
저는 이 스크립트를 작성할 때 Docker 컨테이너를 실행하는 많은 수의 호스트(약 600개의 X-Large가 30,000개 이상의 컨테이너를 실행)를 모니터링해야 하는 환경에서 일했고, 기존 모니터링 소프트웨어, 심지어 오픈 소스 소프트웨어도 사용할 수 없었습니다. 하지만 파이썬은 코드 몇 줄로 큰 효과를 낼 수 있는 강력한 언어입니다.
종속성
이 스크립트는 CPU 로드, 메모리 사용량, 디스크 활동 등의 시스템 성능 메트릭을 가져올 수 있는 psutil 라이브러리에 의존합니다. 일부 Linux 버전에서는 이 라이브러리를 설치하는 것이 까다로울 수 있지만, OS의 패킷 관리자 리포지토리에 이전 버전을 설치할 수 있을 수도 있습니다.
스크립트는 또한 스케줄 라이브러리에 의존하고 스레드를 사용합니다. 이렇게 하면 스크립트가 지속적으로 실행되며 스크립트 내에서 특정 조건을 확인하는 주기를 조정할 수 있습니다.
저는 특정 채널에 메시지를 게시하여 알림을 보내는 데 Slack을 사용하기로 결정했습니다. 필요에 따라 이를 조정할 수도 있습니다. 이 특정 버전은 AWS의 EC2 인스턴스에서 실행되므로 Slack URL은 Boto3 라이브러리를 사용하여 매개변수 스토어에서 검색되므로 다시 한 번 상황에 맞게 조정하시기 바랍니다.
특징
저는 스크립트가 디스크, CPU 및 메모리 사용량, 즉 기본 사항을 모니터링하기를 원했습니다. 임계값과 빈도는 조정할 수 있습니다.
일부 서버에서 실행 중인 프로세스 중 하나에서 지금까지 경험한 것 중 가장 큰 메모리 누수가 발생했는데, 하루에 약 1GB에 달했습니다. 그 결과, 스크립트는 2GB 이상을 사용하는 각 프로세스의 시간 경과에 따른 메모리 사용량도 기록합니다(다시 한 번 필요에 따라 조정). 이는 이러한 조건을 식별하는 좋은 방법이며, 로그를 조회하여 시간이 지남에 따라 증가하는 메모리 사용량을 확인할 수 있습니다.
또한 스크립트에서 네트워크 연결이 끊어졌는지 확인하기를 원했지만 너무 많은 알림이 발생하여 환경에 더 큰 문제가 발생하고 있다는 신호일 수 있습니다.
CPU는 모니터링하기 까다로울 수 있으며, 일시적인 CPU 사용량 급증은 실제로 괜찮을 수 있지만, AI 모델을 훈련하는 경우가 아니라면 장시간 90-100%에 가까운 CPU 사용량은 확실히 좋지 않습니다. 다시 한 번, 필요에 맞게 조정하세요!!!
파이썬 코드
전체 코드는 GitHub에서 확인할 수 있습니다:
https://github.com/Christophe-Gauge/python/blob/main/sidecar_monitor.py
각 검사에 대한 일정은 스크립트 맨 아래에 설정되어 있으며, schedule.every(5).to(15).minutes 구문은 이 작업이 매 5분에서 15분 사이에 실행된다는 의미로, 모든 검사가 동시에 발생하여 원치 않는 CPU 급증을 일으키지 않도록 약간의 무작위성을 추가합니다.
schedule.every(5).to(15).minutes.do(run_threaded, Check_Disk_Usage)
schedule.every(15).to(45).minutes.do(run_threaded, Check_Memory_Usage)
schedule.every(10).to(20).minutes.do(run_threaded, Check_Required_Containers)
# schedule.every(4).to(6).hours.do(run_threaded, Check_Network_Drops)
schedule.every(1).to(2).hours.do(run_threaded, Check_CPU_Usage)
schedule.every(24).hours.do(resetSlackCount)
watch_and_notify_events 함수는 스레드로 실행되며 매우 강력합니다. 이 함수는 Docker 소켓에 연결하여 감시하려는 컨테이너의 이벤트를 수신 대기합니다. 이러한 컨테이너의 모든 상태 변경에 대해 Slack 메시지를 보냅니다. 지속적으로 충돌하고 다시 시작되는 "바운싱" 컨테이너가 있는 경우 많은 알림이 생성되므로 알림에 시달리지 않도록 일일 최대 Slack 알림 횟수도 정해져 있습니다.
스크립트 사용
백그라운드 서비스로 실행
사이드카 스크립트를 백그라운드에서 실행하려면 다음을 사용하세요:
노업 파이썬 사이드카_모니터.py &
서비스로 실행
프로덕션 환경에서 사용하려면 특정 OS의 설정을 사용하여 서비스 형태로 실행하세요.
라이선스
이 프로젝트는 GNU 약소 일반 공중 사용 허가서 v3.0(LGPL-3.0)에 따라 라이선스가 부여됩니다.
면책 조항
본 소프트웨어는 상품성, 특정 목적에의 적합성 및 비침해에 대한 보증을 포함하되 이에 국한되지 않는 어떠한 종류의 명시적 또는 묵시적 보증 없이 "있는 그대로" 제공됩니다. 어떠한 경우에도 저작자 또는 저작권 소유자는 소프트웨어 또는 소프트웨어의 사용 또는 기타 거래로 인해, 그로 인해 또는 이와 관련하여 발생하는 계약, 불법 행위 또는 기타 모든 청구, 손해배상 또는 기타 책임에 대해 책임을 지지 않습니다.
Tagged with:
Python notification linux networking