Load test report · SSE 실측 · 주문 분리

부하테스트보고서

동시 접속(SSE)과 동시 주문을 분리해 측정합니다. 2026-08-12 Railway dev에서 load-sse full-tab 실측 — 500명 100%·1000명 94.6%. realtime 1대 운영 한도는 full-tab 가상 유저 약 900명( SSE ≈4500 )으로 가정.

동접: scripts/load-sse.ts · Railway load-sse. 주문: scripts/load-orders.ts · Railway load-test — 별도 시나리오·별도 RPC 부담.

목표 동접
~1000
SSE / 유저 (full-tab)
5
1대 운영 한도 (가정)
~900
SSE ≈4500
최근 실측
94.6%
1000명 full-tab

테스트 분리 (동접 vs 주문)

동시 접속 (SSE)

가상 탭 N개 × SSE( full-tab 시 presence·호가×2·체결·미체결 ). realtime·Redis·Online 카운터.

스크립트
scripts/load-sse.ts
Railway
load-sse
RPC 영향
거의 없음 (RPC 소모 적음)
상태
실측 진행 중 (2026-08-12)

동시 주문

executeServerPlaceOrder를 count번 동시 호출 (HTTP 없음). 온체인·RPC·trade-api 경로.

스크립트
scripts/load-orders.ts
Railway
load-test
RPC 영향
높음 — Helius 크레딧 소모. SSE 테스트와 시간대 분리 권장
상태
실측 대기 (동접 안정 후)

동시 접속 실측 (load-sse)

r10002026-08-12 KSTRailway dev · southeast-asia

full-tab 1000명 · ramp 100/2s · hold 60s

가상 탭 1000 × SSE 5 = 5000연결 · 소요 92s · 성공률 94.6%

부분 통과
스트림openedfail
presence94654
priceTicker94654
priceChart94456
fills94159
openOrders94258

Online: before 1001 → peak 633 → after 1

  • 후반 웨이브에서 fetch failed ~54건 (스트림당). 스크립트 80% 통과 기준(800+) 충족.
  • peak Online(633) < presenceOpened(946) — 램프 중 health 스냅샷 타이밍·비동기 연결 차이.
  • 테스트 후 Online after=1 — 이번엔 뻥튀기 잔여 적음.
r05002026-08-12 KSTRailway dev · southeast-asia

full-tab 500명 · ramp 100/2s · hold 60s

가상 탭 500 × SSE 5 = 2500연결 · 소요 76s · 성공률 100%

통과
스트림openedfail
presence5000
priceTicker5000
priceChart5000
fills5000
openOrders5000

Online: before 501 → peak 472 → after 1

  • full-tab 첫 실측 — 전 스트림 500/500 성공.
  • 총 소요 ~76초 (램프 ~8초 + 버퍼 2초 + hold 60초).
  • MaxListenersExceededWarning(AbortSignal) — load-sse 클라이언트 경고, 서버 영향 없음.

동시 주문 실측 (load-orders)

아직 실측 없음. railway up --service load-test로 별도 실행. SSE 테스트와 시간대를 분리해 RPC 경쟁을 줄입니다.

현재 기본 한도 (참고)

항목기본값이유
SSE_MAX_CONNECTIONS_GLOBAL4000full-tab 5스트림 기준 ~800유저 + 여유 (실측 1000유저는 5000 SSE)
SSE_MAX_CONNECTIONS_PER_IP120통신사 CGNAT·사내망 공유 IP
RATE_LIMIT_TX_SEND_PER_MIN180UI 주문 전송 · 공유 IP 감안
RATE_LIMIT_VERIFY_PER_MIN180주문 후 온체인 verify
RATE_LIMIT_ORDERS_PER_MIN60서버 서명 API — load-orders와 별개

호가 · 증설 (메모)

SSE 연결 수는 Railway realtime replica로 나눌 수 있습니다. full-tab 기준 1대 ≈ 900유저( SSE ≈4500 )는 2026-08-12 dev 실측 가정입니다.

Online 카운터는 프로세스 메모리 — load-sse가 abort로 끊으면 -1이 안 되어 뻥튀기될 수 있음. 테스트 후 realtime 재시작 권장.

더 키울 때는 아키텍처의 realtime + Redis pub/sub·로드밸런서를 참고하세요.

발견 · 조치 (8)

l0700load-sse · Railway dev

full-tab 500명 — realtime 1대 100% 성공

가상 탭 500 × SSE 5 = 2500연결. ramp 100/2s, hold 60s. 전 스트림 fail=0.

실측

도구: scripts/load-sse.ts, 서비스 load-sse, REALTIME_URL=realtime internal. 소요 ~76s. Online before 501 → peak 472 → after 1.

다음 · 1000명 램프 실측으로 한도 확인 (완료 → l0800).

l0800load-sse · Railway dev

full-tab 1000명 — 94.6% 성공, 운영 한도 ~900명 가정

946/1000 탭 연결. 후반 fetch failed ~54. 80% 통과 기준 충족. 1대당 full-tab ~900명 보수적 운영선.

실측

SSE 5000 목표 중 presence 946 성공. peak Online 633. ingest/RPC는 부하 적음. 5k presence-only(이전)와 달리 full-tab이 실사용에 가깝다.

다음 · 2000명 또는 주문 부하(load-orders)는 SSE와 시간 분리. Online 뻥튀기 시 realtime 재시작.

l0100subscribeMarketPrice

호가 SSE마다 Solana accountSubscribe를 열던 구조

동시 1000명이면 같은 마켓 WS가 1000개가 되어 RPC가 먼저 한계에 달함.

코드 반영

price/stream·open/stream이 연결마다 onAccountChange를 생성했음. fill watcher는 원래 마켓별 공유.

다음 · 마켓당 구독 1개 + 리스너 fan-out. full-tab 실측으로 RPC 안정성 재확인.

l0200security/config

SSE·레이트리밋 기본값

전역 4000·IP 120·tx/verify 180. replica마다 인메모리 한도 별도.

코드 반영

full-tab 1000유저는 raw SSE 5000 — 전역 4000 한도와 정합성 재검토 필요.

다음 · 부하 시 429/503·어느 IP에서 막히는지 로그 확인.

l0300Trade UI · load-sse

유저당 SSE = 5개 (full-tab)

presence + 호가(티커) + 호가(차트, presence=0) + 체결 + 미체결. --no-open-orders 시 4개.

실측

이전 가정(≈3)은 미체결·Online 제외. Zenith load-sse --full-tab이 Trade UI와 동일.

다음 · 멀티탭·지갑 미연결 비율 반영 시 가정 보정.

l0400Railway replica

realtime 증설 — full-tab ~900유저/대

SSE 연결은 수평 분산 가능. 2000 full-tab 목표면 realtime 3대 안전선.

인프라

Online·presence 카운터는 프로세스 메모리 — 비정상 종료 시 +1만 남음(재시작으로 리셋). Redis pub/sub으로 다중 인스턴스 동기화는 이미 사용.

다음 · 로드밸런서 + replica 2대 A/B 실측.

l0500SOLANA_RPC_URL

유료 Solana RPC

주문 부하·ingest가 RPC 공유. SSE만으로는 크레딧 소모 적음.

인프라

5k presence-only 테스트 후 ingest 429 관측 이력 — 주문 부하 전 RPC 여유 확인.

다음 · load-orders 램프 전 Helius 잔량 확인.

l0600load-test

동시 주문 부하 (load-orders) 미실시

동접 SSE와 분리. executeServerPlaceOrder count건 동시 — RPC·온체인 성공률 측정.

실측 대기

Railway load-test 원샷. MAX_CONCURRENT_ORDERS 기본 1000. SSE 테스트와 동시 실행 시 RPC 경쟁.

다음 · LOAD_TEST_COUNT 램프 10→50→100… SSE 안정 구간에서 실행.

테스트 계획

  1. 1. 유료 RPC 준비완료
    • SOLANA_RPC_URL Helius 사용 중
    • 주문 부하 전 잔량 확인
  2. 2. SSE 동접 — load-sse full-tab완료
    • 500명 full-tab 100% (r0500)
    • 1000명 full-tab 94.6% (r1000)
    • ramp 100/2s · hold 60s · dev만
  3. 3. SSE 중·대규모대기
    • 1500~2000 full-tab (900/대 가정 검증)
    • railway metrics realtime·Redis CPU/RAM
    • Online 뻥튀기 시 realtime 재시작
  4. 4. 주문 경로 (UI)대기
    • 동시 소수 지갑 prepare → sign → tx/send → verify
    • 공유 IP tx/verify 180/분 근처
  5. 5. 서버 서명 load-orders (별도)대기
    • railway up --service load-test
    • LOAD_TEST_COUNT 램프 · 온체인 성공률
    • SSE 테스트와 시간대 분리
  6. 6. realtime 증설 A/B대기
    • replica 1대 vs 2~3대 동일 full-tab 부하
    • SSE 성공률·지연