6편에서 네이버 크롤링 열두 번째 실험을 끝으로 멈췄다. 두 IP가 그날 하루 동안 이미 너무 지쳐 있어서, 어떤 개선을 넣어도 그날은 결과를 믿을 수 없었다. 다음에 재개하면 가장 먼저 확인할 것 하나만 남겨뒀다 — 완전히 식은 상태에서 실전 스케일 전체가 한 번에 끝까지 도는지.
9시간을 쉬고, 처음으로 완주했다 — 삼성 59% vs LG·HD현대·LS 0%
밤새 9시간을 쉰 뒤 21개 타깃 전체를 다시 돌렸다. 1시간 28분 만에 끝까지 멈추지 않고 완주했다 — 동시성을 IP당 2개로 제한한 이후 처음이었다. 다만 완전히 깨끗하지는 않았다. 203개 키워드 중 51개만 완전 클린이었고, 98개는 단 한 건도 성공하지 못했다.
그런데 이 실패를 그룹별로 나눠보니 격차가 뚜렷했다. 삼성그룹은 59%가 클린이었는데, LG그룹과 HD현대, LS그룹은 클린율이 정확히 0%였다. 이 격차가 낯익은 패턴과 겹쳐 보였다 — 파이프라인은 21개 타깃을 가이드 파일에 적힌 순서 그대로 큐에 넣고 동시에 10개씩 처리한다. 뒤쪽 순번은 앞선 타깃들이 끝나 슬롯이 빌 때까지 대기만 하고, 그 사이 두 IP에는 계속 요청이 쌓인다. 이 파이프라인엔 실행 전체를 쉬어가는 개념이 아예 없다. 그러니 늦게 시작하는 타깃일수록 이미 더 소진된 IP를 만난다는 가설이 그럴듯해 보였다. 다만 완벽하진 않았다 — 가장 마지막 순번인 그룹이 오히려 중간 순번보다 나은 성적을 냈다. 순서 효과였다면 이 부분은 안 맞았다.
사용자 지시대로 키워드 하나의 검색이 끝날 때마다 5초씩 쉬는 쿨다운을 추가했다.
쿨다운을 넣었는데, 비교가 공정하지 않았다
쿨다운을 넣고 바로 다시 돌렸다. 그런데 시작 시점이 문제였다 — 직전 실행이 끝난 지 1시간 28분밖에 안 지난 상태였다. 51분 만에 이미 직전 실행의 최종 실패 건수에 근접해 있었다. 쿨다운 효과를 보려던 실험인데, 정작 IP가 그만큼 못 쉰 상태에서 시작한 게 뒤섞여서 이 결과만으로는 아무것도 결론 내릴 수 없었다. 여기서 멈추고, 이번엔 확실히 쉰 뒤에 다시 재보기로 했다.
33시간을 쉬고 다시 쟀더니, 쿨다운은 효과가 없었다
이번엔 33시간을 쉬었다 — 처음 완주했을 때의 9시간보다 훨씬 길게. 1시간 6분 만에 완주했고, 실패 건수는 1,630건. 처음 완주했을 때(쿨다운 없이, 1,628건)와 사실상 같은 숫자였다. 그룹별 클린율도 거의 판박이였다 — 삼성그룹 30/51, LG그룹 0/28, HD현대 0/19, 전부 동일.
이번엔 비교가 공정했다. IP도 충분히 쉬었고 쿨다운도 들어가 있었는데, 결과가 똑같았다. 키워드마다 5초, 타깃마다 5초 쉬는 정도로는 이 격차를 메우기엔 너무 약했다는 뜻이다. 순서 효과 가설 자체는 여전히 살아있어 보였다 — LG그룹과 HD현대, LS그룹이 매번 똑같이 0에 가까운 클린율을 보이는 패턴이 반복됐으니까. 다만 그 원인을 5초짜리 쿨다운으로 미세 조정해서 없앨 수 있는 건 아니라는 게 이번에 확인됐다.
순서를 통째로 뒤집어봤다 — LG·HD현대·LS 80~100%, 삼성 0%
패턴이 순서 때문인지 아니면 그 자리에 있는 회사들 자체의 특성 때문인지, 이제는 직접 확인할 방법이 하나 남았다. 21개 타깃 순서를 통째로 뒤집었다 — 원래 맨 앞이던 삼성그룹을 맨 뒤로, 원래 맨 뒤였던 LG그룹과 HD현대, LS그룹을 맨 앞으로. 구성 내용은 그대로 두고 순서만 바꿨다.
결과는 정확히 대칭으로 뒤집혔다. 새로 맨 앞에 온 LG그룹, HD현대, LS그룹은 대부분 80~100% 클린이었다. 반대로 새로 맨 뒤로 밀린 삼성그룹은 클린율이 0%, 0%, 0%, 0%, 0%, 0%, 8% — 거의 전멸이었다. 원래 순서에서 항상 0%였던 자리에 있던 그룹이 정확히 그 성적을 그대로 물려받았다.
이걸로 세 번째 독립된 실행(처음 완주, 33시간 휴식 재검증, 이번
순서 뒤집기)에서 매번 “큐의 마지막 67개는 거의 전멸한다”는
패턴이 정확히 그 순번을 따라다닌다는 게 확인됐다. 회사가
무엇이냐가 아니라 몇 번째로 처리되느냐가 실패율을 결정하고
있었다. 다만 깔끔한 문턱은 아니었다 — 맨 앞 순번조차 완전히
클린하진 않았고(820% 실패), 중간 순번은 기복이 컸다. 순번이
뒤로 갈수록 실패 확률이 가파르게 올라가는 경향에 가까웠다.
타깃을 줄이고 30분을 쉬었는데도, 똑같았다 — LG전자도 0%
순서가 문제라면 배치를 나눠서 실제로 쉬는 시간을 주는 게 가장 직접적인 해법일 것 같았다. 그 축소판부터 확인해보기로 했다 — 직전 실행에서 100% 클린이었던 5개 타깃을 빼고 16개만 남긴 가이드를 새로 만들어서, 30분을 쉰 뒤 다시 돌렸다.
결과는 여전했다. 전체 161개 키워드 중 40%만 클린이었고, 심지어 맨 앞 순번(LG전자)조차 이번엔 0%였다 — 직전 실행에서 20%였던 것보다 오히려 나빠졌다. 맨 뒤로 밀린 삼성그룹은 이번에도 거의 전부 0%. 타깃 수를 21개에서 16개로 줄이고 30분을 쉬었는데도 “맨 끝은 죽는다”는 패턴은 그대로였다.
여기서 눈에 띈 게 하나 있었다 — 타깃 수를 줄였는데도 전체 실행 시간은 직전 실행과 비슷한 규모였다. 타깃 개수가 문제가 아니라, 그 실행이 흘러간 시간 자체 — 혹은 그 시간 동안 누적된 요청량 — 가 진짜 변수일 가능성이 높아 보였다. 개수를 줄이는 정도로는 이 변수를 건드리지 못한다는 뜻이다.
지금까지 확인된 것과 다음 방향
쿨다운(5초)은 효과가 없다는 게 두 번의 공정한 비교로 확인됐고, 타깃 수를 줄이는 것도 효과가 없다는 게 이번에 확인됐다. 반면 순서 효과는 세 번의 독립된 실행에서 매번 재현됐다 — 이제는 가설이 아니라 사실상 확정된 변수다. 다만 그 변수의 정체가 “순번” 자체라기보다 “그 순번에 도달하기까지 흘러간 시간과 누적 요청량”에 더 가까워 보인다.
다음으로 확인해야 할 건 훨씬 작은 배치(3~4개 타깃)를 별도 실행으로 나누고, 배치 사이에 수십 분 단위의 실제 휴식을 주는 것이다. 지금까지 시도한 축소판(타깃 수만 줄이기)은 이 가설을 약하게만 건드렸을 뿐, 제대로 된 배치 분리 실험은 아직 안 했다.
남는 생각
이번 다섯 번의 실험에서 두 개의 그럴듯한 가설이 차례로 무너졌다. 쿨다운을 넣으면 나아질 거라고 생각했는데 두 번의 공정한 비교 모두 아니었고, 타깃을 줄이면 나아질 거라고 생각했는데 그것도 아니었다. 둘 다 “고쳤다”고 믿고 싶은 유혹이 있었던 자리였는데, 그때마다 다시 재봐서 아니라는 걸 확인하고 넘어갔다.
정작 원인을 확정지은 건 새로운 도구나 더 정교한 측정이 아니라, 가장 단순한 조작 하나였다 — 순서를 통째로 뒤집어보는 것. 상관관계처럼 보이던 패턴이 조작 앞에서 그대로 대칭으로 뒤집히는 걸 본 다음에야 “순서가 원인이다”라고 말할 수 있는 근거가 생겼다. 관찰만으로는 아무리 여러 번 반복해도 상관관계 이상을 말할 수 없었고, 통제된 조작 한 번이 그걸 넘어서게 해줬다.