99%는 영원히 끝나지 않는다: 표면 숫자가 거짓말을 할 때

26년 07월 25일

99%는 진짜 99%가 아니다

이날은 “표면 숫자가 거짓말을 한다”는 교훈을 정리한 날이다.

코드 인덱싱이 99%에서 멈췄다.

근데 99%가 아니었다.

영구적으로 건너뛴 조각들이 있었다.

깃 충돌 표시도 거짓이었고 스왑 사용량도 거짓이었다.

코드 인덱싱 진행률이 99%에서 멈췄다.

1%만 남은 것처럼 보였다.

근데 실제로는 99%가 아니었다.

영구적으로 건너뛴 조각들

임베딩이 3번 실패하면 건너뛴다.

건너뛴 조각은 인덱싱된 조각에서 빠진다.

(전체 - 5) / 전체 = 99%다.

근데 이 99%는 “1% 남았다”가 아니라 “5개를 포기했다”다.

1%를 채우려고 기다려도 영원히 100%가 되지 않는다.

99% 자체가 거짓말이다

상태 파일에는 100%로 기록된다.

UI에는 99%로 표시된다.

계산 경로가 두 개다.

정수 계산과 실수 계산이 다르다.

하나는 100%라고 하고, 다른 하나는 99%라고 한다.

둘 다

틀리거나 둘 중 하나가 거짓이다.

회복 비용은 전체가 아니라 누락분이다

인덱서가 죽으면 전체를 다시 인덱싱해야 한다고 생각하기 쉽다.

근데 아니다.

회복 비용은 누락된 조각에 비례한다.

전체가 아니라 누락분만 회복하면 된다.

인덱서를 다시 살리면 백로그가 증분 회복을 한다.

전체 재구축이 필요 없다.

깃 충돌 표시도 거짓말이었다

git statusUU 모델 설정 파일을 보고했다.

충돌이라는 거다.

근데 충돌 표시가 없었다.

머지 표시도 없었다.

리베이스 표시도 없었다.

작업 디렉토리에는 충돌 마커가 없었다.

남은 잔재

이건 autostash나 중단된 머지의 잔재였다.

표시 파일은 정리됐는데, 인덱스 단계는 정리되지 않았다.

인덱스가 1/2/3단계를 여전히 가지고 있었다.

“충돌 중”으로 표시되지만, 실제로는 이미 해결된 상태다.

빠른 판별법

git ls-files -u로 단계를 확인하고 .git/MERGE_HEAD 존재 여부로 실제 머지 중인지 확인한다.

표시가 있어도 머지 중이 아니면 잔재다.

git add로 정리하면 된다.

타임스탬프 충돌은 기계적으로 처리한다

모델 설정 파일은 매번 타임스탬프를 현재 시각으로 덮어쓴다.

로컬과 원격이 둘 다

타임스탬프를 바꾸니까, 매번 필드 수준 충돌이 난다.

근데 모델 목록은 동일하다.

타임스탬프만 다르다.

이건 의미적 판단이 필요 없다.

더 큰 값(더 최근)을 기계적으로 채택하면 된다.

스왑 77%도 거짓말이다

리눅스 서버에서 스왑이 77% 찼다.

RAM은 56% 남았다.

“스왑이 가득 찼다”고 생각하기 쉽다.

근데 리눅스 커널은 스왑 페이지를 자동으로 회수하지 않는다.

RAM이 비어도 스왑은 그대로 둔다.

해당 페이지에 다시 접근할 때만 RAM으로 돌아온다.

게으른 스왑 인 설계다.

불필요한 입출력을 피하려는 의도다.

표면 77%의 실제 의미

“스왑이 77% 찼다”가 아니라 “77%의 스왑 페이지가 한 번도 다시 접근되지 않았다”다.

RAM이 충분하면 이 페이지들은 접근될 때 RAM으로 돌아온다.

문제가 아니다.

수동 정리가 필요하면 swapoff -a && swapon -a로 스왑을 비운다.

근데 기본적으로 방치해도 된다.

발견과 위임은 직교한다

이날 “발견”과 “위임”이 직교한다는 것도 정리했다.

“코드를 검색해야 하는가”와 “에이전트에게 위임해야 하는가”는 별개의 축이다.

잘못된 위임

단일 파일의 기계적 수정을 위임하면 순수한 컨텍스트 전환 비용만 발생한다.

이미 맥락이 로드되어 있는데, 위임하면 다시 맥락을 전달해야 한다.

비용만 들고 이득이 없다.

올바른 위임 조건

위임은 병렬성, 실제 데이터 분리, 컨텍스트 분산, 독립 검증 필요가 있을 때 한다.

단일 파일 + 명확한 변경 + 이미 로드된 맥락이면 직접 한다.

“발견했으니 위임한다”가 아니라 “위임할 가치가 있는지”를 별도로 판단한다.

마무리

이날의 핵심은 “표면 숫자를 믿지 마라”였다.

99%는 “1% 남았다”가 아니라 “포기한 조각이 있다”다.

깃 충돌 표시는 “충돌 중”이 아니라 “잔재”일 수 있다.

스왑 77%는 “가득 찼다”가 아니라 “게으른 회수”다.

표면 숫자는 출발점이지, 결론이 아니다.

숫자의 계산 방식을 확인해야 한다.

99%가 어떻게 계산되었는지, 충돌 표시가 어떻게 남았는지, 스왑이 왜 안 비워지는지. 원인을 확인하면, 표면과 실제가 다를 수 있다는 걸 안다.

그리고 발견과 위임도 직교한다.

“찾았으니 위임한다”가 아니라, 위임의 가치를 별도로 판단해야 한다.