성능 모니터링 및 테스트
성능 모니터링 및 테스트
서버 자원 사용률 점검 항목
- CPU
- CPU 자원 부족?
- CPU 사용 유형 중 시스템 이나 IO wait 사용률이 높은지?
- 프로세스 별 CPU 사용률 분표가 균등한지?
- 메모리
- 메모리 부족?
- 서버 전체 또는 개별 프로세스 단위로 메모리 사용량 지속 증가?
- 디스크
- 디스크 서비스 시간은 대기시간 포함해 얼마인지?
- 파일 시스템 중 공간 부족한 곳 있는지?
- 네트워크
- 네트워크 데이터 전송량 얼마인지?
- 재전송량 많은지?
- RTT 높은지?
리눅스 기본 명령어
man, cd, ls, cat, grep, pipe 등..
리눅스 시스템 모니터링 도구들
- top : 프로세스 표시
- ps : 현재 프로세스 스냅샷 리포트
- vmstat : 가상 메모리 통계
- sar : 시스템 활동 정보 수집 및 리포트
- iostat : CPU 통계, 장치나 파티션의 io 통계
- netstat : 네트워크 연결, 라우팅 테이블, 인터페이스 통계, 마스쿼레이드 연결, 멀티캐스트 정보
- mpstat : 프로세서 관련 통계
- pidstat : 리눅스 task 관련 통계
CPU
다음 작업들에 사용된 시간의 백분율 확인
- user-level application thread
- kernel thread
- interrupt 처리
Load average - 물리적 CPU vs 논리적 CPU 논리적 CPU (운영체제가 인식하는 CPU) = 프로세스 * 코어 * 하드웨어 스레드 CPU는 특정 시점에 단 하나의 작업만 수행할 수 있음 Run queue : 실행 준비 완료 되었지만 대기 중인 프로세스들의 큐
Kernel-Time
- kernel-level code를 실행하는데 소비한 시간
- system call 처리
- interrupt 처리 User-Time : user-level application 코드를 실행하는데 소비한 시간 Elapsed Time : 프로세스가 시작해서 종료할 때까지의 경과 시간 CPU Time : 프로세스가 실제로 논리 CPU를 사용한 시간
모니터링 도구
- uptime
- 시스템 실행 중인 시간 확인
- load average : 특정 시간 단위의 load 평균 값
- 15분 평균보다 1분, 5분 평균 값이 크다면 부하가 증가 중임
- load average가 크면 문제?
- 다른 지표와 같이 봐야 함
- CPU 코어가 몇 개인지? 일부 자원이 대기 상태에 있지는 않은지?
- vmstat
- 가상 메모리 통계 정보
- r : 실행 중 또는 run queue 에 대기 중인 task 수
- b : uninterruptible sleep task 수
- us : user time (%)
- sy : kernel time (%)
- id : idle time (%)
- ps
- 프로세스 상태 확인
- USER : 프로세스 소유자
- PID : 정수 형태의 프로세스 고유 식별자
- %CPU : CPU 사용률
- TIME : 해당 프로세스 생성 이후부터 소비한 전체 CPU 시간 (user + system)
- COMMAND : 명령어
- ELAPSED : 프로세스가 시작된 후 현재까지 시간
- top
- USER : 프로세스 소유자
- PID : 프로세스 고유 식별자
- 기본적으로 CPU 사용률을 기준으로 정렬되어 있음
- pstack, jstack (java)
- 쓰레드 덤프를 생성하여 stack trace 확인 가능
- 전체 쓰레드 개수를 확인 가능.
- 쓰레드가 획득한 락이나 상태도 확인 가능
- Thread Dump Analyzer 등 활용하면 더 쉽게 파악 가능
- 쓰레드 덤프 확인할 때에는 2회 이상 생성해야 더 정확한 결과 획득 가능
Memory
Virtual Memory
- 각 프로세스 별로 큰 선형 메모리 공간을 제공
- 물리 메모리 위치는 운영체제에 의해 관리
- 물리 메모리보다 큰 가상 메모리 공간 제공 가능
- Demand Paging -> 일종의 lazy loading
- 특정 Page를 다른 프로세스들 간에 매핑 (shared memory)
더 이상 할당할 메모리가 없다면? disk에서 swap (page in / out) - 비용이 비싸다
Page Fault : 유효하지 않는 virtual address 접근하려 할 때 발생
- Major fault : 물리 메모리에 없어 디스크로부터 읽어온 경우
- Minor fault : 물리 메모리에는 있지만 다른 프로세스의 개입. 디스크 개입 없는 경우
Buffer Cache : 데이터 버퍼로 block device driver에 의해 사용 디스크 장치의 고정된 크기의 block을 캐싱
Page Cache : 디스크 상에 저장된 데이터의 접근 속도 향상을 위한 캐시
- 수정 가능한 크기의 페이지를 캐싱
- 파일 / 디렉토리 IO 성능 향상
- 가능한 많은 메모리 영역을 사용
- 어플리케이션에서 사용할 메모리가 부족해지면 kswapd daemon에 의해 반납
Virtual Memory Size
- 프로세스가 접근할 수 있는 가상 메모리 크기
- 공유 라이브러리의 영역 미포함
- Demand Paging : 메모리 할당 시점이 아닌 페이지 접근이 이뤄질 때 실제 물리 메모리 할당
Resident Set Size
- 메인 메모리에 할당된 메모리 크기
- 공유 라이브러리의 영역 포함
- SWAP 미포함
모니터링 도구
vmstat : 가상 메모리 통계 정보
- free : 사용 가능한 메모리 양
- buff : 버퍼 캐시에 있는 메모리
- cache : 페이지 캐시에 있는 메모리
- si : page in 된 메모리
- so : page out 된 메모리
- 리눅스는 가능한 많은 공간을 페이지 캐시로 할당하려 함
ps : 프로세스 상태 확인
- %MEM : 주 메모리 사용량 (RSS)의 전체 시스템에 대한 비율
top : 리눅스 프로세스 목록 확인
- VIRT : 가상 메모리 영역 크기
- RES : 주 메모리에서 사용하는 영역 크기 (공유 메모리 영역 포함)
- %MEM : 주 메모리 사용량의 전체 시스템에 대한 비율
- Shift + M : 메모리 사용량으로 정렬
- Shift + P : CPU 사용량으로 정렬
sar
- pgpgin/s : 초당 page in 된 용량 (KB)
- pgpgout/s : 초당 page out 된 용량 (KB)
- fault/s : 초당 major + minor page fault 횟수
- majfit/s : 초당 major page fault 횟수
- pgscank : kswapd daemon에 의해 스캔 된 페이지 수
Java Garbage Collector
- Eden : 새로 생성한 대부분의 객체가 위치하는 곳
- Survivor : Eden 영역 gc 후 살아남은 객체가 이동하는 곳
- Old : Survivor 영역을 n회 이상 이동한 객체가 이동하는 곳
jstat : Java Virtual Machine Statistics Monitoring Tool
- 힙 영역 통계 (크기, 비율 등) 확인 가능
- 클래스 로더 통계 확인 가능
- gc 소요된 시간 / gc 횟수 = 대략적인 gc 평균 시간
gclog
- JVM 옵션 사용하여 로그를 남길 수 있음
- Gc 발생한 시간, 이유를 알 수 있음
- 나이 대별 객체의 정보 확인 가능
- gc 전후의 메모리 사용량도 확인 가능
Heap Dump / MAT
- jdk 설치하면 같이 설치되는 jmap으로 확인 가능
- 힙 덤프는 부하가 크기 때문에 운영 환경에서는 신중히 고려해야
- 텍스트가 아닌 바이너리 데이터 -> MAT등 전용 도구 필요
Disk
비교적 흔하게 접할 수 있는 문제. 자주 발생하지 않을 것 같지만 잊을만 하면 발생 df -h : 마운트 포인트별로 사용 중인 용량의 비율 확인 가능 du -h : 하위 폴더 별 사용 중인 디스크 공간의 크기를 확인 가능
다른 모니터링 도구들
Pinpoint
- APM
- Servermap 제공
- Realtime active thread chart
- Request / Response Scatter chart
- call stack
- inspector : CPU 사용량, Memory / GC, TPS, JVM Arguments
VisualVM
- Java App 모니터링 및 트러블슈팅 도구
- local / remote Java process 모니터링 가능
- jvmstat, JMX, Serviceability Agent
- CPU / 메모리 사용량, GC 추이
- 프로파일링
- 쓰레드 / 힙 덤프 생성 및 확인
성능 테스트
목적
- 신규 버전 출시 준비 상태 점검
- 인프라 / 시스템 아키텍쳐 성능 검증
- 소프트웨어 성능 평가
- 성능 튜닝을 통한 효율 향상
주요 용어 정리
Transaction : 시간 당 처리율을 나타내는 지표 기준
- 요청 기준 : 서버 입장에서 요청 하나하나 == 하나의 Transaction
- 사용자 기준 : 사용자가 한 화면을 보기 위해 필요한 모든 요청 묶음을 하나의 트랜잭션
- 사용자 기준 트랜잭션으로 측정 / 목표를 세워야 실 환경하고 유사
- 하지만 테스트가 너무 힘들어짐
동시 사용자 : 시스템과 접속을 유지하고 있는 사용자 수
- 요청 사용자 : 서버에 요청 후 응답 대기 상태 사용자
- 비요청 사용자 : 서버에 요청을 보내고 있지 않은 사용자 (화면의 내용을 읽는 등)
처리량 : 시스템이 일정 시간 내에 처리 가능한 트랜잭션 수 평가 단위 : TPS / PPS
응답시간 : 요청한 후 응답을 받을 때 까지 소요된 시간
- 클라이언트 처리 부분 : 렌더링, FE 로직
- 클라이언트 외 부분
- 네트워크 처리 시간 : DNS, 업로드, 다운로ㅡ
- 서버 응답시간:
- 서버 처리 시간 : 웹 + 어플리케이션 + 데이터 베이스
- 연계 응답 식나 : 연계 서버 + 타 서버
- 서버 응답시간:
- 네트워크 처리 시간 : DNS, 업로드, 다운로ㅡ
성능 테스트 절차
- 테스트 환경 파악
- 테스트 / 운영 환경에 대한 파악 (hw, sw, 네트워크 환경 등..)
- 테스트 도구
- 요구되는 성능 기준 파악
- 응답 시간
- 시스템 사용률 (cpu, 메모리)
- 테스트 계획 수립
- 주요 시나리오 정리
- 테스트 데이터 정의
- 측정 결과 데이터 정의
- 테스트 환경 설정
- 테스트 환경 / 도구 준비 (nGrinder, JMeter …)
- 리소스 (서버) 모니터링 환경 준비
- 테스트 구현
- 테스트 시나리오에 따른 구현 (nGrinder 스크립트 작성)
- 테스트
- 테스트 실행 및 모니터링
- 분석 및 리포트
- 결과 / 지표 데이터 분석
- 필요하다면 반복 테스트
ab
- Apache HTTP Server benchmarking tool
- https://httpd.apache.org/docs/2.4/en/programs/ab.html
wrk
- HTTP benchmarking tool
- https://github.com/wg/wrk
nGrinder
- Grinder에 기반한 성능 테스트 도구
- Jython script을 이용한 테스트 시나리오 작성
- 웹 기반 도구 제공
- 테스트 시나리오 관리
- 테스트 실행
- 모니터링
- 결과 확인 및 리포트 제공