[연재] 다시는 안 터지게 했습니다 — 감시자 한 명과 계산 방식 하나
3초마다 볼 필요가 있나요
패닉이 난 날 저녁, 감시자부터 만들었습니다. 이름은 memguard. 처음에는 3초마다 맥의 메모리를 확인하게 짜 놓았습니다. 빨리 볼수록 안전할 것 같았거든요.
그걸 보고 제가 물었습니다. 「3초마다 보면 문제있는 거 아니냐」, 그리고 「굳이 3초여야 하냐고. 한 5분이면 안되는 거야?」
이 질문이 설계를 바꿨습니다. 답은 이랬어요. 5분은 위험합니다. 오늘 패닉은 맥이 93초 동안 응답하지 못해서 났으니, 5분 간격이면 감시자가 확인하러 오기 전에 맥이 먼저 멈출 수 있어요. 반대로 3초일 필요도 없었습니다. 30초면 한 번 놓쳐도 다음 확인이 93초 안에 들어옵니다. 감시자가 맥에 주는 부담은 3초일 때 CPU 0.9% 정도였고, 30초로 늘리면 그 10분의 1입니다.
그래서 30초로 정했습니다. 빠르게 보면 좋은 게 아니라, 멈추기 전에 두 번은 볼 수 있는 간격이면 충분했던 거예요.
감시자의 규칙
memguard 규칙은 단순합니다. 30초마다 둘을 봅니다.
- 한 작업이 5GB를 넘으면 끊는다.
- 맥 전체가 빠듯하면 가장 큰 작업부터 끊는다. 빠듯하다는 기준은 메모리 여유가 20% 아래로 내려가거나, 스왑이 3GB를 넘을 때입니다.
끊는 방법도 정해 뒀습니다. 먼저 종료해 달라고 부탁하는 신호(TERM)를 보내고, 5초가 지나도 안 꺼지면 강제로 끕니다(KILL). 끊을 때마다 기록을 남기고 알림을 띄워요.
끊는 대상은 AI 도구(클로드, agy)와 예약 작업(cron)이 띄운 작업뿐입니다. 제가 쓰는 크롬이나 앱은 건드리지 않아요. 작업별 최대 메모리도 기록(peaks.json)해 둡니다. 다음에 같은 작업을 돌릴 때 얼마나 쓸지 미리 알려고요.
지금 이 감시자의 기록에는 시작했다는 두 줄만 있고, 끊은 기록은 없습니다. 좋은 소식이라고 생각하는데, 한편으로는 아직 한 번도 시험대에 오르지 않았다는 뜻이기도 합니다.
감시자는 그물일 뿐입니다
감시자를 세우고 나니 알게 된 게 있습니다. 이건 사고를 작게 만드는 그물이지, 일을 되살리는 장치가 아니라는 겁니다. 5GB에서 끊기면 맥은 살아남지만, 그 계산은 중간에 죽어요. 같은 계산이 매번 5GB를 넘으면 끊기기만 하고 아무것도 끝나지 않습니다.
그래서 진짜 고칠 곳은 계산 방식이었습니다.
지형을 띠로 잘라 읽기
고도 단면을 만드는 단계는 전투 지역의 지형 자료를 통째로 메모리에 올렸습니다. 지도 한 장을 책상에 다 펼쳐 놓고 일하던 셈입니다. 이걸 가로로 얇은 띠로 나누어, 필요한 띠만 올려 계산하고 다음 띠로 넘어가게 바꿨습니다. 음영 지형 이미지를 만드는 단계와 경로 계산 단계도 같은 방식으로 고쳤고요.
동시에 도는 작업도 둘에서 하나로 줄였습니다.
결과는 이렇습니다.

고치기 전과 후의 전투별 최대 메모리, 그리고 감시자 설정. 3~3.6GB 또는 약 30GB(추산)였던 값이 2GB 안팎으로 내려왔습니다.
가장 큰 요동 전투가 1.94GB, 진이 오를 정벌한 280년 전투가 2.19GB, 초한지 영포 토벌이 약 1.9GB였습니다. 30GB로 추산되던 전투가 2GB 안에서 끝난 겁니다. 다만 한 가지는 솔직히 적어야 해요. 다섯 개를 이어서 돌릴 때 합계 최고가 2,551MB였습니다. 목표로 잡은 2.5GB를 약 50MB 넘긴 값이에요. 하나만 돌리면 1.9~2.2GB입니다.

진이 오를 정벌한 280년 전투의 고도 단면. 고친 뒤 이 전투의 최대 메모리는 2.19GB였습니다.
고쳤는데 결과가 달라졌다면
방식을 바꿨는데 그림이 달라지면 안 됩니다. 그래서 고치기 전 코드로 만든 결과와 고친 뒤 코드로 만든 결과를 나란히 비교했어요. 경로 4구간과 전투 4개 모두 데이터가 완전히 같았고, 그림도 화소 차이가 0이었습니다.
고치다 부딪힌 일도 하나 있었습니다. 낮은 우선순위로 띄운 부모 프로세스를 물려받으면 일꾼 프로세스가 곧바로 죽어 버렸어요. 우선순위를 낮추는 명령이 권한 오류를 내서였고, 오류를 무시하게 고쳐서 풀었습니다.
고친 코드는 공통 엔진에만 들어 있습니다. 삼국지와 초한지 폴더 안에 예전에 복사해 둔 스크립트에는 안 고쳐서, 거기서 돌리지 말라고 기록해 두었습니다. 이 복사본 문제는 다음 글의 주제가 됩니다.
삼국지 아틀라스는 여기서 볼 수 있습니다: https://victor-house.com/sanguo/