개요
bsrmon 은 복제를 수행하는 bsr 엔진의 전체 복제 과정을 추적하고 엔진의 로직 구간별 소요 시간을 실시간 기록하여 엔진 동작의 병목을 파악할 수 있는 성능 모니터링 도구 입니다. bsr 커널 엔진은 내부 시간(jiffies) 기록 코드를 기록을 통해 엔진이 동작했던 시점의 구간 별 시간 기록과 누적 계산치 등 성능 관련 통계정보를 파일 로그 형태로 유지합니다. 관리자는 이러한 이 커널 엔진의 통계 정보를 bsrmon 유틸리티로 조회하여 모니터링 할 수 있습니다. bsrmon 은 1.6.1 버전 부터 지원합니다지원하며 기본 활성화 되어 있습니다.
Info |
---|
linux 환경에서는 debugfs 기능이 활성화 된 커널에서만 성능모니터 기능을 사용할 수 있으며, debugfs 가 /sys/kernel/debug 경로에 마운트되어 있어야 합니다. debugfs 기능 활성화는 다음 명령을 사용하여 확인할 수 있습니다. Code Block |
---|
# grep CONFIG_DEBUG_FS /boot/config-`uname -r`
CONFIG_DEBUG_FS=y |
debugfs는 CentOS7 버전부터 자동 마운트되며, CentOS6 버전대에서는 자동 마운트되지 않기 때문에 /sys/kernel/debug 경로에 마운트 이후 성능모니터 기능을 사용할 수 있습니다. 시스템 재부팅 이후에서도 성능 모니터 기능을 사용하고자 한다면 fstab에 해당 마운트 경로를 등록해주어야 합니다. Code Block |
---|
# mkdir /sys/kernel/debug
# mount -t debugfs debugfs /sys/kernel/debug |
|
기능
bsrmon이 제공하는 기능은 다음과 같습니다.
/start
성능 모니터 기능을 활성화 하고 성능 데이터 집계 및 파일 로깅을 시작합니다. 기본적으로 성능 모니터는 활성화 되어 있습니다.
성능모니터의 활성화는 다음의 과정을 통해 수행됩니다.
/stop
성능 모니터를 비활성화 합니다. 비활성화 시 엔진의 성능 데이터 집계 및 파일 로깅이 중단됩니다.
비활성화는 다음의 과정으로 수행합니다.
/status
성능 모니터의 동작 상태를 조회합니다.
/file
성능 데이터와 memory 정보를 파일로 저장합니다. 이것은 숨겨진 명령이며 bsrservice 와 bsrmon-run 스크립트에서 사용합니다.
파일 저장 위치는 다음과 같습니다.
windows : C:\Program Files\bsr\log\perfmon
linux : /var/log/bsr/perfmon/
데이터는 조회 시간과 각 항목별 수치만 저장되며, /show, /watch 또는 /report 명령 실행시 데이터 파싱 후 포멧에 맞춰 출력합니다.
Code Block |
---|
2021-07-20_05:55:21.443 955 955 244480 244480 1042 1042 266752 266752 |
/show [/t {types[,...]|all}] [/r {resource[,...]|all}] [/j|/json] [/c|/continue]
전체 리소스에 대한 모든 항목의 성능 데이터를 한번에 출력합니다.
출력 대상은 성능 파일에 마지막으로 기록된 데이터입니다.
[/t {types[,...]|all}] [/r {resource[,...]|all}]
특정 성능 항목 및 리소스를 지정하여 출력할 수 있는 옵션을 제공합니다.
성능 항목 및 리소스 명은 ','로 구분하며 공백 없이 입력합니다.
[/j|/json]
json 형식으로 데이터를 출력합니다.
[/c|/continue]
성능 데이터를 주기적으로 출력합니다.
출력 주기는 bsrmon에 설정된 period 값을 따릅니다.
사용 예
...
memory, resource 별로 timestamp 가 출력됩니다.
iostat, ioclat, reqstat, peer_reqstat, al_stat, resync_ratio 는 vnr 로 구분하여 출력됩니다.
memory 성능 데이터는 os(windows/linux)에 따라 출력되는 항목이 다릅니다.
...
...
유형
성능 측정의 대상 유형 입니다. bsrmon 의 types 인자에 해당합니다.
iostat, ioclat, reqstat, peer_reqstat, alstat, network, sendbuf, memstat
iostat {resource} {vnr}
복제 볼륨의 읽기, 쓰기 I/O 에 대한 집계 데이터 (io count, kbs, kb)
Expand |
---|
|
Code Block |
---|
> 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 가 지속적으로 발생하고 있는 상황 |
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 : io count=24855, bw=6325194kbyte
BW (kbyte/s): min=40, max=284928, avg=248578, samples=24
write: io count=8360345, bw=2139182512kbyte
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. 평균 248, 최소 40, 최대 284 Mbytes/s 의 IO 가 처리됨 → 6670개의 write I/O samples. 평균 320, 최소 12, 최대 401 Mbytes/s 의 IO 가 처리됨 |
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 이 소요된 것으로 측정됨 |
|
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
Expand |
---|
|
Code Block |
---|
> bsrmon /watch io_pending r0 0
2023-03-20_11:47:20.577
upper_pending : 32
pending_latency (usec): 3506
lower_pending : 48
al_suspended : 0
al_pending_changes: 0
al_wait_req : 0
upper_blocked : 0
suspended : 0
|
|
vsz4082020;#kbytes}bsr_process {
name bsrmon;
pending_bitmap_work: 0
... |
| → 완료 대기중인 IO 는 32개 → 현재 IO가 완료되기까지 3505usec 의 지연 발생 → upper_blocked 는 0 으로 IO block 상태가 아님 → 정상적으로 복제가 진행되고 있는 상황으로 간주할 수 있음 |
Code Block |
---|
> bsrmon /report io_pending r0 0 /d 2023-03-20
Report r0 [IO_PENDING - vnr0]
file C:\Program Files\bsr\log\perfmon\r0\vnr0_IO_PENDING
Run: 2023-03-20_00:00:00.359 - 2023-03-20_12:01:34.528
upper_pending : max=33
pending_latency (usec): min=96, max=1000521, |
|
pidavg=7380, samples=27211
lower_pending |
|
19370; : max=412
al_suspended : total=0
|
|
rsz al_pending_changes: max=1
al_wait_req |
|
1364;#kbytes : max=4
upper_blocked : total=58
|
|
vsz12780;#kbytes}}timestamp2022-10-04_00:10:55.805; }
resource r0 {
vnr 0 {
iostat {
read_iops 0;
read_iocnt 0;
read_kbs 0; # kbytes/second
read_kb 0; # kbytes
write_iops 0;
write_iocnt 0;
write_kbs 0; # kbytes/second
write_kb 0; # kbytes
}
ioclat {
local_min 0; # usec
local_max 0; # usec
local_avg 0; # usec
master_min 0; # usec
master_max 0; # usec
master_avg 0; # usec
}
reqstat {
: total=0
pending_bitmap_work: total=58 |
| → 최대 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() 실행 후
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
submit (usec): min=3, max=7215, avg=46
bio_endio (usec): min=4, max=7219, avg=50
destroy (usec): min=577, max=214980, avg=15711
|
|
requests{al_uptate : 0
before_bm_write (usec): min=0, max=0, avg=0
|
|
count 0;(usec): min=0, max=0, avg=0
after_sync_page (usec): min=0, max=0, avg=0
PEER bsr03:
|
|
before_queue_min 0; # usec
pre_send (usec): min=0, max=0, avg=0
acked (usec): min=0, max=0, avg=0
net_done |
|
before_queue_max 0; # usec
(usec): min=0, max=0, avg=0
PEER 100.100.10.31:7792:
pre_send (usec): min=571, max=214862, avg=15703
acked |
|
before_queue_avg(usec): min=555, max=210004, avg=7966
|
|
0;#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 - |
|
before_al_begin_min 0; # usec
2020-12-08_09:45:46.219
requests : total=38180
before_queue (usec): |
|
min=0, max=0, avg=0, samples=0
before_al_begin |
|
_max 0; # usec
(usec): min=6966, max=460112, avg=4264, samples=2
in_actlog (usec): min=1, max=589946, avg=549, |
|
before_al_begin_avg 0; # usec
samples=28
submit (usec): min=2, max=721793, avg=349, samples=72
|
|
in_actlog_min0; # usec
(usec): min=3, max=589987, avg=579, samples=28
destroy (usec): |
|
in_actlog_max min=83, max=2362749, avg=46380, samples=161
al_uptate : total=0 |
|
;#usec before_bm_write (usec): min=0, max=0, avg=0, samples=0
|
|
in_actlog_avg 0; # usec
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 |
|
submit_min 0; # usec(usec): min=7, max=1667187, avg=22364, samples=161
acked (usec): min=11, max=1635581, avg=15737, samples=161
|
|
submit_max 0; # usec
net_done (usec): min=82, max=2362749, avg=39406, samples=161
PEER bsr03:
pre_send (usec): min=0, |
|
submit_avg 0; # usecmax=0, avg=0, samples=0
acked (usec): min=0, max=0, avg=0, samples=0
|
|
bio_endio_min 0; # usec
bio_endio_max 0; # usec
bio_endio_avg 0; # usec
destroy_min 0; # usec
destroy_max 0; # usec
destroy_avg 0; # usec
}
al_update {
count 0;
before_bm_write_min 0; # usec
before_bm_write_max 0; # usec
before_bm_write_avg 0; # usec
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 갯수
submit : peer request submit 이 실행 되기까지 소요된 시간
bio_endio : peer request 의 bio 완료 로직이 실행 되기까지 소요된 시간
destroy : peer request가 해제 되기까지 소요된 시간
Expand |
---|
|
Code Block |
---|
> bsrmon /watch peer_reqstat r0 0
2021-07-19_21:52:02.191
PEER bsr-03:
peer requests : 0
submit (usec): min=0, max=0, avg=0
bio_endio (usec): min=0, max=0, avg=0
destroy (usec): min=0, max=0, avg=0
PEER bsr-02:
peer requests : 100
submit (usec): min=421, max=6907, avg=2184
bio_endio (usec): min=1021, max=7312, avg=2563
destroy (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
submit (usec): min=1, max=36103, avg=99, samples=6902
bio_endio (usec): min=1, max=116988, avg=96161, samples=9517
destroy (usec): min=47, max=117495, avg=96340, samples=9518
PEER bsr-03:
peer requests : total=133288
submit (usec): min=1, max=1670, avg=5, samples=6037
bio_endio (usec): min=1, max=117000, avg=104660, samples=8708
destroy (usec): min=63, max=125871, avg=104839, samples=8709 |
| → 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
Expand |
---|
|
Code Block |
---|
> bsrmon /watch alstat r0 0
2021-08-04_19:10:11.463
used : |
|
after_bm_write_min 0; # usec3/67 (max=8)
hits : 579 (total=2843)
misses : |
|
after_bm_write_max0;# usec2250 (total=17564)
starving: 0 (total=0)
locked : |
|
after_bm_write_avg0;#usec 0 (total=0)
changed : 749 (total=5854)
|
|
after_sync_page_min 0; # usecal_wait retry : 0 (total=0, max=0)
pending_changes : 1/64
error |
|
after_sync_page_max;#usec after_sync_page_avg;#usec} BUSY : 0
WOULDBLOCK : 0
flags |
|
peercent7903 {
pre_send_min | → 해당 시점에 사용중인 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 |
|
0;#usec : max=0(all_slot_used=0), avg=0
hits : total=0
misses |
|
pre_send_max0;#usectotal=0
locked : total=0
changed : total=0
|
|
pre_send_avg al_wait retry count : max=0, total=0
|
|
0;#usec : max=0, total=0
error : total=0
NOBUFS |
|
acked_min0;#usec : total=0
- pending slot : total=0
|
|
acked_max0;#usecacked_avg0;#usec : total=0
WOULDBLOCK : total=0
-> al_extents changed
|
|
net_done_minRun: 2021-08-03_22:47:52.895 - 2021-08-04_19:27:06.522
al_extents : 67
|
|
0;#usec net_done_max : max=67(all_slot_used=59), avg=3
hits |
|
0;#usec : total=337528
misses : total=2020409
starving : total=2
|
|
net_done_avg ;#usec changed : total=673370
al_wait retry count : max=2, total=501
|
|
} pending_changes : max=64, total=258
|
|
} error : total=1004
NOBUFS |
|
peer_reqstat{peercent79_03{ - pending slot : total=0
- used |
|
count0; BUSY : total=0
WOULDBLOCK |
|
submit_min 0; # usec
| → 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 |
|
submit_max 0; # usec
(byte/s): 4820
PEER bsr03:
send (byte/s): 0
recv (byte/s): |
|
submit_avg 0; # usec0
2020-12-08_09:47:46.160
PEER 100.100.10.31:7792:
send (byte/s): 104896568
recv (byte/s): 12320
PEER bsr03:
|
|
bio_endio_min 0; # usecsend (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]
|
|
bio_endio_maxRun: 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
|
|
0;#usec send (byte/s): min=3, max=115395016, avg=52497905, samples=392
recv (byte/s): |
|
bio_endio_avg min=3, max=15004, avg=5902, samples=367
PEER bsr03: |
|
0; # usecsend=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 |
|
destroy_min 0; # usec
sendbuf r0
2020-12-08_09:54:13.735
PEER 100.100.10.31:7792:
highwater: 11246, fill: 37094400bytes
|
|
destroy_max 0; # usecap_in_flight: 8881 (9094144bytes)
rs_in_flight: 2365 (28000256bytes)
data stream
|
|
destroy_avg0;#usec size (bytes): 10485760000
used (bytes): 27098576
|
|
}} size: 8024616bytes
[P_RS_DATA_REPLY] |
|
al_stat{ cnt: 1596 size: 18942304bytes
[P_BARRIER] |
|
alextents6001;13176bytes
[P_UNPLUG_REMOTE] - cnt: 7406 |
|
al_used 0;size: 118496bytes
control stream
size |
|
al_used_max0; used (bytes): 0
PEER bsr03:
highwater: 0, |
|
hits0;hits_total 2064; data stream
size (bytes): 10485761
|
|
misses0; used (bytes): 0
control stream
|
|
misses_total 1998;
size (bytes): 5242881
used (bytes): 0
... |
| → peer 100.100.10.31:7792, bsr03 에 송신버퍼가 할당되어 있음 → peer bsr03 과는 연결 단절된 상태 → peer 100.100.10.31:7792 로 데이터 전송이 진행되고 있는 중 → peer 100.100.10.31:7792 에 계류중인 복제 및 동기화 데이터 갯수는 11246 개 (복제 데이터 8881개, 동기화 데이터 2365개) |
Code Block |
---|
> bsrmon /report sendbuf |
|
starvingr0
Report r0 [SEND BUFFER]
Run: |
|
0;
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
|
|
starving_total0; data-used (bytes): min=2097232, max=7603084, avg=4787174, samples=5
cntl-used (bytes): min=0, max=0, |
|
locked 0;avg=0, samples=0
highwater: min=1, max=8014, avg=760, samples=999
PEER bsr03: data stream |
|
locked_total 0;size=10485761byte, control stream size=5242881byte
data-used (bytes): min=0, max=0, avg=0, samples=0
|
|
changed 0;
changed_total 249;
al_wait_retry_cnt 0;
al_wait_total_retry_cnt 0;
al_wait_max_retry_cnt 0;
pending_changes 0;
max_pending_changes 64;
error {
nobufs_starving 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 |
|
nobufs_pending_slot0;nobufs_used_slot0;busy0;wouldblock0;}flags __LC_DIRTY,__LC_LOCKED;
}
| → 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 |
|
resync_ratio{peercent7902{: 4063232 - 5271552
BSR_EE : 2782560 |
|
replication 0;#byte/secondresync 0;#byte/secondresync_ratio 0; # percent
}peercent79_03{replication 0;#byte/second resync ;#byte/secondresync_ratio ;#percent} }
vnr 1 {
iostat {
read_iops ;read_iocnt;read_kbs0;#kbytes/secondread_kb0;#kbytes write_iops 0;
write_iocnt 0;
write_kbs 0; # kbytes/second
write_kb 0; # kbytes
}
ioclat {
local_min 0; # usec
local_max 0; # usec
local_avg 0; # usec
master_min 0; # usec
master_max 0; # usec
master_avg 0; # usec
}
reqstat {
requests {
count 0;
before_queue_min 0; # usec
before_queue_max 0; # usec
before_queue_avg 0; # usec
before_al_begin_min 0; # usec
before_al_begin_max 0; # usec
before_al_begin_avg 0; # usec
in_actlog_min 0; # usec
in_actlog_max 0; # usec
| → 2020-12-06_19:04:12.177 - 2020-12-08_09:59:17.716 기간동안 수집된 데이터의 메모리 사용량 범위 출력 → BSR_REQ 는 16303104 ~ 16459264 bytes 사용됨 → 유저 공간에서 bsrmon 이외에는 수집된 데이터가 없는 것으로 보아, cli 명령들이 1초 이내에 수행 완료 되었음을 알 수 있다. |
|
resync_ratio {resource} {vnr}
실시간 복제, 동기화 전송량과 이에 대한 동기화 전송 비율
동기화가 진행 중일때 소스 노드에서만 갱신됩니다.
Expand |
---|
|
Code Block |
---|
> bsrmon /watch resync_ratio r0 0
2022-04-12_15:34:52.206
svr06
replcation(144100kb)/resync(18508kb), resync ratio 11% |
| → 연결되어있는 svr06 노드에 초당 복제 데이터가 144100kb, 동기화 데이터가 18508kb 전송되었으며 이에 대한 동기화 전송 비율은 11%입니다. |
|
명령어
bsrmon에서 제공하는 명령어 입니다.
/get
{all, period, file_size, file_cnt}
모니터링 주기, 저장할 파일 크기, 백업할 파일 개수를 조회하는 명령입니다.
Code Block |
---|
# bsrmon /get all
period : 1 sec
file_size : 50 MB
file_cnt : 3 |
/set
{period, file_size, file_cnt} {value}
모니터링 주기, 저장할 파일 크기, 백업할 파일 개수를 지정하는 명령입니다.
period 로 파일 저장과 모니터링 주기를 설정합니다. 초 단위로 설정하며 기본 값은 1초 입니다.
file_size 로 백업할 파일의 크기를 설정합니다. MB 단위로 설정하며 기본 값은 50MB 입니다.
file_cnt 로 백업할 파일 수를 설정합니다. 기본 값은 3개 입니다.
/start
성능 모니터 기능을 활성화 하고 성능 데이터 집계 및 파일 로깅을 시작합니다. 기본적으로 성능 모니터는 활성화 되어 있습니다.
성능모니터의 활성화는 다음의 과정을 통해 수행됩니다.
/stop
성능 모니터를 비활성화 합니다. 비활성화 시 엔진의 성능 데이터 집계 및 파일 로깅이 중단됩니다.
비활성화는 다음의 과정으로 수행합니다.
/status
성능 모니터의 동작 상태를 조회합니다.
/file
성능 데이터와 memory 정보를 파일로 저장합니다. 이것은 숨겨진 명령이며 bsrservice 와 bsrmon-run 스크립트에서 사용합니다.
파일 저장 위치는 다음과 같습니다.
windows : C:\Program Files\bsr\log\perfmon
linux : /var/log/bsr/perfmon/
데이터는 조회 시간과 각 항목별 수치만 저장되며, /show, /watch 또는 /report 명령 실행시 데이터 파싱 후 포멧에 맞춰 출력합니다.
Code Block |
---|
2021-07-20_05:55:21.443 955 955 244480 244480 1042 1042 266752 266752 |
/show
[/t {types[,...]|all}] [/r {resource[,...]|all}] [/j|/json] [/c|/continue]
전체 리소스에 대한 모든 항목의 성능 데이터를 한번에 출력합니다. 출력 대상은 성능 파일에 마지막으로 기록된 데이터입니다.
[/t {types[,...]|all}] [/r {resource[,...]|all}]
특정 성능 항목 및 리소스를 지정하여 출력할 수 있는 옵션을 제공합니다. 성능 항목 및 리소스 명은 ','로 구분하며 공백 없이 입력합니다.
json 형식으로 데이터를 출력합니다.
성능 데이터를 주기적으로 출력합니다. 출력 주기는 bsrmon에 설정된 period 값을 따릅니다.
모든 리소스의 모든 항목 출력
Expand |
---|
|
memory, resource 별로 timestamp 가 출력됩니다. iostat, ioclat, reqstat, peer_reqstat, al_stat, resync_ratio 는 vnr 로 구분하여 출력됩니다. memory 성능 데이터는 os(windows/linux)에 따라 출력되는 항목이 다릅니다.
Code Block |
---|
[root@cent79_01 bsr-utils]# bsrmon /show
bsrmon {
memory {
system {
in_actlog_avgtotal_memory 07990028; # useckbytes
used_memory 1843756; # kbytes
submit_min 0; # usec free_memory 2511096; # kbytes
submit_maxbuff/cache 03635176; # useckbytes
}
module {
submit_avg 0; # usec slab {
bio_endio_min bsr_req 15982; # kbytes
0; # usec bsr_al 1020; # kbytes
bio_endio_max 0; # usec bsr_bm 7880; # kbytes
bio_endio_avg bsr_ee 02384; # useckbytes
total_bio_set destroy_min 0520; # useckbytes
kmalloc 157; # kbytes
destroy_max 0; # usec }
vmalloc destroy_avg 0; # useckbytes
total_page_pool } 33344; # kbytes
}
al_updateuser {
top_process {
count name 0gnome-shell;
pid before_bm_write_min 0 2482;
# usec rsz before_bm_write_max 0250212; # useckbytes
vsz before_bm_write_avg 0 4082020; # useckbytes
}
after_bm_write_min 0; # usec bsr_process {
name after_bm_write_max 0bsrmon;
# usec pid after_bm_write_avg 019370;
# usec rsz after_sync_page_min 01364; # useckbytes
vsz after_sync_page_max 012780; # useckbytes
}
after_sync_page_avg 0; # usec }
timestamp 2022-10-04_00:10:55.805;
}
} resource r0 {
vnr 0 {
peer cent79_03 { iostat {
pre_send_min 0; # usecread_iops 0;
preread_send_maxiocnt 0; #
usec pre_send_avgread_kbs 0; # useckbytes/second
acked_min read_kb 0; # useckbytes
write_iops acked_max 0; #
usec write_iocnt acked_avg 0;
# usec net_done_minwrite_kbs 0; # useckbytes/second
write_kb net_done_max 0; # kbytes
0; # usec }
net_done_avgioclat {
0; # usec local_min 0; # usec
} } local_max 0; # usec
peer_reqstat { local_avg peer cent79_03 { 0; # usec
count master_min 0; # usec
master_max submit_min 0; # usec
master_avg submit_max 0; # usec
}
submit_avg 0; # usec reqstat {
requests {
bio_endio_min 0; # usec bio_endio_maxcount 0;
# usec biobefore_endioqueue_avgmin 0; # usec
destroy_minbefore_queue_max 0; # usec
destroy_maxbefore_queue_avg 0; # usec
destroy_avgbefore_al_begin_min 0; # usec
} before_al_begin_max 0; # usec
} before_al_stat {
begin_avg 0; # usec
al-extents 6001;in_actlog_min 0; # usec
al_used 0; al_usedin_actlog_max 0; # usec
hits 0; in_actlog_avg 0; # usec
hits_total 0; submit_min 0; # usec
misses 0; missessubmit_totalmax 0; # usec
starving submit_avg 0; # usec
starving_total 0; bio_endio_min 0; # usec
locked 0; bio_endio_max locked_total 0; # usec
changed 0; bio_endio_avg 0; # usec
changed_total 0; al_wait_retry_cnt destroy_min 0; # usec
0; al_wait_total_retry_cntdestroy_max 0; # usec
al_wait_max_retry_cnt destroy_avg 0; # usec
pending_changes 0; }
max_pending_changesal_update {
64; count error { 0;
nobufs_starving before_bm_write_min 0; # usec
nobufs_pending_slot before_bm_write_max 0; # usec
nobufs_used_slot before_bm_write_avg 0; # usec
busy after_bm_write_min 0; # usec
0; after_bm_write_max wouldblock 0; # usec
} after_bm_write_avg 0; # usec
flags NONE; after_sync_page_min 0; }# usec
resync_ratio { after_sync_page_max 0; # usec
peer cent79_02 { replication after_sync_page_avg 0; # usec
byte/second }
resync 0; # byte/second peer cent79_03 {
resync_ratio 0; # percent pre_send_min } 0; # usec
peer cent79_03 { pre_send_max 0; # usec
replication 0; # byte/second pre_send_avg resync 0; # byte/secondusec
resync_ratio acked_min 0; # percentusec
} acked_max 0; # usec
} network { acked_avg peer cent79_02 {0; # usec
send 180; # byte/secondnet_done_min 0; # usec
recv 384; # byte/second net_done_max } 0; # usec
peer cent79_03 { net_done_avg send 0; # byte/secondusec
recv 0; # byte/second}
}
} peer_reqstat {
sendbuf { peer cent79_0203 {
ap_in_flight { count 0;
size 17301504; # bytessubmit_min 0; # usec
count submit_max 330; # usec
} submit_avg 0; # usec
rs_in_flight { bio_endio_min 0; size# usec
0; # bytes bio_endio_max 0; # countusec
0; bio_endio_avg } 0; # usec
highwater 33; destroy_min 0; # usec
fill 17301504; # bytes destroy_max 0; # usec
data_stream { destroy_avg 0; # usec
size 20971520; #}
bytes }
used al_stat {
0; # bytes al-extents 6001;
packet { al_used 0;
name P_DATA al_used_max 0;
hits count 10;
hits_total 2064;
size 0; # bytes misses 0;
} misses_total 1998;
} starving control_stream { 0;
starving_total 0;
size 5242880; # bytes locked 0;
used locked_total 0;
# bytes changed 0;
} } changed_total 249;
peer cent79_03 { al_wait_retry_cnt 0;
ap_in_flight { al_wait_total_retry_cnt 0;
size 0; # bytes al_wait_max_retry_cnt 0;
pending_changes count0;
0; max_pending_changes 64;
} error {
rs_in_flight { nobufs_starving size 0;
0; # bytes nobufs_pending_slot 0;
count 0; nobufs_used_slot 0;
} busy highwater 0;
fill wouldblock 0;
# bytes }
data_stream { flags __LC_DIRTY,__LC_LOCKED;
size 20971520; #}
bytes resync_ratio {
used 0; #peer bytescent79_02 {
} replication 0; # byte/second
control_stream { resync 0; # byte/second
size 5242880resync_ratio 0; # bytespercent
}
used 0; # bytes peer cent79_03 {
} replication 0; # byte/second
} } timestamp 2022-09-29_22:54:25.064 resync 0; # byte/second
} resource r1 { ... resync_ratio 0; # percent
timestamp 2022-10-04_00:10:55.805; } } |
|
Expand |
---|
title | bsrmon /show /t iostat |
---|
|
Code Block |
---|
[root@cent79_01 bsr-utils]# bsrmon /show /t iostat}
bsrmon
{ resource r0 { }
vnr 01 {
iostat {
read_iops 0;
read_iocnt 0;
read_kbs 0; # kbytes/second
read_kb 0; # kbytes
write_iops 0;
write_iocnt 0;
write_kbs 0; # kbytes/second
write_kb 0; # kbytes
}
} ioclat {
vnr 1 { local_min iostat {0; # usec
readlocal_iopsmax 0; # usec
read_iocnt local_avg 0; # usec
read_kbs master_min 0; # kbytes/secondusec
read_kbmaster_max 0; # kbytesusec
writemaster_iopsavg 0; # usec
}
write_iocnt 0; reqstat {
write_kbs requests {
0; # kbytes/second write_kb count 0;
# kbytes } before_queue_min } 0; # usec
timestamp 2022-09-29_22:54:25.064; } resource r1 { before_queue_max 0; # usec
vnr 0 { iostat { before_queue_avg 0; # usec
read_iops before_al_begin_min 0; # usec
read_iocnt before_al_begin_max 0; # usec
read_kbs before_al_begin_avg 0; # kbytes/secondusec
read_kbin_actlog_min 0; # usec
kbytes write_iopsin_actlog_max 0; # usec
write_iocnt in_actlog_avg 0; # usec
write_kbs submit_min 0; # kbytes/secondusec
write_kb submit_max 0; # usec
kbytes } submit_avg }0; # usec
timestamp 2022-10-04_00:17:52.249; }
} |
|
Expand |
---|
title | bsrmon /show /t network,sendbuf /r r0,r1 |
---|
|
Code Block |
---|
[root@cent79_01 bsr-utils]# bsrmon /show /t network,sendbuf /r r0,r1
bsrmon { bio_endio_min 0; # usec
resource r0 { networkbio_endio_max { 0; # usec
peer cent79_02 { bio_endio_avg send 1800; # byte/secondusec
recv 384destroy_min 0; # byte/secondusec
} destroy_max 0; # usec
peer cent79_03 { send destroy_avg 0; # byte/secondusec
recv}
0; # byte/second al_update {
} } sendbuf { count 0;
peer cent79_02 { before_bm_write_min 0; # ap_in_flightusec
{ size before_bm_write_max 0; # usec
17301504; # bytes before_bm_write_avg 0; # usec
count 33; after_bm_write_min 0; # usec
} rsafter_bm_inwrite_flightmax { 0; # usec
size after_bm_write_avg 0; # bytesusec
count after_sync_page_min 0; # usec
0; }
after_sync_page_max 0; # usec
highwater 33after_sync_page_avg 0; # usec
fill }
17301504; # bytes peer data_streamcent79_03 {
sizepre_send_min 209715200; # bytesusec
usedpre_send_max 0; # bytesusec
packetpre_send_avg { 0; # usec
name Packed_DATAmin 0; # usec
countacked_max 10; # usec
acked_avg size 0; # bytesusec
}net_done_min 0; # usec
} control_stream {net_done_max 0; # usec
size 5242880; # bytes net_done_avg 0; # usec
used }
0; # bytes }
} peer_reqstat {
} peer cent79_03 {
ap_in_flight { count 0;
size submit_min 0; # bytesusec
countsubmit_max 0; # usec
0; }submit_avg 0; # usec
rs_in_flight {
bio_endio_min 0; # usec
size bio_endio_max 0; # bytesusec
countbio_endio_avg 0; # usec
}
destroy_min 0; # usec
highwater destroy_max 0; # usec
fill destroy_avg 0; # usec
bytes }
data_stream { }
sizeal_stat {
20971520; # bytes al-extents 6001;
used al_used 0;
# bytes al_used_max } 0;
control_stream { hits 0;
size hits_total 52428800;
# bytes misses 0;
used 0; # bytes misses_total 0;
} starving } 0;
} timestamp 2022-09-29_22:54:24.021starving_total 0;
} resource r1 { locked 0;
network { peer cent79locked_02total { 0;
send changed 0; #
byte/second changed_total recv 0;
# byte/second } al_wait_retry_cnt 0;
peer cent79_03 { al_wait_total_retry_cnt 0;
send 0; # byte/second al_wait_max_retry_cnt 0;
recv 0; # byte/second pending_changes 0;
} max_pending_changes } 64;
sendbuf { error {
peer cent79_02 { apnobufs_in_flightstarving { 0;
size nobufs_pending_slot 0;
# bytes countnobufs_used_slot 0;
} busy 0;
rs_in_flight { wouldblock 0;
size 0; # bytes }
flags count NONE;
0; }
} resync_ratio {
highwater peer cent79_02 0;{
fill replication 0; # bytesbyte/second
data_stream { resync 0; # byte/second
size resync_ratio 0; # bytespercent
}
used 0; # bytes peer cent79_03 {
} replication 0; # byte/second
control_stream { size resync 0; # bytesbyte/second
used resync_ratio 0; # percent
0; # bytes }
} }
network {
} peer cent79_0302 {
send ap_in_flight { 180; # byte/second
sizerecv 0384; # bytesbyte/second
}
count peer cent79_03 0;{
}send 0; # byte/second
rs_in_flight { recv 0; # byte/second
size }
0; # bytes }
sendbuf {
count peer cent79_02 {
0; ap_in_flight }{
highwater size 0; 17301504; # bytes
fill 0; # bytes count 33;
data_stream { }
size 0; # bytesrs_in_flight {
usedsize 0; # bytes
} count 0;
control_stream { }
size highwater 0; # bytes 33;
fill used 017301504; # bytes
}data_stream {
} }size timestamp 2022-10-04_00:19:53.026;
}
} |
|
/watch {types} [/scroll]
types 별로 집계되고 있는 데이터를 실시간으로 출력합니다. /scroll 옵션 사용시 출력을 줄넘김 방식으로 표기합니다.
/report {types} [/f {filename}] [/d {YYYY-MM-DD}] [/s {hh:mm[:ss]}] [/e {hh:mm[:ss]}]
types 별로 파일이 기록된 데이터의 통계를 출력합니다. 통계를 산출할 때 다음과 같이 의미없는 데이터들은 대상 샘플에서 제외됩니다.
I/O가 발생하지 않은 0으로 기록된 데이터
일시적(I/O 수치가 2회 이상 연속되지 않을 경우)으로 발생한 I/O 데이터
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개 입니다.
/get {all, period, file_size, file_cnt}
모니터링과 관련된 수치를 조회하는 명령입니다.
/io_delay_test {flag} {delay point} {delay time}
I/O 성능 저하를 의도적으로 발생시켜 bsr 성능 모니터의 기능을 검증합니다. 개발자용 기능 입니다.
/debug cmds options
debugfs 정보를 조회하기 위한 windows 용 명령어입니다.
types
성능 모니터링 대상 항목입니다.
iostat, ioclat, reqstat, peer_reqstat, alstat, network, sendbuf, memstat
iostat {resource} {vnr}
복제 볼륨의 읽기, 쓰기 I/O 에 대한 집계 데이터 (io count, kbs, kb)
...
...
Code Block |
---|
> 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 가 지속적으로 발생하고 있는 상황
...
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 : io count=24855, bw=6325194kbyte
BW (kbyte/s): min=40, max=284928, avg=248578, samples=24
write: io count=8360345, bw=2139182512kbyte
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. 평균 248, 최소 40, 최대 284 Mbytes/s 의 IO 가 처리됨
→ 6670개의 write I/O samples. 평균 320, 최소 12, 최대 401 Mbytes/s 의 IO 가 처리됨
...
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)
...
I/O complete latency 실시간 모니터링
...
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가 완료되기 까지 소요된 시간의 최소, 최대, 평균값 출력
I/O complete latency 통계 출력
...
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_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() 실행 후
...
...
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
submit (usec): min=3, max=7215, avg=46
bio_endio (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
submit (usec): min=2, max=721793, avg=349, samples=72
bio_endio (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 갯수
submit : peer request submit 이 실행 되기까지 소요된 시간
bio_endio : peer request 의 bio 완료 로직이 실행 되기까지 소요된 시간
destroy : peer request가 해제 되기까지 소요된 시간
...
peer request 성능 데이터 실시간 모니터링
...
Code Block |
---|
> bsrmon /watch peer_reqstat r0 0
2021-07-19_21:52:02.191
PEER bsr-03:
peer requests : 0
submit (usec): min=0, max=0, avg=0
bio_endio (usec): min=0, max=0, avg=0
destroy (usec): min=0, max=0, avg=0
PEER bsr-02:
peer requests : 100
submit (usec): min=421, max=6907, avg=2184
bio_endio (usec): min=1021, max=7312, avg=2563
destroy (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
submit (usec): min=1, max=36103, avg=99, samples=6902
bio_endio (usec): min=1, max=116988, avg=96161, samples=9517
destroy (usec): min=47, max=117495, avg=96340, samples=9518
PEER bsr-03:
peer requests : total=133288
submit (usec): min=1, max=1670, avg=5, samples=6037
bio_endio (usec): min=1, max=117000, avg=104660, samples=8708
destroy (usec): min=63, max=125871, avg=104839, samples=8709 |
...
→ 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
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 : 020971520; # bytes
used 0; # bytes
packet {
name P_DATA
count 1;
size 0; # bytes
}
}
control_stream {
size 5242880; # bytes
used 0; # bytes
}
}
peer cent79_03 {
ap_in_flight {
size 0; # bytes
count 0;
}
rs_in_flight {
size 0; # bytes
count 0;
}
highwater 0;
fill 0; # bytes
data_stream {
size 20971520; # bytes
used 0; # bytes
}
control_stream {
size 5242880; # bytes
used 0; # bytes
}
}
}
timestamp 2022-09-29_22:54:25.064;
}
resource r1 {
...
timestamp 2022-10-04_00:10:55.805;
}
} |
|
모든 리소스의 특정 항목 출력
Expand |
---|
title | bsrmon /show /t iostat |
---|
|
Code Block |
---|
[root@cent79_01 bsr-utils]# bsrmon /show /t iostat
bsrmon {
resource r0 {
vnr 0 {
iostat {
read_iops 0;
read_iocnt 0;
read_kbs 0; # kbytes/second
read_kb 0; # kbytes
write_iops 0;
write_iocnt 0;
write_kbs 0; # kbytes/second
write_kb 0; # kbytes
}
}
vnr 1 {
iostat {
read_iops 0;
read_iocnt 0;
read_kbs 0; # kbytes/second
read_kb 0; # kbytes
write_iops 0;
write_iocnt 0;
write_kbs 0; # kbytes/second
write_kb 0; # kbytes
}
}
timestamp 2022-09-29_22:54:25.064;
}
resource r1 {
vnr 0 {
iostat {
read_iops 0;
read_iocnt 0;
read_kbs 0; # kbytes/second
read_kb 0; # kbytes
write_iops 0;
write_iocnt 0;
write_kbs 0; # kbytes/second
write_kb 0; # kbytes
}
}
timestamp 2022-10-04_00:17:52.249;
}
} |
|
특정 리소스의 특정 항목 출력
Expand |
---|
title | bsrmon /show /t network,sendbuf /r r0,r1 |
---|
|
Code Block |
---|
[root@cent79_01 bsr-utils]# bsrmon /show /t network,sendbuf /r r0,r1
bsrmon {
resource r0 {
network {
peer cent79_02 {
send 180; # byte/second
recv 384; # byte/second
}
peer cent79_03 {
send 0; # byte/second
recv 0; # byte/second
}
}
sendbuf {
peer cent79_02 {
ap_in_flight {
size 17301504; # bytes
count 33;
}
rs_in_flight {
size 0; # bytes
count 0;
}
highwater 33;
fill 17301504; # bytes
data_stream {
size 20971520; # bytes
| -usedslot:0BUSY:0WOULDBLOCK:0flags:__LC_DIRTY__LC_LOCKED |
→ 해당 시점에 사용중인 al slot 은 3개 → pending 되어있는 al slot은 1개 → dirty, locked flag가 설정되어 있음 |
Code Block |
>bsrmon/reportalstatr00Reportr0[ALSTAT-vnr0]Run:2021-08-03_04:48:33.721-2021-08-03_22:47:28.326al_extents:6001used:max=0(all_slot_used=0), avg=0hits:total=0misses:total=0starving:total=0locked:total=0changed:total=0al_waitretrycount:max=0, total=0pending_changes:max=0,total=0error:total=0NOBUFS-starving:total=0-pendingslot:total=0-usedslot:total=0BUSY:total=0WOULDBLOCK:total=0->al_extentschangedRun:2021-08-03_22:47:52.895- 2021-08-04_19:27:06.522al_extents:67used:max=67(all_slot_used=59),avg=3hits:total=337528misses:total=2020409starving:total=2locked:total=0
changed:total=673370al_waitretrycount:max=2,total=501
pending_changes:max=64,total=258error:total=1004NOBUFS-starving:total=501-pendingslot:total=0-usedslot:total=503BUSY:total=0WOULDBLOCK : 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):62932184recv (byte/s): 4820PEERbsr03:send (byte/s): 0recv(byte/s):02020-12-08_09:47:46.160PEER100.100.10.31:7792:send (byte/s): 104896568recv (byte/s): 12320PEERbsr03:send(byte/s):0recv(byte/s):0... |
→ peer bsr03 과는 연결 단절된 상태 → peer 100.100.10.31:7792 로 데이터 전송이 진행되고 있는 중 |
Code Block |
>bsrmon/reportnetworkr0Reportr0[NETWORKSPEED]Run:2020-11-30_06:38:44.653- 2020-12-08_09:53:31.455PEER100.100.10.31:7792: send=52497905byte/s, receive=5902byte/ssend(byte/s):min=3,max=115395016,avg=52497905,samples=392recv (byte/s): min=3, max=15004, avg=5902, samples=367
PEER bsr03: send=0byte/s, receive=0byte/ssend(byte/s):min=0,max=0,avg=0,samples=0recv(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:highwater:11246,fill:37094400bytesap_in_flight:8881(9094144bytes)rs_in_flight:2365(28000256bytes)datastreamsize():10485760000used(bytes):27098576[P_DATA]-cnt:7542size:8024616bytes[P_RS_DATA_REPLY]-cnt:1596size:18942304bytes[P_BARRIER]-cnt:549size:13176bytes[P_UNPLUG_REMOTE]-cnt:7406size:118496bytescontrolstreamsize(bytes):5242880used(bytes):0PEERbsr03:highwater:0,fill:0bytesap_in_flight: 0 (0bytes)rs_in_flight: 0 (0bytes)2022-09-29_22:54:24.021;
}
| datastreamsize(bytes):10485761used(bytes):0controlstreamsize(bytes):5242881used(bytes):
... |
→ peer 100.100.10.31:7792, bsr03 에 송신버퍼가 할당되어 있음 → peer bsr03 과는 연결 단절된 상태 → peer 100.100.10.31:7792 로 데이터 전송이 진행되고 있는 중 → peer 100.100.10.31:7792 에 계류중인 복제 및 동기화 데이터 갯수는 11246 개 (복제 데이터 8881개, 동기화 데이터 2365개) |
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
highwater: min=1, max=8014, avg=760, samples=999
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; # byte/second
recv 0; # byte/second
}
peer cent79_03 {
send 0; # byte/second
recv 0; # byte/second
}
}
sendbuf {
peer cent79_02 {
ap_in_flight {
| vszbsrmon29304119212724bsrmon37474120012720bsrmon112177119212724bsrmon113913106812724bsrmon113978130812728 |
→ bsrmon 프로세스가 여러개 실행되고 있는 상태. 종료되지 않은 bsrmon 프로세스가 존재 |
Code Block |
>bsrmon/reportmemstatReport[MEMORY]Run:2020-12-06_19:04:12.177-2020-12-08_09:59:17.716module(bytes)BSR_REQ:16303104-16459264BSR_AL:803760BSR_BM:4063232-5271552BSR_EE:2782560user(kbytes)namerszvszbsradm00bsrsetup00bsrmeta00 0; # bytes
}
}
peer cent79_03 {
ap_in_flight {
size 0; # bytes
|
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초 이내에 수행 완료 되었음을 알 수 있다. |
resync_ratio {resource}
실시간 복제, 동기화 전송량과 이에 대한 동기화 전송 비율
동기화가 진행 중일때 소스 노드에서만 갱신됩니다.
Expand |
---|
|
|
Code Block |
---|
> bsrmon /watch resync_ratio r0
2022-04-12_15:34:52.206
svr06
replcation(144100kb)/resync(18508kb), resync ratio 11% |
|
→ 연결되어있는 svr06 노드에 초당 복제 데이터가 144100kb, 동기화 데이터가 18508kb 전송되었으며 이에 대한 동기화 전송 비율은 11%입니다count 0;
}
rs_in_flight {
size 0; # bytes
count 0;
}
highwater 0;
fill 0; # bytes
data_stream {
size 0; # bytes
used 0; # bytes
}
control_stream {
size 0; # bytes
used 0; # bytes
}
}
}
timestamp 2022-10-04_00:19:53.026;
}
} |
/watch
types 별로 집계되고 있는 데이터를 실시간으로 출력합니다. /scroll 옵션 사용시 출력을 줄넘김 방식으로 표기합니다.
/report
{types} [/f {filename}] [/p {peer_name[,...]}] [/d {YYYY-MM-DD}] [/s {timestamp}] [/e {timestamp}]
types 별로 파일에 기록된 데이터(백업된 파일의 데이터 포함)의 통계를 출력합니다.
리포팅 대상 파일 명을 입력합니다. 특정 파일의 통계 산출을 위해 사용됩니다.
리포팅 대상 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 옵션 입력시 날짜와 시간은 언더바(_)로 구분합니다.
Expand |
---|
|
bsrmon /report iostat r0 0 /d 2022-11-01 bsrmon /report iostat r0 0 /s 2022-11-01 /e 2022-11-10 bsrmon /report iostat r0 0 /s 2022-11-01_09:00 /e 2022-11-10_20:00 bsrmon /report iostat r0 0 /s 09:00 /e 20:00
|
/io_delay_test
{flag} {delay point} {delay time}
I/O 성능 저하를 의도적으로 발생시켜 bsr 성능 모니터의 기능을 검증합니다. 개발자용 기능 입니다.
/debug cmds options
debugfs 정보를 조회하기 위한 windows 용 명령어입니다.