Skip to content
dev-marco-song
Go back

서버 CPU의 코어 갯수 증가로 인한 오류 발생 정리

Edit page

서버 CPU의 코어 갯수 증가로 인한 오류 발생 정리

로컬 환경에서 서버를 빌드하여 실행하던 중 발생한 이슈를 정리합니다.

로컬에서 버전 서버(VersionServer.exe) 를 실행시 10~30초 정도 동작하다가 정지하는 문제가 발생하였습니다. (나머지 6개 서버는 정상 동작)

윈도우즈 이벤트로그를 통해 확인해본 에러 내용은 다음과 같습니다.

오류 있는 모듈 이름: ntdll.dll, 버전: 10.0.17134.556, 타임스탬프: 0x319e0a75 예외 코드: 0xc0000005 오류 오프셋: 0x00023259 오류 있는 프로세스 ID: 0x2e3c 오류 있는 응용 프로그램 시작 시간: 0x01d4dd2c8718fba0 오류 있는 응용 프로그램 경로: D:\SVN\NLCSProgram\MilkChoco\VersionServer\Debug\VersionServer.exe 오류 있는 모듈 경로: C:\Windows\SYSTEM32\ntdll.dll 보고서 ID: 2e41f755-3c5e-4be1-b9b3-b59a6c54980e 오류 있는 패키지 전체 이름: 오류 있는 패키지에 상대적인 응용 프로그램 ID:

에러가 발생한 파일과 예외 코드를 다시 살펴보았습니다.

ntdll은 자주 사용되는 windows api의 일종이고, NT Kernel function 의 모음입니다. 커널모드 동작과 관련되는 것까지 파악을 했습니다.

에러 코드인 0xc0000005 는 액세스 위반으로 발생하는데, 메모리 할당이 되지 않은 포인터에 액세스하거나, 할당받은 이상의 데이터가 담길 때 발생합니다.

에러 메시지를 구글링한 결과, 원인으로 제시된 내용은

하드웨어 드라이버 충돌, 바이러스/맬웨어, 하드웨어, 운영체제 등 광범위했습니다.

드라이버 재설치, 바이러스 검사 등을 시도했으나 해결되지 않았습니다.

윈도우에 문제가 있다고 판단하고 윈도우를 포맷하는 것도 고려해보았으나, 그 문제는 아닌 것 같다는 다른 분들의 판단이 있어 보류했습니다.

버전 서버의 소스 코드에 문제가 있다고 가정하고 브레이크포인트를 찍어가며 디버깅하여 해결했습니다.

문제가 발생한 곳은 서버에서 워커 스레드를 생성하는 부분이었는데요, 제 데스크탑의 경우 8코어 16스레드인데,  이는 다른 분들이 사용하시는 컴퓨터보다 코어 수가 많습니다.

evernote_image_1.png

서버에서 생성할 수 있는 최대 워커스레드의 갯수는 16개인데,  (MAX_WORKER_THREAD = 16)

제 CPU로부터 생성되는 워커 스레드의 갯수가 이를 초과하게 됩니다.  따라서 CPU가 제한된 갯수의 워커 스레드를 생성하도록 하는 예외 처리가 필요했습니다.

이에 워커 스레드 갯수가 최대 워커스레드를 초과하지 않도록 min 함수를 사용하여 해결했습니다. (도움 주신 제이든께 감사드립니다.)

// -> 16개 이하의 워커스레드 생성 min( 본인 스레드 수 *2 , MAX_WORKER_THREADS)

그러나 이는 완벽한 해결 방법은 아닙니다. 만약에 코어가 16개보다 많은 서버를 사용한다면? 워커 스레드 수 < 서버의 사용 가능 스레드가 되어 서버의 모든 스레드를 활용할 수 없게 됩니다.  코어 수가 많아졌을 때 동적으로 워커스레드 수를 생성할 방법이 필요해 보입니다.

코어가 많은 장비로 게임 서버를 구동하고자 할 때, 이런 이슈가 참고가 될 수 있습니다.


Edit page
Share this post on:

Previous Post
2019년 카카오 컨퍼런스 견학 후기
Next Post
에버노트 플러그인을 이용해 티스토리 연동하기