System Compleat.

'쓰나미 UDP'에 해당되는 글 1건

  1. Tsunami UDP, boost sending files

Tsunami UDP, boost sending files

Techs


(younjin.jeong@gmail.com, 정윤진)


사실 국내 센터간의 파일 전송은 일반적인 TCP 전송 방법을 사용하더라도 그다지 느리게 느껴지지 않는다. 하지만 대륙을 건너 수십 기가바이트의 파일을 전송하고자 하는 경우에는 더디게 흐르는 Windows 95 모래시계를 볼 때 만큼 터지는 속을 주체 할 수가 없게된다. 


특정 시일내에 지정된 크기의 파일을 해외로 보내야 하는 경우에는 농담 같겠지만 사실 택배가 제일 빠르다. 요새 우습게 나오는 수 테라바이트의 하드 디스크 대여섯개 분량의 데이터라면 쉽게 10테라 바이트가 넘어가고 이는 초당 1MByte/sec 인 비교적 양호한 국제망 환경이라 하더라도 전송에 필요한 시간은 10,485,760 초, 17만 4762분, 2913 시간이며, 날짜로는 121일이 걸린다. 


이럴 바에야 그냥 디스크 5개를 택배로 보내는것이 네달 내내 데이터를 전송 하는 것 보다 훨씬 낫다는 말이다. 물론, 현지에 받아 줄 인프라 및 운용 인력이 있어야 말이 되겠지만. 


이런 부분에 조금이나마 걱정을 줄여 보고자, 제목과 같은 도구를 사용 하는 방법에 대해 소개 하고자 한다. 그럼 이 도구를 사용하면 얼마나 속도가 나오길래 그러냐 물을지도 모르겠다. 기본적으로 Tsunami UDP 는 전송 제어를 위한 TCP 연결과 실제 데이터 전송을 위한 UDP 포트를 각각 하나씩 사용한다. 일단은 TCP 처럼 혼잡 회피라던가 느리게 시작하는 알고리즘 및 기타 등등 복잡한거 생각 안하고 그냥 마구 쏘고 본다. 



Image from: http://en.wikibooks.org/wiki/Communication_Networks/TCP_and_UDP_Protocols



그래서 받는 측에서 정상적으로 받으면 좋은거고 못받으면 그냥 다시 보내면 된다. 이 단순한 구조로 인해 TCP 와 같이 회선 대역폭을 충분히 사용하지 못하는 경우에라도 높은 전송 속도를 사용하는 것이 가능하다. 단순 UDP 만을 사용하게 되면 분명 유실이 발생 할 수 있곘지만, Tsunami UDP 에서는 이런 누락된 부분을 다시 전송 할 수 있는 loseless 모드를 지원 한다. 따라서 전송 전과 전송 후 md5sum 과 같은 도구로 확인 해 보아도 동일한 파일이 무사히 전송 되는 것을 확인이 가능. 


설치 방법은 대략 아래의 스크립트를 사용하면 되겠다. 만약 AWS의 EC2 를 사용하는 경우라면 User data 부분을 이용해서 바로 인스턴스를 준비 하는 것도 가능. 아래의 스크립트는 N.Virginia 에서 cc2.8xlarge 인스턴스를 사용하는 경우 ephemeral disk 4개를 모두 사용하여 raid 0 로 묶고, 여기에 BtrFS 를 사용하도록 구성한다. 파일 시스템은 원하는 것을 사용해도 되며, 기타 실제 다른 데이터 센터로 전송하려는 경우에는 원하는 부분만 발췌해서 사용해도 무방. 



#!/bin/bash 

yum -y update 
mkdir  -p /root/tmp 
cd /root/tmp/ 

yum  -y install gcc c++ cc make automake  
wget http://downloads.sourceforge.net/project/tsunami-udp/tsunami-udp/tsunami-v1.1-cvsbuild42/tsunami-v1.1-cvsbuild42.tar.gz


tar xvzf tsunami-v1.1-cvsbuild42.tar.gz  
 
cd /root/tmp/tsunami-udp-v11-b42  
./recompile.sh 
make install

yum -y install btrfs-progs.x86_64 
mkdir -p /mnt/md0 
umount `mount | egrep ephemeral  | awk '{print $1}' `

disklist=`fdisk -l  | egrep '(GB)' | egrep -v xvda | awk '{print $2}' | cut -d":" -f 1 | sed ':a;N;$!ba;s/\n/ /g' `

echo y | mdadm --create /dev/md0 --chunk=1024 --level=0 --raid-devices=4 $disklist
mkfs.btrfs /dev/md0 

mount -t btrfs /dev/md0 /mnt/md0

exit 0



별로 심각한 수준에서 튜닝된 설정은 아니므로 적절한 값은 직접 확인을. 

전송을 위해서는 서버와 클라이언트가 필요한데, 클라이언트에서는 PUT 은 불가능하고 GET 만 가능 한 것으로 보인다. 


서버는 전송하고자 하는 파일이 위치한 디렉토리에서 아래와 같은 커맨드로 실행한다. 


tsunamid --hbtimeout=360 --verbose 



클라이언트는 tsunami 라는 도구를 사용하며, 서버로 부터 명시된 전체 파일을 가져오거나 특정 파일만을 전송 받는것이 가능하다. 


tsunami connect [HOSTNAME] get [FILENAME]



설정 가능한 내용들은 통상 다음과 같다. 


tsunamid: unrecognized option '--help'

Usage: tsunamid [--verbose] [--transcript] [--v6] [--port=n] [--buffer=bytes]

                [--hbtimeout=seconds] [filename1 filename2 ...]


verbose or v : turns on verbose output mode

transcript   : turns on transcript mode for statistics recording

v6           : operates using IPv6 instead of (not in addition to!) IPv4

port         : specifies which TCP port on which to listen to incoming connections

secret       : specifies the shared secret for the client and server

buffer       : specifies the desired size for UDP socket send buffer (in bytes)

hbtimeout    : specifies the timeout in seconds for disconnect after client heartbeat lost

filenames    : list of files to share for downloaded via a client 'GET *'


Defaults: verbose    = 1

          transcript = 0

          v6         = 0

          port       = 46224

          buffer     = 20000000 bytes

          hbtimeout  = 15 seconds



직접 사용을 해 보면, 다음과 같은 부분이 전송에 영향을 미친다. 


* 너무 짧은 heart beat timeout 은 전체 전송을 끊어버리는 현상을 발생 시킬 수 있다. 

* 클라이언트(수신측)의 Disk write 성능이 떨어지면 buffer 에 담긴 파일을 디스크에 쓰는 동안 UDP packet drop 이 발생할 수 있다. 



EC2 에서 region to region 복사의 경우, 1Gigabyte 정도는 10초 내에 전송 완료되는 것을 확인 할 수 있었다. 

다만 실제 데이터센터에서 본 도구를 사용하는 경우에는 발송하는 쪽의 대역폭이 성능에 영향을 미칠 수 있으므로, 실제 서비스로의 도입은 반드시 테스트 해 보고 결정 할 것. 성능은 그때 그때 달라효. 


물론, 보다 더 좋은 성능을 위한 커널 파라메터 튠이 존재하므로 다양한 방법으로 개선을 시도 해 봐도 좋을 듯. 


잠깐 검색을 해 보니 TCP 와 UDP 에 대한 괜찮은 정리가 있어 링크를 공유. 

http://en.wikibooks.org/wiki/Communication_Networks/TCP_and_UDP_Protocols


예전에는 이런거 공부하려면 Steven 책 밖에 없었던 것 같은데, 참 세상 좋다. 


본 도구를 이용한 보다 발전된 도구는 향후 준비 되면 다시 포스팅을. 

아 간만에 기술 포스팅 한다 정말. :) 


(younjin.jeong@gmail.com, 정윤진)