Skip to content

서비스 성능 향상을 위한 서버 부하 및 리소스 모니터링 방법 #14

@whitejh

Description

@whitejh
  • 시나리오 구상 (how가 아니라 what 위주로)
    • monitor: 해당 이슈가 발생했다는 사실을 어떻게 탐지할 것인지
    • identify: 해당 이슈가 어디서 발생했고 시스템에 어떤 영향을 얼마나 끼치고 있는지를 어떻게 식별할 것인지
    • analysis: 해당 이슈가 왜 발생했는지를 어떻게 분석할 것인지
    • suggest: 해당 이슈에 대한 솔루션을 어떻게 제안할 것인지
  • 위에서 구상한 시나리오들 하나씩 구현

===================================================================================
출처

대용량 데이터 서비스를 운영하기 위해서는 서버 부하의 원인을 파악하고, 이를 해결할 수 있어야한다.

  1. 성능, 부하란 무엇인가
  • 웹 어플리케이션에서 부하분산이 많은 경우는 '디스크 I/O를 분산하고 경감시키는' 작업이다.
  • I/O가 OS에 의해 어떻게 처리되는지 이해해야한다.
  • OS는 I/O를 경감시키기 위해 캐시 구조를 사용하게 된다. 캐시가 가장 효율적으로 동작할 수 있도록, 시스템을 구성하는 것이 I/O 분산의 핵심이다.
  1. 병목을 규명하기 위한 작업
    1. Load Average 확인
    1. CPU, I/O 중 병목 원인 조사
  • Load Average가 높은 경우, 다음으로 CPU와 I/O 어느 쪽에 원인이 있는지를 조사해야한다.

  • 참고 : sar, vmstat으로 시간 경과에 따라 CPU 사용률이나 I/O 대기율이 추이를 확인할 수 있다.

===================================================================================
monitor

  1. CPU 부하가 높은 경우
    사용자의 프로그램의 처리가 병목인지, 시스템의 프로그램이 원인인지 확인

  2. I/O 부하가 높은 경우
    일반적으로 프로그램으로부터 입출력이 많아서 부하가 높거나, 스왑이 발생해서
    디스크 액세스가 발생하고 있는 상황인 경우가 많다.

Identify and analysis

  1. CPU 부하가 높은 경우

top, sar과 같은 명령어 이용

  1. I/O 부하가 높은 경우

sar, vmstat을 이용해 문제를 파악

suggest

  1. CPU 부하가 높은 경우

ps 명령어로 볼 수 있는 프로세스 상태나 CPU 사용시간 등을 보면서 원인이 되고 있는 프로세스를 찾는다.
프로세스를 찾은 후, 보다 상세하게 조사할 경우는 strace 명령어로 추적하거나 oprofile로 프로파일링해서 병목지점을 좁혀나간다.

  1. I/O 부하가 높은 경우

(ex1) 스왑이 발생하는 경우

    1. 특정 프로세스가 극단적으로 메모리를 소비하고 있지 않는지 ps 명령어로 확인할 수 있다.
    1. 프로그램 오류로 메모리를 지나치게 사용하는 경우, 프로그램을 개선한다.
    1. 탑재된 메모리가 부족한 경우에는 메모리를 증설한다. 메모리를 증설할 수 없는 경우에는 분산을 검토한다.

(ex2) 스왑이 발생하지 않고, 디스크로의 입출력이 빈번하게 발생하고 있는 상황
캐시에 필요한 메모리가 부족한 경우로 생각해 볼 수 있다. 해당 서버가 저장하고 있는 데이터 용량과 증설 가능한 메모리량을 비교해서 다음과 같이 나눠서 검토한다.

    1. 메모리 증설로 캐시영역을 확대시킬 수 있는 경우는 메모리를 증설한다.
    1. 메모리 증설로 대응할 수 없는 경우는 데이터 분산이나 캐시서버 도입 등을 검토한다.

물론, 프로그램을 개선해서 I/O를 빈도를 줄이는 것도 검토가능하다.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions