멀티스레딩 트러블 슈팅 - 100-hours-a-week/12-marong-Wiki GitHub Wiki
📍 C++ 레벨 메모리 접근 충돌로 인한 장애 발생
- 멀티스레드 기반 추천 시스템 실행 시
max_workers
값을 과도하게 설정하면 프로그램이 즉시 종료되며 다음과 같은 메시지를 출력함:zsh: illegal hardware instruction python main.py
- 이는 내부적으로 C++ 레벨에서 잘못된 하드웨어 명령어 호출 또는 메모리 접근 충돌로 인해 발생한 비정상 종료(SIGILL) 현상임
✔️ 원인 분석
영역 | 원인 설명 |
---|---|
멀티스레딩 처리 | ThreadPoolExecutor 에서 max_workers 값을 과도하게 설정함 |
하드웨어 명령어 | NumPy, PyTorch, C++ 확장 모듈 내 SIMD 연산에서 부적절한 명령어 호출 발생 |
리소스 경합 | 과도한 스레드로 인해 CPU 코어 간 경쟁, 캐시 충돌, 메모리 접근 충돌 발생 |
✔️ 해결 방법
max_workers
값 도출
최적의 - 실험 결과, MacBook Air(M3, 8코어) 기준으로
max_workers=3
이 가장 안정적이고 빠름 - 해당 값을 고정값으로 설정하여 코드에 반영:
from concurrent.futures import ThreadPoolExecutor with ThreadPoolExecutor(max_workers=3) as executor: # 병렬 작업 처리 ...
✔️ 결과 및 회고
항목 | 잘못된 방식 | 수정된 방식 |
---|---|---|
스레드 수 설정 | CPU 코어 수와 무관하게 과도 설정 | 시스템 스펙 기반 적정 수로 제한 |
오류 원인 인식 | Python 단에서만 디버깅 시도 | 하드웨어 레벨까지 고려하여 분석 |
코드 유지보수 | 동적 설정 없이 하드코딩 | 안정성 기준에 따른 고정값 설정 |
- CPU 병렬성은 많다고 항상 좋은 것이 아님을 확인함
- 시스템 사양 기반의 실측 후 안정성과 성능의 균형을 고려한 보수적 접근이 필요
- C++ 레벨에서 발생하는 SIGILL 오류는 일반적인 Python 예외 처리로는 디버깅이 어려우므로, 리소스 제한 설정은 경험 기반 최적값으로 관리해야 함