성능 모니터

개요

bsrmon 은 복제를 수행하는 bsr 엔진의 전체 복제 과정을 추적하고 엔진의 로직 구간별 소요 시간을 실시간 기록하여 엔진 동작의 병목을 파악할 수 있는 성능 모니터링 도구 입니다. bsr 커널 엔진은 내부 시간(jiffies) 기록을 통해 엔진이 동작했던 시점의 구간 별 시간 기록과 누적 계산치 등 성능 관련 통계정보를 파일 로그 형태로 유지합니다. 관리자는 이 커널 엔진의 통계 정보를 bsrmon 유틸리티로 조회하여 모니터링 할 수 있습니다. bsrmon 은 1.6.1 버전 부터 지원하며 기본 활성화 되어 있습니다.

linux 환경에서는 debugfs 기능이 활성화 된 커널에서만 성능모니터 기능을 사용할 수 있으며, debugfs 가 /sys/kernel/debug 경로에 마운트되어 있어야 합니다.

debugfs 기능 활성화는 다음 명령을 사용하여 확인할 수 있습니다.

  • # grep CONFIG_DEBUG_FS /boot/config-`uname -r` CONFIG_DEBUG_FS=y

debugfs는 CentOS7 버전부터 자동 마운트되며, CentOS6 버전대에서는 자동 마운트되지 않기 때문에 /sys/kernel/debug 경로에 마운트 이후 성능모니터 기능을 사용할 수 있습니다. 시스템 재부팅 이후에서도 성능 모니터 기능을 사용하고자 한다면 fstab에 해당 마운트 경로를 등록해주어야 합니다.

  • # mkdir /sys/kernel/debug # mount -t debugfs debugfs /sys/kernel/debug

 

유형

성능 측정의 대상 유형 입니다. bsrmon 의 types 인자에 해당합니다.

iostat, ioclat, reqstat, peer_reqstat, alstat, network, sendbuf, memstat

iostat {resource} {vnr}

복제 볼륨의 읽기, 쓰기 I/O 에 대한 집계 데이터 (io count, kbs, kb)

  • I/O 성능 데이터 실시간 모니터링

> bsrmon /watch iostat r0 0 2020-12-06_08:22:36.223 read : IO count=0, BW=0kb/s (0KB) write: IO count=216, BW=110208kb/s (220416KB) 2020-12-06_08:22:37.640 read : IO count=0, BW=0kb/s (0KB) write: IO count=34, BW=16896kb/s (16896KB) 2020-12-06_08:22:39.32 read : IO count=0, BW=0kb/s (0KB) write: IO count=326, BW=155176kb/s (155176KB) 2020-12-06_08:22:40.106 read : IO count=0, BW=0kb/s (0KB) write: IO count=330, BW=164624kb/s (164624KB) ...

→ write I/O 가 지속적으로 발생하고 있는 상황

  • I/O 성능 데이터의 통계 출력

→ 2021-07-20_08:14:27.405 - 2021-08-04_18:59:53.573 기간 동안 집계된 데이터

→ 24개의 read I/O samples. 평균 248, 최소 40, 최대 284 Mbytes/s 의 IO 가 처리됨

→ 6670개의 write I/O samples. 평균 320, 최소 12, 최대 401 Mbytes/s 의 IO 가 처리됨

  • 백업 파일을 사용하여 통계 계산

→ vnr0_IO_STAT_2021-07-20_081427.005 파일로 부터 데이터 추출

→ 2021-07-07_21:24:24.383 - 2021-07-20_08:14:26.371 기간 동안 집계된 데이터

→ 6452 개의 read I/O samples. 평균 980 iops, 최소 1 iops, 최대 1233 iops 로 측정됨

→ 28468 개의 write I/O samples. 평균 786iops, 최소 1 iops, 최대 6478 iops 로 측정됨

ioclat {resource} {vnr}

local/master I/O 의 complete latency (usec)

  • I/O complete latency 실시간 모니터링

→ write I/O 가 지속적으로 발생하고 있는 상황

→ local/master I/O가 완료되기 까지 소요된 시간의 최소, 최대, 평균값 출력

  • I/O complete latency 통계 출력

→ 2020-12-07_02:42:31.440 - 2020-12-08_09:37:44.115 기간 동안 집계된 데이터

→ 50개의 local clat samples. 평균 8601, 최소 153, 최대 1635570 usec 이 소요된 것으로 측정됨

→ 50개의 master clat samples. 평균 21801, 최소 217, 최대 1667260 usec 이 소요된 것으로 측정됨

io_pending {resource} {vnr}

I/O 완료 지연에 대한 집계 데이터

  • uppper_pending : Application IO 완료 대기중인 수

  • pending_latency : IO 완료 지연에 대한 latency

  • lower_pending : 장치로 요청한 Block IO 완료를 대기하는 수

  • al_suspended : device 의 AL_SUSPENDED flag 확인

  • al_pending_changes : 커밋 대기중인 al 수

  • al_wait_req : al 획득을 대기중인 request 수

  • upper_blocked : IO 처리가 block 된 상태인지 확인

    • suspended

    • suspend_cnt

    • unstable

    • pending_bitmap_work

  • io_pending 성능 데이터 실시간 모니터링

→ 완료 대기중인 IO 는 32개

→ 현재 IO가 완료되기까지 3505usec 의 지연 발생

→ upper_blocked 는 0 으로 IO block 상태가 아님

→ 정상적으로 복제가 진행되고 있는 상황으로 간주할 수 있음

  • io_pending 성능 데이터 통계 출력

→ 최대 pending IO 수는 33

→ IO가 완료되기 까지 최대 약 1초의 지연 발생

→ bitmap work로 인해 IO block이 58 회 발생하였음

reqstat {resource} {vnr}

request 생성 시점을 기준으로 특정 구간까지 소요된 시간에 대한 집계 데이터 (usec)

  • requests : 모니터링 기간(주기) 동안 처리된 request 갯수

  • before_queue : submit work queue에 큐잉되기 이전까지 소요된 시간

  • before_al_begin : act_log 의 lru를 얻기 전 까지 소요된 시간

  • in_actlog : RQ_IN_ACT_LOG 가 설정 되기까지 소요된 시간

  • submit : request submit 이 실행 되기까지 소요된 시간

  • bio_endio : bio 완료 로직이 실행 되기까지 소요된 시간

  • pre_send : peer로 data send 전까지 소요된 시간

  • acked : send 후 RQ_NET_PENDING이 제거 되기까지 소요된 시간

  • net_done : RQ_NET_DONE 까지 소요된 시간

  • destroy : request 가 해제 되기까지 소요된 시간

al uptate 가 완료 되기까지 각 구간 별 소요 시간 (usec)

  • al_update : 모니터링 기간(주기) 동안 update 된 active log 갯수

  • before_bm_write : bsr_bm_write_hinted() 실행 전

  • after_bm_write : bsr_bm_write_hinted() 실행 후

  • after_sync_page : bsr_md_sync_page_io() 실행 후

  • request 성능 데이터 실시간 모니터링

→ write I/O 가 지속적으로 발생하고 있는 상황

→ peer bsr03 과는 연결 단절

→ al update는 수행되지 않음

  • request 성능 데이터 통계 출력

→ 2020-12-06_05:46:36.678 - 2020-12-08_09:45:46.219 기간동안 38180 개의 requests가 처리되었음

→ al_update는 한번도 발생하지 않음

peer_reqstat {resource} {vnr}

peer request 생성 시점을 기준으로 특정 구간까지 소요된 시간에 대한 집계 데이터 (usec)

  • peer_requests : 모니터링 기간(주기) 동안 처리된 peer requests 갯수

  • submit : peer request submit 이 실행 되기까지 소요된 시간

  • bio_endio : peer request 의 bio 완료 로직이 실행 되기까지 소요된 시간

  • destroy : peer request가 해제 되기까지 소요된 시간

  • peer request 성능 데이터 실시간 모니터링

→ peer bsr-02 에 대한 100개의 peer request가 처리됨

→ peer bsr-03 에 대한 peer request 는 발생하지 않음

  • peer request 성능 통계 출력

→ 2021-07-11_22:23:08.890 - 2021-07-19_21:56:18.179 기간동안 집계된 데이터

→ bio 완료 로직이 실행 되기까지 평균 0.1초 가량 소요되었음

alstat {resource} {vnr}

active log 의 사용 수치에 대한 집계 데이터

  • used 값, used 값의 최대값 집계

  • hits, misses, starving, locked, changed 증가 값 집계

  • al_wait retry 횟수 집계

  • al 부족 발생 원인 집계

    • starving, pending, used, busy, wouldblock

network {resource}

복제 네트워크 송수신 속도 (byte/s)

sendbuf {resource}

송신버퍼 사용량 (bytes)

memstat

유저 및 모듈에서 사용하는 메모리 사용량

유저 공간에서는 bsradm, bsrsetup, bsrcon, bsrmon, bsrservice 프로세스가 사용하는 메모리가 집계됩니다.

  • windows

    • GetProcessMemoryInfo()를 통해 획득한 메모리 정보

      • WorkingSetSize, QuotaPagedPoolUsage, QuotaNonPagedPoolUsage, PagefileUsage

  • linux

    • ps 명령을 통해 획득한 메모리 정보

      • rsz : 물리 메모리 사용량

      • vsz : 가상 메모리 사용량

커널 모듈에서 사용하는 메모리는 os 별로 다음과 같은 정보가 집계됩니다.

  • windows

    • 드라이버에서 'BS--' tag로 할당된 nonpaged, paged 메모리 사용량

  • linux

    • slab cache 정보

      • /sys/kernel/slab/bsr_req

      • /sys/kernel/slab/bsr_al

      • /sys/kernel/slab/bsr_bm

      • /sys/kernel/slab/bsr_ee

resync_ratio {resource} {vnr}

실시간 복제, 동기화 전송량과 이에 대한 동기화 전송 비율

동기화가 진행 중일때 소스 노드에서만 갱신됩니다.

 

명령어

bsrmon에서 제공하는 명령어 입니다.

 

/get

  • {all, period, file_size, file_cnt}

모니터링 주기, 저장할 파일 크기, 백업할 파일 개수를 조회하는 명령입니다.

 

/set

  • {period, file_size, file_cnt} {value}

모니터링 주기, 저장할 파일 크기, 백업할 파일 개수를 지정하는 명령입니다.

period 로 파일 저장과 모니터링 주기를 설정합니다. 초 단위로 설정하며 기본 값은 1초 입니다.

file_size 로 백업할 파일의 크기를 설정합니다. MB 단위로 설정하며 기본 값은 50MB 입니다.

file_cnt 로 백업할 파일 수를 설정합니다. 기본 값은 3개 입니다.

 

/start

성능 모니터 기능을 활성화 하고 성능 데이터 집계 및 파일 로깅을 시작합니다. 기본적으로 성능 모니터는 활성화 되어 있습니다.

성능모니터의 활성화는 다음의 과정을 통해 수행됩니다.

  • windows

    • HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\bsr\bsrmon_run 레지스트리 값 1로 설정

    • bsr 엔진의 성능데이터 집계 로직 활성화

    • bsrservice의 bsrmon /file 실행 로직 활성화

  • linux

    • /etc/bsr.d/.bsrmon_run 값을 1로 설정

    • bsr 엔진의 성능데이터 집계 로직 활성화

    • /lib/bsr/bsrmon-run 스크립트 실행. bsrmon /file 명령 주기적으로 실행

 

/stop

성능 모니터를 비활성화 합니다. 비활성화 시 엔진의 성능 데이터 집계 및 파일 로깅이 중단됩니다.

비활성화는 다음의 과정으로 수행합니다.

  • windows

    • HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\bsr\bsrmon_run 레지스트리 값 0으로 설정

    • bsr 엔진의 성능데이터 집계 로직 비활성화

    • bsrservice의 bsrmon /file 실행 로직 비활성화

  • linux

    • /etc/bsr.d/.bsrmon_run 값 0으로 설정

    • bsr 엔진의 성능데이터 집계 로직 비활성화

    • /lib/bsr/bsrmon-run 스크립트 종료

 

/status

성능 모니터의 동작 상태를 조회합니다.

 

/file

성능 데이터와 memory 정보를 파일로 저장합니다. 이것은 숨겨진 명령이며 bsrservice 와 bsrmon-run 스크립트에서 사용합니다.

파일 저장 위치는 다음과 같습니다.

  • windows : C:\Program Files\bsr\log\perfmon

  • linux : /var/log/bsr/perfmon/

데이터는 조회 시간과 각 항목별 수치만 저장되며, /show, /watch 또는 /report 명령 실행시 데이터 파싱 후 포멧에 맞춰 출력합니다.

 

/show

  • [/t {types[,...]|all}] [/r {resource[,...]|all}] [/j|/json] [/c|/continue]

전체 리소스에 대한 모든 항목의 성능 데이터를 한번에 출력합니다. 출력 대상은 성능 파일에 마지막으로 기록된 데이터입니다.

  • [/t {types[,...]|all}] [/r {resource[,...]|all}]

특정 성능 항목 및 리소스를 지정하여 출력할 수 있는 옵션을 제공합니다. 성능 항목 및 리소스 명은 ','로 구분하며 공백 없이 입력합니다.

  • [/j|/json]

json 형식으로 데이터를 출력합니다.

  • [/c|/continue]

성능 데이터를 주기적으로 출력합니다. 출력 주기는 bsrmon에 설정된 period 값을 따릅니다.

  • 사용 예

모든 리소스의 모든 항목 출력

모든 리소스의 특정 항목 출력

특정 리소스의 특정 항목 출력

 

/watch

  • {types} [/scroll]

types 별로 집계되고 있는 데이터를 실시간으로 출력합니다. /scroll 옵션 사용시 출력을 줄넘김 방식으로 표기합니다.

/report

  • {types} [/f {filename}] [/p {peer_name[,...]}] [/d {YYYY-MM-DD}] [/s {timestamp}] [/e {timestamp}]

types 별로 파일에 기록된 데이터(백업된 파일의 데이터 포함)의 통계를 출력합니다.

  • [/f {filename}]

리포팅 대상 파일 명을 입력합니다. 특정 파일의 통계 산출을 위해 사용됩니다.

  • [/p {peer_name[,...]}]

리포팅 대상 peer 의 이름을 입력합니다. 특정 peer의 통계 산출을 위해 사용합니다. 다중 peer 입력은 공백 없이 콤마(,)로 구분합니다. 미 입력시 서버에 구성된 리소스의 peer를 대상으로 통계를 출력합니다.

  • [/d {YYYY-MM-DD}] [/s {YYYY-MM-DD|hh:mm[:ss]|YYYY-MM-DD_hh:mm[:ss]}] [/e {YYYY-MM-DD|hh:mm[:ss]|YYYY-MM-DD_hh:mm[:ss]}]

특정 기간의 수치를 조회할 수 있는 옵션입니다. /d 옵션으로 해당 날짜에 기록된 데이터의 통계를 출력합니다. /s 는 조회 시작 날짜 및 시간을 지정합니다. /e 로 조회 종료 날짜 및 시간을 지정합니다. /s, /e 옵션 입력시 날짜와 시간은 언더바(_)로 구분합니다.

 

/io_delay_test

  • {flag} {delay point} {delay time}

I/O 성능 저하를 의도적으로 발생시켜 bsr 성능 모니터의 기능을 검증합니다. 개발자용 기능 입니다.

 

/debug cmds options

debugfs 정보를 조회하기 위한 windows 용 명령어입니다.