drxsim 사용 가이드
개요
drxsim은 drx가 가진 원천적인 복제 성능을 측정할 수 있는 환경을 제공하는 도구입니다. 이를 위해 drxsim은 bsr 과의 네트워크 연결, 최대 성능 측정을 위한 무제한의 복제 데이터 전송을 시뮬레이션 합니다. 로컬/원격 drx 서비스만 구동해 놓으면 drxsim 자체적으로 처리하기 때문에 복제 리소스(디스크, 네트워크 연결)는 준비하지 않아도 됩니다.
주요 기능
- bsr 연결 시뮬레이션
- Acceptor/Connector 두 채널의 연결을 시뮬레이션
- 데이터 전송
- DRX의 성능 측정을 위해 하드디스크 액세스 없이 대량의 데이터를 전송
- 데이터 유형
- zero-fill: 0x00으로 채워진 데이터
- sequencial: 0x00 ~ 0xFF로 순차적으로 증가하는 데이터
- random: 랜덤 생성된 데이터
- 파일 지정: 지정된 파일의 내용을 순환하며 전송
- 데이터 무결성 검사
- 성능을 우선시하기 위해, 패킷 헤더와 데이터 시작/끝부분만 판단하는 저수준의 데이터 무결성 점검 기능이 포함됨 (CRC체크)
사용 방법
[root@proxy1 drxsim_demo]# ./drxsim Usage: .\drxsim.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 : Nov 19 2018, 17:41:41
drxsim에는 단독 실행 모드(wait, send-once, send)와 대기/제어 모드(standby, control)가 존재하며 모드를 지정하지 않으면 도움말이 출력된다.
공통 옵션:
- l / stdout-log-level: 화면에 출력되는 로그의 레벨 지정
- f / file-log-level: 파일로 출력되는 로그의 레벨 지정
- o / output: 로그를 저장할 파일명을 지정
단독 실행 모드
wait 모드
usage: drxsim [options] wait peer_ip peer_port
가장 기본이 되는 모드로, 원격 drxsim과의 연결을 수립하고 대기한다.
옵션:
- i / ip: Listen IP 지정 (기본값: 0.0.0.0)
- p / port: Listen port 지정 (기본값: 7780)
- peer_ip: 원격 drxsim 또는 DRX의 IP
- peer_port: 원격 drxsim 또는 DRX의 Port
[root@proxy1 drxsim_demo]# ./drxsim wait -p 5000 200.60.211.252 5000 [08:33:24.794367] [t81616] [app:info] Start [08:33:24.794482] [t81616] [resource:info] Start (Listen 5000, Peer 200.60.211.252:5000) [08:33:24.794589] [t81616] [resource:info] [C] Connect to 200.60.211.252:5000 [08:33:24.794629] [t81616] [resource:info] [A] Listen 0.0.0.0:5000 [08:33:24.794632] [t81616] [resource:info] [A] Accept... [08:33:24.794823] [t81619] [resource:error] [C] Can't connect to 200.60.211.252:5000. 연결이 거부됨 [08:33:34.653542] [t81619] [resource:info] [A] Accepted 200.60.211.252:41072 [08:33:34.710491] [t81620] [resource:info] [C] Connected. Send magic packet [08:33:34.710534] [t81619] [resource:info] [C:meta] Start process [08:33:34.710546] [t81619] [resource:info] [A:data] Start process
중간의 접속 오류는 원격 drxsim이 아직 가동중이 아니기 때문에 발생한 것이다.
send-once 모드
usage: drxsim [options] send-once peer_ip peer_port
데이터 전송이 정상적으로 이루어지는지를 확인하기 위해, 접속 후 한번의 데이터 전송을 수행하는 모드이다.
DRX의 플러그인 사용시 패킷 스니핑을 통해 해당 플러그인의 동작이 정상적으로 이루어지는지 확인하기 위해 제작되었다.
추가 옵션:
- t / packet-type: 패킷 유형 지정
- z / zero-fill
- s / sequencial
- r / random
- packet-file: 파일 기반 패킷 지정.
[root@proxy1 drxsim_demo]# ./drxsim 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
데이터 전송이 이루어지면 B/W 측정 결과가 출력된다. B/W는 초당 한번 출력되고 총 4개의 과거 데이터를 합산하여 평균 값을 사용하므로, 한번의 데이터 전송으로 4초간의 B/W 측정 결과가 출력되었다.
send 모드
usage: drxsim [options] send peer_ip peer_port
지속적인 데이터 전송을 수행하는 모드이다. 네트워크 성능이나 DRX의 성능을 측정하기 위해서 사용한다.
추가 옵션:
- t / packet-type: 패킷 유형 지정
- z / zero-fill
- s / sequencial
- r / random
- packet-file: 파일 기반 패킷 지정. 지정한 파일의 내용을 반복적으로 전송한다.
- s / transfer-duration: 전송 시간 지정 (초단위)
- b / bps-limits: 전송 속도 제한 (bps 단위)
[root@proxy1 drxsim_demo]# ./drxsim 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: drxsim.exe [options] standby
외부 제어를 기다리는 대기 모드이다. 제어를 위해 TCP 포트를 열고 대기한다.
추가 옵션:
- i / ip: 제어 서버 IP (기본값: 0.0.0.0)
- p / port: 제어 서버 포트 번호 (기본값: 9101)
[root@proxy1 drxsim_demo]# ./drxsim standby -p 9101 [08:51:56.413599] [t18932] [app:info] Start standby mode (port: 9101)
control 모드
usage: drxsim.exe [options] control [actions...]
standby 모드로 실행되어 있는 drxsim을 제어하는 모드이다.
추가 옵션:
- i / peer_ip: 제어할 drxsim의 IP. (기본값: 127.0.0.1)
- p / peer_port: 제어할 drxsim의 포트 번호. (기본값: 9091)
- json: 결과를 JSON 포맷으로 출력. 표준 출력 로그가 Off일 때만 동작한다. (기본값: 0)
이 모드에서 동작의 결과를 얻기 위해서는 로그의 표준 출력을 비활성화해야 한다.
list - 리소스 목록 출력
추가된 리소스의 목록을 출력한다.
[root@proxy1 drxsim_demo]# ./drxsim control -l=O --json=1 list {"code": 0, "result": ["r0", "r1"]} [root@proxy1 drxsim_demo]# ./drxsim control -l=O list code: 0 result: r0 r1 [root@proxy1 drxsim_demo]# ./drxsim control -l=O -p 9102 list code: 0 result: empty
add - 리소스 추가
add [resource_name] [listen_ip] [listen_port] [peer_ip] [peer_port]
[root@proxy1 drxsim_demo]# ./drxsim control -l=O --json=0 -p 9101 add r0 0.0.0.0 9000 127.0.0.1 9001 code: 0 result: ok [root@proxy1 drxsim_demo]# ./drxsim control -l=O --json=1 -p 9102 add r0 0.0.0.0 9001 127.0.0.1 9000 {"code": 0, "result": "ok"}
del - 리소스 제거
del [resource_name]
[root@proxy1 drxsim_demo]# ./drxsim control -l=O del r0 code: 0 result: ok [root@proxy1 drxsim_demo]# ./drxsim 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이면 무제한이다.
[root@proxy1 drxsim_demo]# ./drxsim control -l=O --json=1 -p 9101 send r0 data.db 1G 0 100M {"code": 0, "result": "ok"}
stop - 데이터 전송 중지
stop [resource_name]
[root@proxy1 drxsim_demo]# ./drxsim 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
[root@proxy1 drxsim_demo]# ./drxsim 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 drxsim_demo]# ./drxsim 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 drxsim_demo]# ./drxsim 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 drxsim_demo]# ./drxsim 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 - 종료
대기모드인 drxsim을 종료한다. 성공시에는 ��도의 출력이 없다.
[root@proxy1 drxsim_demo]# ./drxsim control -l=O quit [root@proxy1 drxsim_demo]# ./drxsim 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"}