...
bsr 커널 엔진은 내부 시간(jiffies) 기록 코드를 통해 엔진이 동작했던 시점의 구간 별 시간 기록과 누적 계산치 등 성능 관련 통계정보를 파일 로그 형태로 유지합니다. bsrmon 유틸리티는 이러한 커널 엔진의 시간 정보를 커널로 요청하여 성능모니터 데이터를 취득하고 결과를 조회하는 기능을 제공합니다.
...
관리자는 이러한 커널 엔진의 통계 정보를 bsrmon 유틸리티로 조회하여 모니터링 할 수 있습니다.
bsrmon
기능
bsrmon이 제공하는 기능은 다음과 같습니다.
/start
성능 모니터를 활성화 합니다. 활성화 시 성능 데이터 집계 및 파일 로깅이 구동됩니다.
활성화 방식은 다음과 같습니다. 기본적으로 성능 모니터는 활성화 되어 있습니다.
/stop
성능 모니터를 비활성화 합니다. 비활성화 시 엔진의 성능 데이터 집계 및 파일 로깅이 중단됩니다.
비활성화 방식은 다음과 같습니다.
/status
성능 모니터의 동작 상태를 조회합니다.
/file
debugfs 로 제공되는 성능 데이터와 memory 정보를 파일로 저장합니다. 숨겨진 명령으로 bsrservice 와 bsrmon-run 스트립트에서 사용됩니다.
파일 저장 위치는 다음과 같습니다.
windows : C:\Program Files\bsr\log\perfmon
linux : /var/log/bsr/perfmon/
데이터는 조회 시간과 각 항목별 수치만 저장되며, /watch 또는 /report 명령 실행시 데이터 파싱 후 포멧에 맞춰 출력합니다.
Code Block |
---|
2021-07-20_05:55:21.443 955 955 244480 244480 1042 1042 266752 266752 |
/watch {types} [/scroll]
types 별로 집계되고 있는 데이터를 실시간으로 출력합니다.
/scroll 옵션 사용시 데이터를 스크롤하여 출력합니다.
/report {types} [/f {filename}] [/d {YYYY-MM-DD}] [/s {hh:mm[:ss]}] [/e {hh:mm[:ss]}]
types 별로 파일이 기록된 데이터의 통계를 출력합니다.
통계 수치 계산을 위한 samples 를 선정하는 기준은 다음과 같습니다.
기록된 성능 데이터가 있을 경우 (I/O가 발생하지 않아 0으로 기록된 성능 데이터 제외)
성능 데이터가 연속적으로 기록된 경우 (일시적으로 발생한 I/O에 대한 성능 데이터는 제외. I/O가 지속적으로 발생하고 있을 경우 통계 samples 로 선정)
ex) vnr0_IO_STAT
Code Block |
---|
2021-07-07_21:27:52.304 0 0 0 0 0 0 0 0 // 기록된 성능 데이터가 0이므로 samples에서 제외
2021-07-07_21:27:53.325 0 0 0 0 2 2 1 1 // 일시적인 I/O 성능 데이터로 samples에서 제외
2021-07-07_21:27:54.346 0 0 0 0 0 0 0 0
...
2021-07-07_21:30:28.549 0 0 0 0 408 408 104448 104448
2021-07-07_21:30:29.580 0 0 0 0 409 409 104704 104704 // 성능 데이터가 0이 아니고 연속적으로 기록되고 있음. samples로 선정
2021-07-07_21:30:30.605 0 0 0 0 404 404 103424 103424 |
[/f {filename}]
리포팅 대상 파일을 입력합니다. 백업된 파일의 데이터의 통계 계산을 위해 사용됩니다.
[/d {YYYY-MM-DD}] [/s {hh:mm[:ss]}] [/e {hh:mm[:ss]}]
특정 구간의 수치를 조회할 수 있는 옵션입니다.
/d : 해당 날짜에 기록된 데이터의 통계를 출력합니다. 미 입력 시 전체 기간에 대한 통계를 출력합니다.
/s : 해당 시간부터 기록된 데이터의 통계를 출력합니다. 미 입력 시 00:00:00 부터 기록된 데이터의 통계를 출력합니다.
/e : 해당 시간까지 기록된 데이터의 통계를 출력합니다. 미 입력 시 23:59:59까지 수집 된 데이터의 통계를 출력합니다.
/set {period, file_size, file_cnt} {value}
모니터링과 관련된 수치를 조정하는 명령입니다.
period
모니터링 및 파일 저장 주기를 설정합니다. 초 단위로 설정 가능하며 기본 값은 1초 입니다.
file_size
파일 롤링 사이즈를 설정합니다. MB 단위로 설정 가능하며 기본 값은 50MB 입니다.
file_cnt
파일 롤링 수를 설정합니다. 기본 값은 3개 입니다.
/io_delay_test {flag} {delay point} {delay time}
I/O 성능 저하를 의도적으로 발생시켜 bsr 성능 모니터의 기능을 검증하기 위한 보조 기능입니다. (참고 https://mantech.jira.com/wiki/spaces/B/pages/2873753766 )
/debug cmds options
debugfs 정보를 조회하기 위한 windows 용 명령어입니다. (참고 /wiki/spaces/B/pages/1719730206)
types
성능 모니터링 항목입니다.
iostat, ioclat, reqstat, peer_reqstat, alstat, network, sendbuf, memstat
iostat {resource} {vnr}
복제 볼륨의 read, write I/O 에 대한 집계 데이터 (iops, ios, kbs, kb)
Expand |
---|
|
Code Block |
---|
> bsrmon /watch iostat r0 0
2020-12-06_08:22:36.223
read : IOPS=0 (IOs=0), BW=0kb/s (0KB)
write: IOPS=216 (IOs=432), BW=110208kb/s (220416KB)
2020-12-06_08:22:37.640
read : IOPS=0 (IOs=0), BW=0kb/s (0KB)
write: IOPS=34 (IOs=34), BW=16896kb/s (16896KB)
2020-12-06_08:22:39.32
read : IOPS=0 (IOs=0), BW=0kb/s (0KB)
write: IOPS=326 (IOs=326), BW=155176kb/s (155176KB)
2020-12-06_08:22:40.106
read : IOPS=0 (IOs=0), BW=0kb/s (0KB)
write: IOPS=330 (IOs=330), BW=164624kb/s (164624KB)
... |
| → write I/O 가 지속적으로 발생하고 있는 상황 |
Code Block |
---|
> bsrmon /report iostat r0 0
Report r0 [IO STAT - vnr0]
Run: 2021-07-20_08:14:27.405 - 2021-08-04_18:59:53.573
read : ios=24855, bw=6325194kbyte
IOPS : min=10, max=1113, avg=972, samples=24
BW (kbyte/s): min=40, max=284928, avg=248578, samples=24
write: ios=8360345, bw=2139182512kbyte
IOPS : min=3, max=1568, avg=1252, samples=6670
BW (kbyte/s): min=12, max=401408, avg=320256, samples=6671 |
| → 2021-07-20_08:14:27.405 - 2021-08-04_18:59:53.573 기간 동안 집계된 데이터 → 24개의 read I/O samples. 평균 972 iops, 최소 10 iops, 최대 1113 iops로 측정됨 → 6670개의 write I/O samples. 평균 1252 iops, 최소 3 iops, 최대 1568 iops로 측정됨 |
Code Block |
---|
> bsrmon /report iostat r0 0 /f vnr0_IO_STAT_2021-07-20_081427.005
Report r0 [vnr0_IO_STAT_2021-07-20_081427.005]
Run: 2021-07-07_21:24:24.383 - 2021-07-20_08:14:26.371
read : ios=6332219, bw=1595360917kbyte
IOPS : min=1, max=1233, avg=980, samples=6452
BW (kbyte/s): min=4, max=428032, avg=247033, samples=6452
write: ios=22550577, bw=3961426883kbyte
IOPS : min=1, max=6478, avg=786, samples=28468
BW (kbyte/s): min=4, max=1085440, avg=138461, samples=28484 |
| → 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)
Expand |
---|
|
Code Block |
---|
> bsrmon /watch ioclat r0 0
2020-12-08_09:33:19.171
local clat (usec): min=520, max=112000, avg=10347
master clat (usec): min=610, max=256852, avg=28202
2020-12-08_09:33:20.351
local clat (usec): min=780, max=478387, avg=44316
master clat (usec): min=1499, max=492829, avg=114106
2020-12-08_09:33:21.509
local clat (usec): min=478, max=19805, avg=4523
master clat (usec): min=577, max=24335, avg=6303
... |
| → write I/O 가 지속적으로 발생하고 있는 상황 → local/master I/O가 완료되기 까지 소요된 시간의 최소, 최대, 평균값 출력 |
Code Block |
---|
> bsrmon /report ioclat r0 0
Report r0 [IO COMPLETE - vnr0]
Run: 2020-12-07_02:42:31.440 - 2020-12-08_09:37:44.115
local clat (usec): min=153, max=1635570, avg=8601, samples=50
master clat (usec): min=217, max=1667260, avg=21801, samples=50 |
| → 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 이 소요된 것으로 측정됨 |
|
reqstat {resource} {vnr}
request 생성 시점을 기준으로 특정 구간까지 소요된 시간에 대한 집계 데이터 (usec)
requests : 모니터링 기간(주기) 동안 처리된 request 갯수
before_queue :submit work queue에 큐잉되기 이전까지 소요된 시간
before_al_begin : act_log 의 lru를 얻기 전 까지 소요된 시간
in_actlog : RQ_IN_ACT_LOG 가 설정 되기까지 소요된 시간
pre_submit : request submit 이전까지 소요된 시간
post_submit : request submit 되기까지 소요된 시간
pre_send : peer로 data send 전까지 소요된 시간
acked : send 후 RQ_NET_PENDING이 제거 되기까지 소요된 시간
net_done : RQ_NET_DONE 까지 소요된 시간
destroy : request destroy 되기까지 소요된 시간
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() 실행 후
Expand |
---|
|
Code Block |
---|
> bsrmon /watch reqstat r0 0
2020-12-08_09:42:18.549
requests : 445
before_queue (usec): min=0, max=19, avg=0
before_al_begin (usec): min=0, max=4907, avg=11
in_actlog (usec): min=1, max=7191, avg=35
pre_submit (usec): min=3, max=7215, avg=46
post_submit (usec): min=4, max=7219, avg=50
destroy (usec): min=577, max=214980, avg=15711
al_uptate : 0
before_bm_write (usec): min=0, max=0, avg=0
after_bm_write (usec): min=0, max=0, avg=0
after_sync_page (usec): min=0, max=0, avg=0
PEER bsr03:
pre_send (usec): min=0, max=0, avg=0
acked (usec): min=0, max=0, avg=0
net_done (usec): min=0, max=0, avg=0
PEER 100.100.10.31:7792:
pre_send (usec): min=571, max=214862, avg=15703
acked (usec): min=555, max=210004, avg=7966
net_done (usec): min=575, max=214978, avg=15710
... |
| → write I/O 가 지속적으로 발생하고 있는 상황 → peer bsr03 과는 연결 단절 → al update는 수행되지 않음 |
Code Block |
---|
> bsrmon /report reqstat r0 0
Report r0 [REQUEST STAT - vnr0]
Run: 2020-12-06_05:46:36.678 - 2020-12-08_09:45:46.219
requests : total=38180
before_queue (usec): min=0, max=0, avg=0, samples=0
before_al_begin (usec): min=6966, max=460112, avg=4264, samples=2
in_actlog (usec): min=1, max=589946, avg=549, samples=28
pre_submit (usec): min=2, max=721793, avg=349, samples=72
post_submit (usec): min=3, max=589987, avg=579, samples=28
destroy (usec): min=83, max=2362749, avg=46380, samples=161
al_uptate : total=0
before_bm_write (usec): min=0, max=0, avg=0, samples=0
after_bm_write (usec): min=0, max=0, avg=0, samples=0
after_sync_page (usec): min=0, max=0, avg=0, samples=0
PEER 100.100.10.31:7792:
pre_send (usec): min=7, max=1667187, avg=22364, samples=161
acked (usec): min=11, max=1635581, avg=15737, samples=161
net_done (usec): min=82, max=2362749, avg=39406, samples=161
PEER bsr03:
pre_send (usec): min=0, max=0, avg=0, samples=0
acked (usec): min=0, max=0, avg=0, samples=0
net_done (usec): min=0, max=0, avg=0, samples=0 |
| → 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 갯수
pre_submit : peer request submit 이전까지 소요된 시간
post_submit : peer request가 submit 되기까지 소요된 시간
complete : peer request가 완료되기 까지 소요된 시간
Expand |
---|
|
Code Block |
---|
> bsrmon /watch peer_reqstat r0 0
2021-07-19_21:52:02.191
PEER bsr-03:
peer requests : 0
pre_submit (usec): min=0, max=0, avg=0
post_submit (usec): min=0, max=0, avg=0
complete (usec): min=0, max=0, avg=0
PEER bsr-02:
peer requests : 100
pre_submit (usec): min=421, max=6907, avg=2184
post_submit (usec): min=1021, max=7312, avg=2563
complete (usec): min=1739, max=7955, avg=3244 |
| → peer bsr-02 에 대한 100개의 peer request가 처리됨 → peer bsr-03 에 대한 peer request 는 발생하지 않음 |
Code Block |
---|
> bsrmon /report peer_reqstat r0 0
Report r0 [PEER REQUEST STAT - vnr0]
Run: 2021-07-11_22:23:08.890 - 2021-07-19_21:56:18.179
PEER bsr-02:
peer requests : total=344054
pre_submit (usec): min=1, max=36103, avg=99, samples=6902
post_submit (usec): min=1, max=116988, avg=96161, samples=9517
complete (usec): min=47, max=117495, avg=96340, samples=9518
PEER bsr-03:
peer requests : total=133288
pre_submit (usec): min=1, max=1670, avg=5, samples=6037
post_submit (usec): min=1, max=117000, avg=104660, samples=8708
complete (usec): min=63, max=125871, avg=104839, samples=8709 |
| → 2021-07-11_22:23:08.890 - 2021-07-19_21:56:18.179 기간동안 집계된 데이터 → submit 이 완료 되기까지 평균 0.1초 가량 소요되었음 |
|
alstat {resource} {vnr}
active log 의 사용 수치에 대한 집계 데이터
used 값, used 값의 최대값 집계
hits, misses, starving, locked, changed 증가 값 집계
al_wait retry 횟수 집계
al 부족 발생 원인 집계
starving, pending, used, busy, wouldblock
Expand |
---|
|
Code Block |
---|
> bsrmon /watch alstat r0 0
2021-08-04_19:10:11.463
used : 3/67 (max=8)
hits : 579 (total=2843)
misses : 2250 (total=17564)
starving: 0 (total=0)
locked : 0 (total=0)
changed : 749 (total=5854)
al_wait retry : 0 (total=0, max=0)
pending_changes : 1/64
error : 0
NOBUFS - starving : 0
- pending slot : 0
- used slot : 0
BUSY : 0
WOULDBLOCK : 0
flags : __LC_DIRTY __LC_LOCKED |
| → 해당 시점에 사용중인 al slot 은 3개 → pending 되어있는 al slot은 1개 → dirty, locked flag가 설정되어 있음 |
Code Block |
---|
> bsrmon /report alstat r0 0
Report r0 [AL STAT - vnr0]
Run: 2021-08-03_04:48:33.721 - 2021-08-03_22:47:28.326
al_extents : 6001
used : max=0(all_slot_used=0), avg=0
hits : total=0
misses : total=0
starving : total=0
locked : total=0
changed : total=0
al_wait retry count : max=0, total=0
pending_changes : max=0, total=0
error : total=0
NOBUFS - starving : total=0
- pending slot : total=0
- used slot : total=0
BUSY : total=0
WOULDBLOCK : total=0
-> al_extents changed
Run: 2021-08-03_22:47:52.895 - 2021-08-04_19:27:06.522
al_extents : 67
used : max=67(all_slot_used=59), avg=3
hits : total=337528
misses : total=2020409
starving : total=2
locked : total=0
changed : total=673370
al_wait retry count : max=2, total=501
pending_changes : max=64, total=258
error : total=1004
NOBUFS - starving : total=501
- pending slot : total=0
- used slot : total=503
BUSY : total=0
WOULDBLOCK : total=0 |
| → 2021-08-03_22:47:52.895 에 al_extents 값이 6001 에서 67 로 변경됨 → al이 67 개로 설정된 경우, 모든 al slot 을 사용한 횟수 59회, starving 상황 2회, al_wait retry 501 회 발생 |
|
network {resource}
복제 네트워크 송수신 속도 (byte/s)
Expand |
---|
|
Code Block |
---|
> bsrmon /watch network r0
2020-12-08_09:47:45.84
PEER 100.100.10.31:7792:
send (byte/s): 62932184
recv (byte/s): 4820
PEER bsr03:
send (byte/s): 0
recv (byte/s): 0
2020-12-08_09:47:46.160
PEER 100.100.10.31:7792:
send (byte/s): 104896568
recv (byte/s): 12320
PEER bsr03:
send (byte/s): 0
recv (byte/s): 0
... |
| → peer bsr03 과는 연결 단절된 상태 → peer 100.100.10.31:7792 로 데이터 전송이 진행되고 있는 중 |
Code Block |
---|
> bsrmon /report network r0
Report r0 [NETWORK SPEED]
Run: 2020-11-30_06:38:44.653 - 2020-12-08_09:53:31.455
PEER 100.100.10.31:7792: send=52497905byte/s, receive=5902byte/s
send (byte/s): min=3, max=115395016, avg=52497905, samples=392
recv (byte/s): min=3, max=15004, avg=5902, samples=367
PEER bsr03: send=0byte/s, receive=0byte/s
send (byte/s): min=0, max=0, avg=0, samples=0
recv (byte/s): min=0, max=0, avg=0, samples=0 |
| → 평균적으로 52.4 MB 의 데이터가 peer 100.100.10.31 노드로 전송되고 있음 |
|
sendbuf {resource}
송신버퍼 사용량 (bytes)
Expand |
---|
|
Code Block |
---|
> bsrmon /watch sendbuf r0
2020-12-08_09:54:13.735
PEER 100.100.10.31:7792:
data stream
size (bytes): 10485761
used (bytes): 204920
[P_RS_DATA_REPLY] - cnt: 3 size: 209016 bytes
control stream
size (bytes): 5242881
used (bytes): 0
PEER bsr03:
data stream
size (bytes): 10485761
used (bytes): 0
control stream
size (bytes): 5242881
used (bytes): 0
... |
| → peer 100.100.10.31:7792, bsr03 에 송신버퍼가 할당되어 있음 → peer bsr03 과는 연결 단절된 상태 → peer 100.100.10.31:7792 로 데이터 전송이 진행되고 있는 중 |
Code Block |
---|
> bsrmon /report sendbuf r0
Report r0 [SEND BUFFER]
Run: 2020-12-05_13:26:59.969 - 2020-12-08_09:56:33.718
PEER 100.100.10.31:7792: data stream size=10485761byte, control stream size=5242881byte
data-used (bytes): min=2097232, max=7603084, avg=4787174, samples=5
cntl-used (bytes): min=0, max=0, avg=0, samples=0
PEER bsr03: data stream size=10485761byte, control stream size=5242881byte
data-used (bytes): min=0, max=0, avg=0, samples=0
cntl-used (bytes): min=0, max=0, avg=0, samples=0 |
| → 평균적으로 10MB 중 4.7MB 의 버퍼가 사용되고 있음 |
|
memstat
유저 및 모듈에서 사용하는 메모리 사용량
유저 공간에서는 bsradm, bsrsetup, bsrcon, bsrmon, bsrservice 프로세스가 사용하는 메모리가 집계됩니다.
windows
linux
ps 명령을 통해 획득한 메모리 정보
rsz : 물리 메모리 사용량
vsz : 가상 메모리 사용량
모듈에서는 사용하는 메모리는 os 별로 다음과 같은 정보가 집계됩니다.
windows
linux
slab cache 정보
/sys/kernel/slab/bsr_req
/sys/kernel/slab/bsr_al
/sys/kernel/slab/bsr_bm
/sys/kernel/slab/bsr_ee
Expand |
---|
|
Code Block |
---|
> bsrmon /watch memstat
2020-12-08_09:57:27.171
module (bytes)
BSR_REQ : 16334336
BSR_AL : 803760
BSR_BM : 4161536
BSR_EE : 2782560
user (kbytes)
name pid rsz vsz
bsrmon 29304 1192 12724
bsrmon 37474 1200 12720
bsrmon 112177 1192 12724
bsrmon 113913 1068 12724
bsrmon 113978 1308 12728 |
| → bsrmon 프로세스가 여러개 실행되고 있는 상태. 종료되지 않은 bsrmon 프로세스가 존재 |
Code Block |
---|
> bsrmon /report memstat
Report [MEMORY]
Run: 2020-12-06_19:04:12.177 - 2020-12-08_09:59:17.716
module (bytes)
BSR_REQ: 16303104 - 16459264
BSR_AL : 803760
BSR_BM : 4063232 - 5271552
BSR_EE : 2782560
user (kbytes)
name rsz vsz
bsradm 0 0
bsrsetup 0 0
bsrmeta 0 0
bsrmon 1068 - 1368 12720 - 12732 |
| → 2020-12-06_19:04:12.177 - 2020-12-08_09:59:17.716 기간동안 수집된 데이터의 메모리 사용량 범위 출력 → BSR_REQ 는 16303104 ~ 16459264 bytes 사용됨 → 유저 공간에서 bsrmon 이외에는 수집된 데이터가 없는 것으로 보아, cli 명령들이 1초 이내에 수행 완료 되었음을 알 수 있다. |
|