DEV Community

finaltype
finaltype

Posted on Originally published at finaltype.github.io

"[260929] R9700 백업 GPU 전멸 사고, 두 번 틀린 원인 진단"

어젯밤 붙인 자가치료가 이번엔 전혀 먹히지 않았고, 빠진 종목을 되살리는 과정에서 원인 진단을 두 번이나 다시 뒤집었습니다.

어젯밤 붙인 자가치료가 이번엔 안 먹혔다

어제(새 창) 죽은 처리창(슬롯)을 지우고 되살리는 자가치료 로직을 백업 GPU 경로에 붙였습니다.

그날 밤 재현 실험에서는 100번 전부 정상 처리돼서 이제 믿을 만하다고 판단했습니다.

그런데 정식 운영 첫날 밤, 새벽 두 시경 슬롯 하나가 죽더니 한 시간여 만에 네 개 처리창이 전부 죽어버렸습니다.

자가치료가 200번 넘게 발동했지만 거의 살려내지 못했습니다. 그사이 한 처리 단위는 종목 하나를 처리하다 45분 동안 붙잡혀 있다가 시간초과로 강제 종료됐고, 결국 전체 작업은 목표치의 절반도 못 채운 채 멈춰버렸습니다. 이후 몇 시간 동안 GPU만 헛돌고 있는 걸 뒤늦게 발견해서 수동으로 정리했습니다.

AI에게 "사과해야 하냐" 물었다가 나온 답

며칠 전 다른 AI(자문 역할)가 "동시 처리 개수를 늘리자"는 제안을 반대했던 게 이번 사고와 관련 있는 건 아닌지 의심이 들었습니다.

그래서 그 AI에게 "이 지경이 됐는데 그 반대 의견에 대해 사과해야 하는 거 아니냐"고 따져 물었습니다.

AI는 로그를 다시 직접 뜯어보고 답했습니다. 동시 처리 개수를 반대한 판단은 사과할 일이 아니라고 했습니다. 오늘 사고의 기전은 그 설정과 무관했고, 오히려 그 설정을 다르게 갔다면 같거나 더 나빴을 거라는 결론이었습니다.

대신 사과할 부분은 따로 있다고 짚었습니다. "슬롯을 지우고 되살리는 치료만으로 충분하다"고 판단하고 서버 자체를 재시작하는 폴백을 뒤로 미뤄둔 것이었습니다. 실제로는 그 치료의 성공률이 거의 0에 가까웠습니다.

이 지적을 받아들여서 바로 다섯 가지를 코드로 고쳤습니다. 한 종목에 45분씩 붙잡히게 만들던 불필요한 호출 패턴을 없앴고, 치료한 슬롯이 금방 다시 죽으면 이번엔 서버 자체를 재시작하도록 격상하는 로직을 새로 붙였습니다.

그리고 어느 처리 단위도 한동안 결과를 못 내면 원인을 따지지 않고 재시작하는 안전장치, 재시작 시 이미 끝난 종목까지 다시 처리하지 않게 막는 수정, 치료 과정 증거를 남기는 옵션도 함께 넣었습니다.

아침 재개에서 8종목이 빈 채로 나왔다

새벽 작업이 중단된 지점부터 아침에 이어서 재개했는데, 목표한 100종목 중 8종목이 빈 채로 나왔습니다.

처음엔 외부 시세 조회 API 오류를 원인으로 지목했습니다. 다시 확인해보니 이건 무관했습니다. 그 오류가 나도 코드가 알아서 넘어가도록 이미 설계돼 있었습니다.

두 번째로는 어제 고친 재시작 로직 자체에 버그가 있는 게 아닌지 의심했습니다. 그런데 로그를 뜯어보니 그 재시작 로직은 오늘 아침엔 단 한 번도 실행되지 않았습니다. 애초에 발동할 상황 자체가 없었던 겁니다.

진짜 원인은 훨씬 단순했습니다. 정규장 시간에는 GPU 작업을 자동으로 멈추게 해둔 안전장치가 있는데, 이날 아침 수동으로 작업을 재개하면서 이 안전장치를 잠시 꺼두는 옵션을 빠뜨렸습니다.

그래서 정규장이 열리자마자 네 개 처리 단위가 각자 남은 몇 종목씩을 안전하게 멈춰버린 거였습니다. 예전에 한 번 겪었던 것과 똑같은 실수였습니다.

더 심각한 문제도 하나 더 나왔습니다. 빠진 8종목을 로그에 남아있던 마지막 값으로 채워 넣었는데, 다시 대조해보니 그 값이 오늘 것이 아니라 며칠 전 실행의 값이었습니다. 같은 로그 파일에 여러 날짜의 기록이 겹쳐 쌓여 있었던 걸 놓친 겁니다.

결국 로그값을 갖다 쓰는 대신 8종목만 따로 떼어서 실제로 다시 돌렸습니다. 이 과정에서 격리 실행을 감시하던 코드가 이미 끝난 프로덕션 결과 파일을 잘못 보고 "멈춘 줄 알고" 서버를 세 번이나 강제 재기동시키는 별도 버그도 발견해서 함께 고쳤습니다.

두 번의 시도 끝에 8종목 전부를 실제 재실행 결과로 채워서 100종목 전부를 확정했습니다.

정규장에도 끄지 않고 완주시켰다

이날 오전엔 직접 판단해서, 정규장엔 GPU 작업을 자동으로 멈추게 해둔 원칙을 이번 한 번만 명시적으로 무시하기로 했습니다.

이유는 단순했습니다. 자동 종료 시각까지 끝내야 할 이유가 딱히 없다고 봤기 때문입니다.

그래서 자동 종료 없이 끝까지 돌렸고, 오후에 100종목 전부 정상 산출되고 GPU도 깨끗하게 반납되는 것까지 확인했습니다.

부수적으로 정리한 것 두 가지

하나는 휴장일에 정기 작업 알림이 잘못 울리던 문제였습니다. 며칠 전 고쳤다고 판단했는데, 그 근거로 삼았던 "일요일에 알림이 없었다"는 확인이 사실 의미 없는 확인이었다는 걸 뒤늦게 알아챘습니다.

일요일엔 애초에 그 작업들이 요일 조건 때문에 처음부터 실행을 시도하지 않는 구조였습니다. 그래서 코드 자체 검증, 실제 셸 스크립트 동작 검증, 설치 상태 확인까지 세 겹으로 다시 검증해서 신뢰도를 확보했습니다.

다른 하나는 문서 정리였습니다. 승격된 결과에 대한 판정 로직 결함 하나가 문서엔 "아직 안 고침"으로 남아있었는데, 실제로는 며칠 전 이미 고쳐서 배포까지 끝난 상태였습니다. 기록만 낡아 있던 걸 찾아서 정정했습니다.

앞으로

다음 주말(10월 3일)에 이 백업 GPU 경로를 계속 지금 순서로 쓸지, 하드웨어 우선순위를 바꿀지 결정하는 시점이 옵니다.

오늘 겪은 전멸 사고와 여기서 나온 다섯 가지 처방이 남은 며칠간 실제로 안정적으로 버텨주는지가 그 결정의 핵심 근거가 됩니다.

Top comments (0)