프로그래머의 일상: race-condition, 글쓰기, …

Race condition

5월 말에 예비군 훈련을 다녀오고나니 (…), 내가 작성한 C++/Win32 기반의 서버 런타임에 문제가 발생했더라. 정확한 요인은 모르겠지만, 메모리 사용량이 팍 뛰었고, 32bit 프로세스의 한계로 사망 -_-

다행히 ipkn이 작성한 부하 테스트 툴로 원인을 좁힐 수 있었다. 해당 프로세스에 미리 할당하는 소켓 수 이상으로,

  1. 연결을 계속해서 맺고
  2. 과다한 트래픽을 흘려보내고,
  3. 다시 끊고

…을 수 시간 반복하면 서버가 크래시하더라.

이미 수 개월 동안의 라이브 서비스 동안 별 문제 없어서 안정화 끝났다라고 생각했는데 그게 아니었던 모양.

처음 찾은 버그는 이런 거였다. 대략 소켓 래퍼 객체의 참조 카운트를 가지고 최종적으로 할당된 자원을 재활용하는데, 단 하나의 시나리오에서 이 패킷 버퍼와 소켓의 참조 카운트 해제하는 순서가 반대(…)로 되어있더라. 그래서 대략 k 시간의 코드 리뷰 후에 잡았음. 그나마 패킷 버퍼 쪽에서 문제가 되는 코어 덤프가 있었으니 Orz.

…그리고 이 상태로 다시 부하 테스트 시작. 또 죽는다? 다행히도 디버그 빌드에서도 재현이 된다. 문제는 heap corruption이라는 것? -_-;; 정확히 1 bytes가 0로 셋팅되더라. ((Win32 DEBUG heap이 마킹해주는 덕에 이건 파악할 수 있었다. 정말 다행임)) 그래서 서버 런타임 전체에서 1바이트 세팅하는 코드를 전부 뒤졌다.
그 결과, 일부 per-thread 타이머 객체가,

  • 해당 스레드에서 타이머 객체가 종료되어 자원 해제
  • 다른 스레드에서 해당 타이머 객체 invalidate

하는 경우가 있을 수 있더라. 역시나 참조 카운터 문제 -_-; 선형화처리 코드는 들어가 있지만, 해당 객체가 살아있다는 보장이 없는 상황이라, 대부분 잘 돌지만(…) 이렇게 레이스가 일어나면 얼마든지 맛이 갈 수 있더라;

이 두 가지 문제 해결하고나니 대략 (눈에 보이는) 버그는 잡은 거 같지만…
일단 부하 테스트는 잘 버티고 있다.

…근데 애초에 문제가 되었던, 갑자기 메모리 사용량 1G 점프하던건 뭐였을까? 십중팔구는 처리가 늦어지고, 그에 따라 센드 큐가 늘어나고, 그에 따라 처리가 더 늦어지고(…) 하는 악순환의 결과였던 거 같지만 -_-;

만약 크래시 덤프도 없고, 디버그 모드에서 재현 못했으면 어쨌을지를 생각하니 좀 끔찍하긴 하구나 -_-;

글쓰기

역시 공대생을 위한 글쓰기 수업을 들었어야 했나 -_-;
내가 얘기하고자 하는 부분이 아닌 걸 계속 써야하나?

예전에 책 번역 할 때도, 영어보다 한국어 실력이 더 문제란 느낌이었으니 에휴.

Jinuk Kim
Jinuk Kim

SW Engineer / gamer / bookworm / atheist / feminist

Articles: 935

5 Comments

  1. 메모리 그거.. 우리도 겪고 있다능…ㅎㄷㄷ
    일단 VirtualAllocEx와 HeapAlloc을 후킹해서 트랩 깔아놓고 라이브로 내보낼 생각중.. 일단 Windows socket 버그로 추측은 하고 있는데 다른 프로젝트에서도 생기는걸 보니 맞을지도..

      • 일단 오늘와서 다시 뒤져본 바로는 딱히 윈도우즈 문제는 아닐 듯 합니다. 자세한 건 좀 더 해부(?)한 후에…

    • 어지간해서는… OS 문제로 보긴 힘들죠 ^^; 일단 OS정도는 믿고 시작해야 ㅋ
      OS를 못믿으면, Ethernet Driver도 못믿고, IP도 못믿고, 라우터도 못믿고 응?;;;

      물론 임베디드 시장은… OS 문제도 있긴합디다. (나름 오래된 OS라고 해도 새버젼 나오면 버그들이 조금씩 ^^)

      • 근데 현재 상황이 다른 변경 사항…이 아예 없는 건 아니지만,

        프로그램 수정 사항이 없는 상태에서,
        서로 무관한 TCP 기반의 네트워크 서비스 2 개가
        메모리가 이상하게 많이 할당되는 문제를 겪었다

        라는 점에서 좀…

        공통점이래봐야 윈도우즈 업데이트 직후다 정도밖에 없거든요(…). 물론 윈도우즈 패치가 버그가 있는게 아니라, 그걸로 인해 빨라지거나 (아마 아니겠지만) 느려진 부분 때문에 버그가 드러났을 가능성이 높다고 생각합니다.

Leave a Reply