프로젝트 / 서비스
산학 실시간 심전도 처리 서버
환자 여러 명의 심전도가 실시간으로 들어오는 서버를 팀으로 만들고, 그중 가상 환자 스트림 생성기와 부하테스트를 맡았습니다. 홈랩 VM 101에 팀 테스트 서버를 구축해 운영했고, 공개 데이터로 기준 AI 모델을 학습해 정확도와 판정 속도를 비교했습니다.
팀장 · 서버 (스트림 생성기·부하테스트) · 기준 AI 모델진행 중2026.09 ~PythonTCPMQTTRedis StreamsDockerPrometheusGrafanaPyTorchPhysioNet
직접 작성배운 점 7편 바로가기 ↓
30초 요약
서버 1대가 환자 몇 명까지 지연 없이 버티는지 숫자로 재고, 병목을 찾아 개선하려고 생성기와 부하테스트를 맡았습니다.
내가 한 일
- Proxmox ecg VM에 팀 테스트 서버 구성, 팀원 원격 접속
- 공개 데이터셋(PhysioNet)으로 가상 환자 스트림 생성기 작성
- TCP 연결 방식과 메시지 형식 설계, 3리드 데이터 전송
- 수신부·Redis Streams·워커 연결과 전체 시연
- Prometheus·Grafana를 붙여 환자 수별(6 → 20 → 50 → 100명) 부하테스트
- 생성기에 MQTT 송신 추가, 환자별 토픽으로 TCP와 비교 준비
- 공개 데이터(PTB-XL)로 기준 CNN 학습, 모델 6종 × 시드 3번으로 정확도와 판정 속도 비교
확인한 결과
- 6·20·50명에서 유실 0, 워커 처리 지연 p95 약 13ms · 27ms · 54ms
- 100명에서 유실 0이지만 워커 하나(w0)의 p95가 120ms → 1,010ms로 계속 증가
- 원인: 분석을 메시지마다 3ms로 가정해서 34명을 맡은 w0가 1초에 1.02초 분량 일을 해야 했음
- 후속 확인: 실제 판정은 처음 5초가 모이면 1번, 그 뒤로는 창을 밀며 1초마다 1번이라 가정보다 약 12배 가벼움. 실제 모델을 붙여 다시 잰 100명 결과는 유실 0, 판정 p95 약 102ms (팀원 측정, 맥북 기준)
- MQTT 송신: 10명 × 10초 유실 0, 지연 p95 1.3ms
- 기준 CNN 시험셋(학습에 안 쓴 환자): 민감도 0.929 · 특이도 0.883 · AUC 0.969, 5초 구간 판정 CPU 0.40ms
- 모델 6종 AUC 0.962~0.976으로 비슷, CPU 판정은 0.40~6.55ms로 16배 차이 → 경량 CNN 기준선, CNN+LSTM 최종 후보
- 1리드(II)로 줄여도 PTB-XL 시험셋 민감도 0.934 · 특이도 0.834 · AUC 0.963 (3리드 0.939 · 0.853 · 0.969)
- 실제 모델을 넣은 100명 부하테스트: 유실 0, 창 판정 p95 41ms(1리드) · 81ms(3리드)
- 외부 데이터(MIT-BIH 44개 기록) 그대로 적용: 민감도 0.978 · 특이도 0.428 — 정답 기준이 달라 오검출이 많았음
- 정답 기준을 목표 부정맥(PVC·심방세동)으로 맞추고 환자 단위 5-Fold로 추가 학습: 민감도 0.935 · 특이도 0.891 (목표 0.90 · 0.85 충족)
개요
팀 5명(서버 2, AI 3) 중 팀장이자 서버 담당입니다. 공개 데이터셋(PhysioNet)만 사용했고, 기업 데이터와 기업 정보는 이 페이지에 쓰지 않습니다.
생성기(나) → TCP·MQTT → 수신부 → Redis Streams → 워커 → R파 검출 → AI 판정 → 화면
관련 논문: 산학 실시간 심전도 서버 논문