멀티스레딩 트러블 슈팅 - 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 예외 처리로는 디버깅이 어려우므로, 리소스 제한 설정은 경험 기반 최적값으로 관리해야 함