수백만 줄의 로그에서 최소한의 기간을 최단 시간으로 얻습니다.

4095 단어 성능리눅스
수백만 줄의 로그에서 최소한의 기간을 최단 시간으로 얻습니다.

도전



시스템을 운용하고 있으면 수백만 행을 넘는 방대한 로그 중에서 몇 줄의 로그를 추출하고 싶은 경우가 있다.
그것도 할 수 있다면 시간도 걸리지 않고, 서버에 부하도 걸리지 않고 실시하고 싶다.

검증



Vagrant에서 가상 머신 CentOS 6.4를 시작하여 검증.
실현하는 어프로치는 몇개나 있지만, 이번에는 크게 2개를 조사한다.
· sed 명령으로 행 수를 지정하여 추출
・head로 한번 뽑아, 거기로부터 tail

어느 쪽이 단시간에 목적을 달성할 수 있는지 검증했다.

검증 대상의 파일은 500만행 있는 로그 파일로 해,
머리쪽(1만행~1만1000행째)
안쪽(250만 행째~250만 1000행째)
아래쪽(499만행~499만1000행)
의 3 패턴으로 검증했다.

머리쪽(1만행~1만1000행째)



추출 조건
10,000건에서 11,000건의 1000건을 빼낸다.


sed 명령으로 추출


 time sed -n 10000,10999p nginx_access.log > sed-output

real 5m1.768s
user 0m0.330s
sys 0m40.347s

sed 명령으로는 약 5분 강했다.

head->tail로 추출


 time head -n 10999 nginx_access.log | tail -n 1000 > headtail-output

real 0m1.097s
user 0m0.000s
sys 0m0.084s

약 1초 만에 추출이 가능했다.

차이 확인



물론 sed로 꺼내도, head->tail로 꺼내도 내용은 같다.
diff headtail-output sed-output
(何も表示されない。差分なし)

안쪽(250만 행째~250만 1000행째)



추출 조건
2,500,000건에서 2,501,000건의 1000건을 빼낸다.


sed 명령으로 추출


 time sed -n 2500000,2500999p nginx_access.log > sed-output

real 4m38.208s
user 0m0.439s
sys 0m41.766s

약 4분 40초가 걸렸다.

head->tail로 추출


 time head -n 2500999 nginx_access.log | tail -n 1000 > headtail-output

real 4m26.298s
user 0m0.684s
sys 0m32.164s

약 4분 반이 걸렸다.
약간 head->tail이 빠르지만, 그 차이는 10초 정도.
vagrant를 사용하여 자신의 머신에 가상 서버에서의 검증이므로, 거의 오차일지도 모른다.

차이 확인



물론 sed로 꺼내도, head->tail로 꺼내도 내용은 같다.
diff headtail-output sed-output
(何も表示されない。差分なし)

아래쪽(499만행~499만1000행)



추출 조건
4,990,000건에서 4,991,000건의 1000건을 빼낸다.


sed 명령으로 추출


 time sed -n 4990000,4990999p nginx_access.log > sed-output

real 5m1.196s
user 0m0.431s
sys 0m42.043s

약 5분 강했다.

head->tail로 추출


 time head -n 4990999 nginx_access.log | tail -n 1000 > headtail-output

real 10m57.515s
user 0m1.098s
sys 0m25.951s

아래쪽이라고 head->tail은 11분 걸렸다.
sed 명령으로 안정의 5분으로 취득.
반대로 tail->head이면 곧바로 취득이 가능했다.

차이 확인



물론 sed로 꺼내도, head->tail로 꺼내도 내용은 같다.
diff headtail-output sed-output
(何も表示されない。差分なし)

결론



간단하게 sed 명령으로 취득하기 쉽지만,
파일 위쪽의 정보를 얻고 싶다면 head->tail이 가장 빠릅니다.
(역으로 아래쪽의 정보를 취득하고 싶은 경우는 tail->head)
sed 커맨드에 의한 정보 취득은 빠르지는 않지만, 추출 장소(위, 중, 하)에 의한 영향은 받지 않는다.

좋은 웹페이지 즐겨찾기