sockperf를 이용한 레이턴시 측정

1.
새로운 장비를 도입하였습니다. OS도 깔았습니다. 어플리케이션을 설치하고 네트워크 연결도 하였습니다. 어플리케이션이 정상으로 돌아가는지를 확인하였습니다. 모든 것이 ‘정상’입니다. 이제 정상 운영을 하면 될까요? 물론 아닙니다 .튜닝을 하는 과정이 남았습니다. 여러가지 영역에서 튜닝이 필요하지만 네트워크성능은 트레이딩에서 무척 중요합니다. 최적화를 하려면 현재 어느 수준인지 측정하여야 합니다. 따라서 측정을 하기 위한 방법이나 도구가 필요합니다.

얼마전 Chelsio vs. Solarflare라는 글을 통해 sockperf라는 제품을 이용한 측정값을 소개한 적이 있습니다. 이 도구가 어떤 것인지 궁금하여 개발서버에 설치하여 몇가지 시험을 해보았습니다. 훌륭하더군요. 공개 소스라 필요하면 수정하실 수도 있고 다양한 규칙을 적용한 시험도 가능합니다. 트레이더들을 위한 최적의 도구가 아닐까 생각해 소개합니다. 이번에 설치하면서 문서를 읽어보니까 처음 만들었던 곳은 Voltaire입니다. 지금은 Mellanox에서 관리하고 공개를 하였다고 합니다. Voltaire는 메시징으로, Mellanox는 네트워크카드로 유명한 회사입니다.

먼저 sockperf의 특징입니다.? UDP/TCP의 네트워크 환경에서 사용할 수 있으면 다음과 같은 기능을 가지고 있습니다.

Measure latency
Measure TX/RX bandwidth
Measure packet loss
Multicast
Multi-threaded

레이턴시 측정을 할 때 가장 문제가 되는 것은 서로 다른 장비간의 시간 동기화입니다. NTP를 사용하더라고 오차값때문에 정확한 측정이 힘듭니다. 더우기 마이크로초나 나노초를 기준으로 측정하면 거의 무의미한 값이 됩니다. 이 때문에 사용하는 방법이 RTT(Round Trip Time)입니다. 예를 들어 A장비에서 B장비를 향하여 패킷을 보냅니다. B장비는 받은 패킷을 다시 A장비로 되돌려 보내고 A장비는 보낸 시간과 받은 시간을 남깁니다. 이와 같은 방법을 사용하면 시간 동기화의 이슈는 해결할 수 있습니다. sockperf가 사용하는 방법도 RTT입니다. 따라서 sockperf는 서버와 클라이언트로 동작하도록 하여 측정할 수 있는 특징이 있습니다.

Measure the RTT of packets in descrete way;
Provide full log of packet times;
Provide few modes to monitor multiple file descriptors as recv/select/epoll/poll;
Improved CPU utilization;

2.
자, 이제 설치입니다. 당연히 설치를 위한 하드웨어를 준비하여야 합니다. x.86계열의 서버이고 Linux를 설치하여야 합니다.? 컴파일을 하기에 앞서 준비물이 필요합니다.

perl 5.8+ (used by the automake tools)
GNU make tools: automake 1.7+, autoconf 2.57+, m4 1.4+ and libtool 1.4+
A Compiler, among those tested are:
gcc4 (Ubuntu 9)
gcc4 (Red Hat 4.x)

저는 CentOS 6.2를 사용합니다. gcc 4.4.6이 기본으로 설치되네요. 위의 프로그램을 준비하였으면 이제 sockperf를 받습니다.

SockPerf is a benchmarking utility for measuring network performance

최종버전을 받아서 컴파일을 하고자 하는 곳에 압축을 풀어 저장합니다.

이제 압축을 푼 디렉토리로 이동하여 컴파일을 합니다. 그런데 파일면을 보면 Makefile으로 된 파일이 없습니다. 설치환경에 따라 자동으로 Makefile을 만들어줍니다. 아래와 같이 합니다.

위의 configure를 실행할 때 다양한 옵션도 가능합니다. 설치할 디렉토리 지정뿐 아니라 스크립트 실행이 가능하도록 할 수도 있습니다. 아래는 옵션입니다.

잠시 짬을 내서 압축을 푼 디렉토리에 있는 readme파일을 읽어도 좋습니다. 간단히 설치방법을 설명해놓았습니다. 이제 sockperf를 실행할 차례입니다. 앞서 환경설정 때 지정한 디렉토리로 이동합니다.

3.
앞서 sockperf의 측정방법은 RTT라고 하였습니다. 이를 위해 먼저 sockperf를 서버로 실행하여야 합니다. 가장 기본적인 명령어 옵션은 아래와 같습니다. server는 서버모드로 동작한다는 의미이고 i(p address)를 뜻하는 주소이고 p(ort)는 사용할 포트번호입니다.’–tcp’를 지정하면 TCP 시험입니다. 없으면 UDP시험을 합니다.

이런 식으로 실행하면 아래와 같이 나옵니다.


만약 Daemon으로 실행하고자 한다면 ‘–daemonize’를 붙입니다.

서버를 실행하였으니 이제 클라이언트를 실행할 차례입니다. 클라이언트는 시험할 방법에 따라 네가지 선택이 가능합니다.

under-load – run sockperf client for latency under load test;
ping-pong – run sockperf client for latency test in ping pong mode;
playback – run sockperf client for latency test using playback of predefined traffic, based on timeline and message size;
throughput – run sockperf client for one way throughput test;

사용할 방법을 선택하였으면 다음과 같은 형식으로 명령어를 입력합니다.

옵션중 m은 메시지 크기입니다. t는 측정을 하는 시간입니다. 이상을 실행한 후 결과는 아래와 같습니다.

sockperf를 보고 가장 좋았던 점이 위의 결과에 나와 있습니다. 실험한 결과를 통계로 처리해줍니다. 최대값, 최소값 그리고 평균값 및 분포별 분산값까지를 보여줍니다.

위의 실험결과 평균값는 14.328 마이크로초입니다만 99.99%를 기준으로 한 분산값은 57.023입니다. 만약 위 서버를 튜밍하고자 한다면 99.9%의 값을 내리는 것이 가장 중요합니다.

4.
‘레이턴시는 곧 측정이다’는 말을 자주 합니다. 측정은 여러가지 영역에서 가능합니다. 단순히 네트워크의 지연값을 측정할 수 있습니다. 혹은 어플리케이션의 지연값을 측정할 수 있습니다. 트레이딩시스템에서 어플리케이션의 지연값을 측정하기란 쉽지 않습니다. 측정을 위한 고가의 장비를 이용하지 않으면 모니터링을 위한 지연을 필요할 수 없기때문입니다. 그렇다고 하더라도 정기적인 어플리케이션 지연값을 측정하여야 합니다. 거래소까지 어느 정도 걸리는지, 시세를 받을 때 어느 정도 걸리는지 등등입니다.? 반면 sockperf를 이용한 네트워크 측정은 매일 가능합니다. 장마감이후에도 가능합니다.

sockperf는 측정도구이기때문에 튜닝할 때도 요긴하게 사용할 수 있습니다. 앞서 측정값을 가지고 패러매터값을 하나씩 변경하고 다시 측정합니다. 지루하지만 반복하면 좀더 좋은 결과를 얻을 수 있습니다.

레이턴시 단축, 측정의 생활화입니다.

(*)보다 자세한 정보는 sockperf를 설치한 후 share디렉토리에 있는 문서를 참고로 하시길 바랍니다. 시나리오 시험부터 다양한 기능이 아주 강력합니다. 흔히 하는 말로 ‘강추’입니다.

Leave a Comment

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

이 사이트는 스팸을 줄이는 아키스밋을 사용합니다. 댓글이 어떻게 처리되는지 알아보십시오.