토네이도(Tornado) - 프랜드피드의 웹 서버

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