drxsim 사용 가이드

개요

drxsim은 drx가 가진 원천적인 복제 성능을 측정할 수 있는 환경을 제공하는 도구입니다. 이를 위해 drxsim은 bsr 과의 네트워크 연결, 최대 성능 측정을 위한 무제한의 복제 데이터 전송을 시뮬레이션 합니다.  로컬/원격 drx 서비스만 구동해 놓으면 drxsim 자체적으로 처리하기 때문에 복제 리소스(디스크, 네트워크 연결)는 준비하지 않아도 됩니다.

주요 기능

  • bsr 연결 시뮬레이션
    • Acceptor/Connector 두 채널의 연결을 시뮬레이션
  • 데이터 전송
    • DRX의 성능 측정을 위해 하드디스크 액세스 없이 대량의 데이터를 전송
    • 데이터 유형
      • zero-fill: 0x00으로 채워진 데이터
      • sequencial: 0x00 ~ 0xFF로 순차적으로 증가하는 데이터
      • random: 랜덤 생성된 데이터
      • 파일 지정: 지정된 파일의 내용을 순환하며 전송
  • 데이터 무결성 검사
    • 성능을 우선시하기 위해, 패킷 헤더와 데이터 시작/끝부분만 판단하는 저수준의 데이터 무결성 점검 기능이 포함됨 (CRC체크)

사용 방법

drbdsim
[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
wait 모드 실행의 예
[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: 파일 기반 패킷 지정.
send-once 모드 실행의 예
[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"}