본문 바로가기

backup

zeromq 또는 cep를 쓰는 빠른 HFT 거래 시스템?

HFT 시스템을 구축을 한다고 하면서 zeromq를 쓰려고 한다는 사람들을 보면 그걸 왜 쓰지라는 생각이 든다.


아래글에서 zeromq가 빠르다는 의미가 무엇인지에 대해서 이야기 한것 참고를 하면 좋겠다.

https://kldp.org/node/138232


zeromq를 이용해서 HFT시스템을 만들었을 때 장점? 정말 위의 글 처럼 std::queue를 쓸 때보다 나은점이 무엇인지 솔직히 하나도 모르겠다. 조금의 병렬프로그래밍만 할 수 있으면 그냥 차라리 std::queue가 더 빠르지 않을까?





zeromq광고하는 사람들이 스테로이드 받은 TCP, 혹은 TCP보다 빠르다고 하는데, 솔직히 TCP소켓 프로그래밍 잘못하면 속도 잘 안나올수는 있다. 하지만. zeromq가 통신할 때 사용하는 프로토콜이 TCP인데 어떻게 TCP보다 빨라질 수 있는가? TCP말고 IPC를 쓸 수도 있다. 그런데 zeromq같은거 없다고 ipc통신 못하는 것도 아니고, 오히려 오버헤드만 더 붙인다. zeromq가 더 빠르다는 것은 그냥 광고 문고일 뿐이다. 단 제대로 못 하면 zeromq보다 느릴 수는 있다.


정말 대용량의 수많은 컴퓨터들을 엮어서 대규모 분산환경을 구축한다고 한다면 그때 장점이 있을지는 모르겠다. 그런 상황에서 오류가 적고 안정적이라고 한다면 이해를 하겠다. 그러나 HFT 시스템에서의 상황은 전혀 그렇지가 않다. 최고의 빠르기를 위해서 심지어 코드 한줄이라도 줄이고, 변수하나 쓰는 것도 줄여야할 판에 중간에 그런게 들어온다는 것은 말이 안된다.  정말 프로그래밍하면서 이게 cpu 몇 클락 정도 먹을지를 생각하면서 개발하여야 한다.





물론 달랑 거래 시스템만 있는 것이 아니라 모니터링하고 여러가지 관리하고 시세 기록하고 로그 남기고 그렇게 하려면 message queue가 쓰일 수도 있다 하지만, 그 부분은 거래 시스템에 성능부하를 최소화한다면 어떠한 방법을 쓰더라도 상관없다. 최고정밀한 알고리즘이 아니라 그냥 서브 message 처리부분을 할 때 개발하기 조금 더 편하게 하겠다면 그 용도가 맞을지도 모르지만, zeromq를 쓴 빠른 HFT 시스템이라는 말 자체는 성립이 불가능하다.


HFT시스템 구축 관련 자료 보면서 한 때 CEP 툴이나 다른 Message Queue를 잠깐 써보기는 했는데, 이런 것 쓰면 절대 1ms 이하 시스템 못 만든다. 특히 어떤 곳에서는 CEP툴을 쓰면서 거래로직 자체를 CEP로 구현하는 경우도 있는데, 그럼 그냥 가볍게 몇 ms 넘어간다. 그러면서 꼭 광고에는 for문을 백만번 쯤 돌리면서 자기들의 처리 속도는 마이크로초 또는 나노초 단위라고 한다. 내부적으로 보면 병렬처리를 한 경우가 많다.


더욱이 CEP 같은 이벤트를 발생시켜서 모델의 경우 그냥 바로 for문을  이어서 작업을 하는 것이 아니라 시간차를 벌리고 실제 성능 테스트를 해봐야 한다. 이 경우 가장 시간을 잡아먹는 부분 중하나가 이벤트 대기 시간이다. 바로 이어서할 작업이 없다면 쓰레드는 spinwait 같은 걸로 다른 쓰레드에게 처리할 시간을 주고 대기를 하게 된다. 그리고 대기를 하다가 한번씩 새로운 작업이 들어왔는지 확인을 하고, 다시 잠들고 그런 과정을 반복한다.  그렇게 이벤트 대기를 하고, 깨어나서 work thread에 일거리를 넘겨주는 과정에서 시간을 많이 잡아먹는다. 그런데 for문을 돌려서 한 경우 이게 드러나지 않는다. 결국 성능이 좋다고 그냥 쑈한번 보여준 것이다. 이런 걸로 그게 성능이 좋다고 착각을 하면 안된다. 그 외에도 단순 for문 반복 테스트는 메모리 캐쉬 문제 등등에서 일반적인 상황과 다른 결과를 도출하게 된다.





어쨌든 정말 HFT시스템을 구축하고 싶다면, zeromq보다는 TCP프로그래밍 실력과 병렬프로그래밍능력을 키우는 것을 권장한다. zeromq를 깔려는 것은 아니다 zeromq도 많은 개발자들이 붙어서 오랜 시간 공들여서 만든 좋은 시스템이다. 하지만, HFT 거래시스템에서 시세를 받아서 넘기고 살지말지 판단을 하고 주문을 내리는 과정에서 핵심 메세징 기능으로 사용하기에는 용도가 다르다는 것이다. CEP툴들도 마찬가지이다. 좋은 CEP툴들은 많다. 하지만 모든 CEP툴들은 거래의 핵심 메세징 기능으로 쓰기에는 무겁다. zeromq로 만들어서 빠른 HFT시스템이라고 광고를 한다면 그냥 중급이상의 네트워크 프로그래밍이나 병렬프로그래밍실력이 없다는 것을 자랑하거나 아니면 정말 광고할 문구가 없구나라고 생각하면 될 것이다.