토네이도(Tornado) - 프랜드피드의 웹 서버
프랜드피드(FriendFeed) 는 구글 직원들이 나와서 차린,
트위터(Tweeter) 스타일의 마이크로 블로깅(Micro-Blogging) 업체로, 얼마
전에 페이스북(Facebook) 에 인수되어 유명세를 탔습니다. 이들이 자신의 웹
서버인 토네이도(Tornado)를 오픈 소스로 공개했습니다. 웹 서버라면
넘쳐나는데, 여기 소개하는 이유는 1) 마이크로 블로깅 서비스는 웹 서버의
부하를 최소한 채팅 서버 수준으로 올리는 경향이 있고, 폴링 방식을 사용할
경우 더 심각한 수준으로 과부하가 걸릴 위험이 있습니다. 때문에 안정적으로
서비스되고 있는 프로덕션 서버는 한번 살펴볼만한 가치가 있습니다. 2)
epoll 을 사용한 Non-blocking 서버로 구현되었습니다. 사용자(웹 개발자)의
불편함을 어떻게 해소할지 궁금해집니다. 3) 제가 좋아하는 파이썬(Python)
으로 작성되었습니다. 또 하나의 웹 프레임워크가 등장한 샘인데, 어떤
특징을 갖고 있는지 궁금합니다. 첫째 이유는 이 웹 서버를 제작한
이유이기도 합니다. 그들은 nginx (이 역시 Non-blocking 서버입니다.) 를
로드 밸런서와 정적 파일을 위한 서버로 사용하고, 토네이도 는 단일
쓰레드로 운영되고, 코어 수 만큼의 프로세스를 올립니다. 단일 쓰레드를
사용하는 것은 파이썬의 Global Lock 이라는 약점을 피해가는 방법이고,
Non-blocking 이기 때문에 가능합니다. 이런 배치를 통해 달성했다고
주장하는 성능은 다음 그래프와 같습니다. 아파치 벤치마크로 측정했습니다.
파이썬 이외의 웹 서버들과의 비교가 없기는 합니다만, 아파치와
함께 구동하는 장고(Django)와 비교해볼 때 거의 4배의 성능을 보입니다.
하지만 장고를 좀 달리 구성한다면 이 정도로 차이가 나지는 않을 것입니다.
두 번째 막대와 세 번째 막대의 차이 정도만 보일 가능성이 높다고
생각됩니다. 둘째로 non-blocking 을 사용하면 이벤트 주도형 프로그래밍과
유사한 스타일의 코딩이 필요하기 때문에 프로그래머의 생산성이 급격히
떨어집니다. 훈련하면 좀 개선되기는 하지만 다중 쓰레드 방식의 코딩에
비해서는 늘 불편합니다. 하지만 극단적으로 단일 쓰레드까지 몰고 간다면
쓰레드 동기화를 고려하지 않아도 되기 때문에 응용에 따라 단순해지는
부분들도 생깁니다. 사실 파이썬에서 non-blocking 서버는 새삼스러운 일은
아닙니다. 아주 예전에 메두사(Medusa)라는 실험적인 서버가 있었고, 현재도
가끔 사용되는 것으로 보이는 트위스티드(Twisted) 가 있습니다. 메두사의
경우는 개발자를 위한 특별한 고려를 제공하지 않았던 반면, 트위스티드는
Deferred 라는 이름의 객체를 통해 최대한 동기 프로그래밍에 가까운
스타일을 제공하고자 했습니다. 이런 노력에도 불구하고 웹 서버를 GUI
프로그래밍하듯이 해야 한다는 불편함은 여전하고, 데이터베이스 등의 외부
객체들과 연결할 때 스타일을 유지하기가 어렵습니다. 토네이도에서 이
부분을 살펴보면 그다지 특별한 내용은 없습니다. 다만 기본은 동기 요청으로
취급되고, 개발자가 특별한 데코레이터로 지정하는 경우에만 non-blocking
요청으로 취급됩니다. 이벤트 주도형 프로그래밍은 꼭 필요한 곳에만 쓰자는
뜻으로 보입니다. 셋째로 새로운 웹 프레임워크로서의 특징을 갖고 있느냐
하는 부분인데 좀 어정쩡합니다. 자체 템플릿 시스템, 인증 모듈, 지역화
모듈 등을 제공하는 것은 웹 프레임워크로서의 형태를 갖추려는 의도로
보이는데, ORM(Object-Relational Mapper) 이 없습니다. 전체적인 평가를
내릴 시간입니다. 프로덕션 서버로 사용되는 파이썬은 인상적입니다만, 장고
등의 프레임워크에 비해 기능이 많이 부족합니다. WSGI 로 대표되는 파이썬
표준에 Non-blocking 을 위한 고려를 반영하는 방안을 생각해볼 때입니다.