개요
- 기존 DRX의 성능 테스트 시 drbd의 성능 한계에 제한된 결과가 도출되어 DRX 자체의 성능을 시험하는 데 적합하지 않았음
- 이를 해결하기 위해 DRBD 의 연결과 데이터 전송을 시뮬레이션하여 DRX 가 가지는 원천적인 성능을 측정하고자 drbdsim을 개발.
- 부가적으로 DRX 를 시험하기 위해 DRBD 리소스를 미리 구성해야 하는 부담을 덜어줄 것으로 기대.
주요 기능
- drbd의 연결 시뮬레이션
- Acceptor/Connector 두 채널의 연결을 시뮬레이션
- 데이터 전송
- DRX의 성능 측정을 위해 하드디스크 액세스 없이 대량의 데이터를 전송
- 데이터 유형
- zero-fill: 0x00으로 채워진 데이터
- sequencial: 0x00 ~ 0xFF로 순차적으로 증가하는 데이터
- random: 랜덤 생성된 데이터
- 파일 지정: 지정된 파일의 내용을 순환하며 전송
- 데이터 무결성 검사
- 성능을 우선시하기 위해, 패킷 헤더와 데이터 시작/끝부분만 판단하는 저수준의 데이터 무결성 점검 기능이 포함됨 (CRC체크)
사용 방법
Code Block |
---|
language | text |
---|
theme | RDark |
---|
title | drbdsim |
---|
|
[root@proxy1 drbdsim_demo]# ./drbdsim
Usage: .\drbdsim.exe [options] command {command_arguments...}
Global options:
-h [ --help ] Help message.
-l [ --stdout-log-level ] arg (=info) Standard output log level
-f [ --file-log-level ] arg (=debug) File log level
-o [ --output ] arg Output file
--command arg Command to execute
--subargs arg Arguments for command
Commands:
standby, control, wait, send-once, send
Log levels:
trace(T), debug(D), info(I), warning(W), error(E), critical(C), off(O)
* last modified : SepNov 19 7 2018, 0817:2941:3141 |
drbdsim에는 wait, send-once, send의 세가지 모드가 존재하며 모드를 지정하지 않으면 도움말이 출력된다.
...
- l / stdout-log-level: 화면에 출력되는 로그의 레벨 지정
- f / file-log-level: 파일로 출력되는 로그의 레벨 지정
- o / output: 로그를 저장할 파일명을 지정
단독 실행 모드
wait 모드
usage: drbdsim [options] wait peer_ip peer_port
...
- t / packet-type: 패킷 유형 지정
- z / zero-fill
- s / sequencial
- r / random
- packet-file: 파일 기반 패킷 지정.
Code Block |
---|
language | text |
---|
theme | RDark |
---|
title | send-once 모드 실행의 예 |
---|
|
[root@proxy1 drbdsim_demo]# ./drbdsim send-once -p 5000 -t random 200.60.211.252 5000
[08:38:17.514085] [t82488] [app:info] Start
[08:38:17.514271] [t82488] [resource:info] Start (Listen 5000, Peer 200.60.211.252:5000)
[08:38:17.514398] [t82488] [resource:info] [C] Connect to 200.60.211.252:5000
[08:38:17.514449] [t82488] [resource:info] [A] Listen 0.0.0.0:5000
[08:38:17.514452] [t82488] [resource:info] [A] Accept...
[08:38:17.514650] [t82491] [resource:error] [C] Can't connect to 200.60.211.252:5000. 연결이 거부됨
[08:38:19.558009] [t82491] [resource:info] [A] Accepted 200.60.211.252:41210
[08:38:19.617391] [t82491] [resource:info] [C] Connected. Send magic packet
[08:38:19.617439] [t82492] [resource:info] [C:meta] Start process
[08:38:19.617453] [t82492] [resource:info] [A:data] Start process
[08:38:19.617460] [t82492] [resource:info] [repl_test] Prepare test...
[08:38:19.621709] [t82492] [resource:info] [repl_test] Start packet test (packet_type: random)
[08:38:19.621770] [t82492] [resource:info] [repl_test] Test finished
[08:38:20.621796] [t82491] [resource:info] [statistics] TX Bandwidth: 524.34 Kbps / 64.01 KB/s, RX Bandwitdh: 0.00 bps / 0.00 B/s
[08:38:21.621784] [t82492] [resource:info] [statistics] TX Bandwidth: 262.17 Kbps / 32.00 KB/s, RX Bandwitdh: 0.00 bps / 0.00 B/s
[08:38:22.621789] [t82491] [resource:info] [statistics] TX Bandwidth: 174.78 Kbps / 21.33 KB/s, RX Bandwitdh: 0.00 bps / 0.00 B/s
[08:38:23.621766] [t82492] [resource:info] [statistics] TX Bandwidth: 131.08 Kbps / 16.00 KB/s, RX Bandwitdh: 0.00 bps / 0.00 B/s |
...
- t / packet-type: 패킷 유형 지정
- z / zero-fill
- s / sequencial
- r / random
- packet-file: 파일 기반 패킷 지정. 지정한 파일의 내용을 반복적으로 전송한다.
- s / transfer-duration: 전송 시간 지정 (초단위)
- b / bps-limits: 전송 속도 제한 (bps 단위)
Code Block |
---|
|
[root@proxy1 drbdsim_demo]# ./drbdsim send -p 5000 200.60.211.252 5000 -s 5 -b 6G -t s
[08:46:23.997586] [t83947] [app:info] Start
[08:46:23.998114] [t83947] [resource:info] Start (Listen 5000, Peer 200.60.211.252:5000)
[08:46:23.998241] [t83947] [resource:info] [C] Connect to 200.60.211.252:5000
[08:46:23.998289] [t83947] [resource:info] [A] Listen 0.0.0.0:5000
[08:46:23.998292] [t83947] [resource:info] [A] Accept...
[08:46:23.998488] [t83950] [resource:error] [C] Can't connect to 200.60.211.252:5000. 연결이 거부됨
[08:46:25.167158] [t83950] [resource:info] [A] Accepted 200.60.211.252:43890
[08:46:25.199745] [t83950] [resource:info] [C] Connected. Send magic packet
[08:46:25.199780] [t83951] [resource:info] [C:meta] Start process
[08:46:25.199793] [t83951] [resource:info] [A:data] Start process
[08:46:25.199800] [t83951] [resource:info] [repl_test] Prepare test...
[08:46:25.199888] [t83951] [resource:info] [repl_test] Start replication test (duration: 5s, limits: 6.00 Gbps, packet_type: sequencial)
[08:46:26.199980] [t83950] [resource:info] [statistics] TX Bandwidth: 6.00 Gbps / 715.66 MB/s, RX Bandwitdh: 0.00 bps / 0.00 B/s
[08:46:27.199975] [t83951] [resource:info] [statistics] TX Bandwidth: 6.00 Gbps / 715.50 MB/s, RX Bandwitdh: 0.00 bps / 0.00 B/s
[08:46:28.199975] [t83950] [resource:info] [statistics] TX Bandwidth: 6.00 Gbps / 715.45 MB/s, RX Bandwitdh: 0.00 bps / 0.00 B/s
[08:46:29.199977] [t83951] [resource:info] [statistics] TX Bandwidth: 6.00 Gbps / 715.42 MB/s, RX Bandwitdh: 0.00 bps / 0.00 B/s
[08:46:30.199901] [t83951] [resource:info] [repl_test] Test finished
[08:46:30.199974] [t83950] [resource:info] [statistics] TX Bandwidth: 6.00 Gbps / 715.31 MB/s, RX Bandwitdh: 0.00 bps / 0.00 B/s
[08:46:31.199971] [t83951] [resource:info] [statistics] TX Bandwidth: 4.50 Gbps / 536.48 MB/s, RX Bandwitdh: 0.00 bps / 0.00 B/s
[08:46:32.199997] [t83950] [resource:info] [statistics] TX Bandwidth: 3.00 Gbps / 357.64 MB/s, RX Bandwitdh: 0.00 bps / 0.00 B/s
[08:46:33.200004] [t83951] [resource:info] [statistics] TX Bandwidth: 1.50 Gbps / 178.80 MB/s, RX Bandwitdh: 0.00 bps / 0.00 B/s |
대기/제어 모드
standby 모드
usage: drbdsim.exe [options] standby
외부 제어를 기다리는 대기 모드이다. 제어를 위해 TCP 포트를 열고 대기한다.
추가 옵션:
- p / port: 제어 서버 포트 번호 (기본값: 9101)
Code Block |
---|
|
[root@proxy1 drbdsim_demo]# ./drbdsim standby -p 9101
[08:51:56.413599] [t18932] [app:info] Start standby mode (port: 9101) |
control 모드
usage: drbdsim.exe [options] control [actions...]
standby 모드로 실행되어 있는 drbdsim을 제어하는 모드이다.
추가 옵션:
- i / peer_ip: 제어할 drbdsim의 IP. (기본값: 127.0.0.1)
- p / peer_port: 제어할 drbdsim의 포트 번호. (기본값: 9091)
- json: 결과를 JSON 포맷으로 출력. 표준 출력 로그가 Off일 때만 동작한다. (기본값: 0)
이 모드에서 동작의 결과를 얻기 위해서는 로그의 표준 출력을 비활성화해야 한다.
list - 리소스 목록 출력
추가된 리소스의 목록을 출력한다.
Code Block |
---|
|
[root@proxy1 drbdsim_demo]# ./drbdsim control -l=O --json=1 list
{"code": 0, "result": ["r0", "r1"]}
[root@proxy1 drbdsim_demo]# ./drbdsim control -l=O list
code: 0
result:
r0
r1
[root@proxy1 drbdsim_demo]# ./drbdsim control -l=O -p 9102 list
code: 0
result: empty |
add - 리소스 추가
add [resource_name] [listen_port] [peer_ip] [peer_port]
Code Block |
---|
|
[root@proxy1 drbdsim_demo]# ./drbdsim control -l=O --json=0 -p 9101 add r0 9000 127.0.0.1 9001
code: 0
result: ok
[root@proxy1 drbdsim_demo]# ./drbdsim control -l=O --json=1 -p 9102 add r0 9001 127.0.0.1 9000
{"code": 0, "result": "ok"} |
del - 리소스 제거
del [resource_name]
Code Block |
---|
|
[root@proxy1 drbdsim_demo]# ./drbdsim control -l=O del r0
code: 0
result: ok
[root@proxy1 drbdsim_demo]# ./drbdsim control -l=O --json=1 del r0
{"code": -3000, "error": "There is no resource 'r0'.", "result": "failed"} |
send - 데이터 전송
send [resource_name] [packet_type or filename] [total_length] [duration] [bps_limit]
옵션 목록:
- packet_type or filename: 패킷 유형 또는 파일명. 사용가능한 패킷 유형은 단독 실행 모드와 같다.
- z / zero-fill
- s / sequencial
- r / random
- total_length: 전송할 데이터 길이.
- duration: 전송 유지 시간. 0이면 무제한이고, 시간안에 지정한 데이터 길이를 다 보낸 경우 전송을 종료한다.
- bps_limit: 전송 속도 제한. 0이면 무제한이다.
Code Block |
---|
|
[root@proxy1 drbdsim_demo]# ./drbdsim control -l=O --json=1 -p 9101 send r0 data.db 1G 0 100M
{"code": 0, "result": "ok"} |
stop - 데이터 전송 중지
stop [resource_name]
Code Block |
---|
|
[root@proxy1 drbdsim_demo]# ./drbdsim control -l=O --json=1 -p 9101 stop r0
{"code": 0, "result": "ok"} |
states - 리소스 상태 출력
states [resource_name or all]
동작중인 리소스의 상태를 출력한다. 'all'을 입력하면 모든 리소스의 정보가 출력된다.
출력 항목:
- rx_bps, tx_bps, rx_bps_to_human, tx_bps_to_human: 전송 속도.
- state: 리소스의 상태
- connecting: 접속 시도중
- connected: 접속됨
- testing: 패킷 전송중인 경우 true, 아니면 false
Code Block |
---|
|
[root@proxy1 drbdsim_demo]# ./drbdsim control -l=O --json=0 -p 9101 states r0
code: 0
result:
rx_bps: 0
rx_bps_to_human: 0.00 bps
state: connected
testing: true
tx_bps: 12501528
tx_bps_to_human: 100.01 Mbps
[root@proxy1 drbdsim_demo]# ./drbdsim control -l=O --json=1 -p 9102 states r0
{"code": 0, "result": {"rx_bps": 12501528, "rx_bps_to_human": "100.01 Mbps", "state": "connected", "testing": false, "tx_bps": 0, "tx_bps_to_human": "0.00 bps"}}
[root@proxy1 drbdsim_demo]# ./drbdsim control -l=O --json=0 -p 9101 states all
code: 0
result:
r0:
rx_bps: 0
rx_bps_to_human: 0.00 bps
state: connected
testing: false
tx_bps: 0
tx_bps_to_human: 0.00 bps
[root@proxy1 drbdsim_demo]# ./drbdsim control -l=O --json=1 -p 9102 states all
{"code": 0, "result": {"r0": {"rx_bps": 0, "rx_bps_to_human": "0.00 bps", "state": "connected", "testing": false, "tx_bps": 0, "tx_bps_to_human": "0.00 bps"}}} |
quit - 종료
대기모드인 drbdsim을 종료한다. 성공시에는 별도의 출력이 없다.
Code Block |
---|
|
[root@proxy1 drbdsim_demo]# ./drbdsim control -l=O quit
[root@proxy1 drbdsim_demo]# ./drbdsim control -l=O --json=1 quit
{"code": -6000, "error": "Communication error: No connection could be made because the target machine actively refused it", "result": "failed"} |