동시성 향상 방안

주가정보를 가져와서 분석하고, 주문을 실행하는 일련의 과정을 어떻게 나누어 분산시켜야 컴퓨터의 능력을 최대한 활용할 수 있을까? 이 문제에 대해 고민중입니다.

흔히 쓰는 듀얼코어 CPU가 장착된 노트북과 같은 단일 머신의 경우 통상적으로 프로세서 개수는 듀얼코어와 하이퍼스레딩을 통해 4개의 논리적인 프로세서를 활용할 수 있으므로, 단계별로 작업을 수행할 프로세스들은 아래와 같이 구성할 수 있을겁니다. 물론 향후에는 클러스터링을 통해 Scalability를 증가시킬 수 있겠죠.

프로세스 구성

  1. 실거래 또는 백테스터 메인 프로세스 1개

  2. 주가정보 취득 2개

    주가정보 취득 프로세스 : 모든 종목의 정보를 단일한 특정 포트로 Publish (Network IO) 주가정보 저장 프로세스 : 상기 포트를 Subscribe하여 모든 정보를 저장 (Disk IO)

  3. 분석 및 감시 n개 (프로세서 개수 - 1 = 3개)

    기술지표 분석, 매수종목 선정, 보유종목 감시 모듈은 종목별 실시간 가격정보를 메모리에서 공유해야 하기 때문에 하나의 프로세스로 병합하고, (종목간 연관성 분석 등 상호참조 연산은 실거래중에는 하지 않음) 상대적으로 동 프로세스의 연산량이 많기 때문에 프로세서를 최대한 활용하여 분산처리할 수 있도록 동일한 프로세스를 n개 생성하고, 주가정보 취득 프로세스에서 보내온 가격정보를 n개 프로세스가 종목별로 분산처리(또는 별도의 머신에 분산시켜 연산 가능) 주가정보 취득 프로세스는 단일한 포트로 가격정보를 Publish하며, 분석 및 감시 프로세스 n개는 프로세스 생성시 할당된 조건에 해당하는 종목만 처리 1안) 끝에서 세번째 숫자 : Counter({‘0’: 343, ‘5’: 247, ‘1’: 244, ‘3’: 236, ‘6’: 235, ‘2’: 234, ‘4’: 234, ‘8’: 231, ‘9’: 223, ‘7’: 211} 2안) 끝에서 두번째 숫자 분포 : Counter({‘0’: 294, ‘1’: 267, ‘2’: 261, ‘6’: 251, ‘7’: 241, ‘8’: 238, ‘9’: 236, ‘4’: 227, ‘5’: 216, ‘3’: 201, ‘A’: 6}) 3안) 끝자리 숫자 분포 : Counter({‘0’: 2185, ‘5’: 107, ‘1’: 31, ‘7’: 23, ‘3’: 18, ‘9’: 15, ‘2’: 15, ‘6’: 14, ‘4’: 13, ‘8’: 8, ‘K’: 4, ‘R’: 4, ’S’: 1})

  4. 리스크 관리 1개

    분석 및 감시 프로세스가 찾아낸 매수/매도 종목에 대한 주문 실행여부를 검토하고, 주문가능 수량을 산출하여 아래 프로세스로 전달

  5. 매매주문 실행 1개

    증권사 API를 통해 매매주문 실행하고, 체결결과 및 체결오차 등 결과를 아래 프로세스로 전달(이 프로세스만 윈도우 머신에서 동작要)

  6. 거래결과 보고 1개

성능측정

  • 주가정보 취득 프로세스가 특정 종목의 가격정보를 Publish한 시각
  • 분석 및 감시 프로세스가 Subscribe한 시각 : Network Latency 증가폭을 측정하여 고성능 단일머신 대비 RaspberryPi3 등 저성능 머신 클러스터링의 효과성/경제성 검토
  • 분석 및 감시 프로세스가 연산을 끝낸 시각 : 하나의 프로세서 또는 머신이 소화할 수 있는 종목수의 임계점을 찾아내기 위함

Yoonbae Cho

Hobbyist Programmer and Photographer

South Korea https://xcv.kr