InfraPlatform

[꿀팁] 고성능 Nginx를위한 튜닝(6)-로그 부하 줄이기

IT오이시이 2021. 1. 13. 00:53
728x90

#Nginx-install #Nginx설치 #웹서버 설정 #Nginx웹서버설치 #웹서버튜닝#Nginx웹서버 설정 #Nginx웹서버설치 #웹서버튜닝 #Nginx웹서버 설정 #Nginx웹서버설치 #웹서버튜닝 #high performancen nginx #system performance tunning #웹서버 튜닝 #성능개선 #시스템튜닝 #파일시스템 튜닝 #대용량 웹서버 튜닝

 

1. 디스크의 I/O 병목 줄이기
2. 프로세스 처리량 늘리기 (Process)
3. TCP 관련 처리량 늘리기
4. 메모리 및 CPU 튜닝하기 (Processor)
5. 마이크로캐싱
6. 로그 부하 줄이기
7. Dos, DDos 방어 설정

 

 

[꿀팁]고성능 Nginx를위한 튜닝(6)-로그 부하 줄이기


시스템의 물리적인 용량과 성능은 한정되어 있기 때문에 리소스를 절약해야 성능이 개선 됩니다. 특히 대량의 트레픽이 유발하는 시스템에서는 작은 부하들이 누적되어 시스템에 큰 부하를 일으킵니다. 예를 들어 이메일이나 DB역시도 트레픽이 작을때는 아무런 문제가 발생되지 않지만 시스템의 요청들이 증가 할 수록 부하량이 증가하는 폭이 커집니다.

 

시스템 I/O 부하를 줄이는 로그 관리 방법

1. 페이지 리소스에 대한 불필요한 요청 로깅 해제
2. 로그 버퍼링을 이용하여 디스크 쓰기 I/O 빈도를 줄임
3. 성공한 요청 로깅 해제 
4. 특정 URL에 대한 대역폭 제한

 

Nginx의 시스템 I/O 부하를 줄이는 로그 관리

Nginx의 ngx_http_log_module을 통해서 로그에 대한 상세한 설정이 가능합니다. 주로 로그의 종류별 파일의 위치나 로그 포멧을 설정하는 것으로 알고 있습니다. 이번 글에서는 로그 옵션으로 로그 관리 정책을 수립하는데 필요한 것을 소개드립니다.

access_log path [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]];
access_log off;

 

[로그 포멧과 access_log 설정 예시]

log_format compression '$remote_addr - $remote_user [$time_local] '
                              '"$request" $status $bytes_sent '
                              '"$http_referer" "$http_user_agent" "$gzip_ratio"';

access_log /spool/logs/nginx-access.log compression buffer=32k flush=10s;

 

1. 페이지 리소스에 대한 불필요한 요청 로깅 해제

- 웹페이지 에서 내용이 바뀌지 않고 오류가 거의 없는 정적인 웹리소스 들은 웹페이지보다 많은 호출이 일어납니다. 이와 같은 이미지, 폰트, css, js 등에 대한 웹 접근 로그를 해제하면 로그로 인한 I/O 부하를 줄일 수 있습니다.

location ~* \.(?:jpg|jpeg|gif|png|ico|woff2|js|css)$ {
   access_log off;
}

 

2. 로그 버퍼링을 이용하여 디스크 쓰기 I/O를 줄입니다.

트레픽이 증가하면 로그 파일의 쓰기 빈도가 많아져 디스크 I/O가 증가 합니다. 이때 로그를 버퍼링하여 일정시간이나 일정 용량만큼 메모리에 로그를 저장하며 디스크에 로그를 쓰는 빈도를 줄일 수 있습니다.
물론 실시간 디버깅이나 모니터링이 필요한 경우는 상황에 따라 조정이 필요합니다.

 

[로그 파일에 쓰는 경우]
1)버퍼 사이즈보다 큰 데이터가 들어 올때
2) flush는  시간보다 오래된 버퍼링된 데이터
3) 작업프로세스가 로그 파일을 열거나 종료 할때 
http {
    access_log /var/log/nginx/access.log main buffer=32k flush=1m gzip=1;
 }

 

* gzip 압축율은 1~9 의 값이며, 빠른 순으로 1~9로 설정합니다.  9로 설정하면 최대의 압축을 하게 됩니다.

[데이터 압축율]
 압축율은 주로 Text파일을 기준으로 압축 후 용량이 원본의 1/10 : 90% 수준으로 압축을 하게 됩니다. 반면 이미지와 같은 바이너리 파일은 자체가 압축 파일이므로 0~10% 정도 압축이 되거나 더 큰 파일이 나올수도 있습니다.

 

 

3. 성공한 요청 로깅 해제

 

로그는 주로 특정 웹페이지의 응답 상태를 통해 웹로그 분석을 하거나, 오류를 모니터링 하는데 사용합니다.
페이지 분석에 필요 없거나 오류 분석에 영향이 없는 웹리소스나 특정 URI의 경우는 성공한 로그도 불필요한 상황이 있습니다.
이때 특정한 로그만 쌓도록하여 부하를 줄일 수 있습니다.

아래 예시는 응답코드가 2xx , 3xx 인 경우 로그를 쌓지 않도록 설정 하는 예시 입니다.
응답 코드 (Status)를 가지고 loggable 변수를 설정하며,  응답코드가  2와 3으로 시작하는 경우는 "0" , 아니면 "1"으로 값($loggable)을 설정합니다. 로그 컨디션(condition) "if" 문에서 0이면  로그를 쌓지 않고, 1이면 로그를 쌓게 합니다.

map   $status $loggable {
    ~^[23] 0;
    default 1;
}
access_log /var/log/nginx/access.log combined if=$loggable;

 

 

4. 특정 URL에 대한 대역폭 제한

로그와는 차이가 있지만 파일 다운로드의 경우는 파일을 읽고 전송하는 량이 클 경우 시스템 부하가 증가 합니다. 그리고 작은 용량보다 큰용량의 파일을 전송하는 경우 네트웍의 부하도 증가 됩니다. 이때 네트웍 대역폭을 고려하여 큰 용량의 파일이 전송될때 네트웍 부하를 줄이고 여러 사람이 동시에 다운로드 가능하도록 하기 위해서 특정 URI나 파일에 대한 대역폭을 조절 할 수 있습니다.

다운로드 속도가 빠른 사용자들이 많은 경우 네트웍 대역폭을 모두 소진하여 다른 사람들이 접근 할수 없게 되는 경우를 방지하기 위해서 네트웍 대역폭과 총 사용자 수를 예상하여 적절한 응답 전송 속도를 조절하여야 합니다. 

아래와 같이 특정 URI의 파일의 처음 900KB까지는 속도 제한없이 전송되고, 그 이후의 데이터 전송시 200KB/s로 제한하는 것입니다. 

location /contents/ {
    limit_rate_after 900k;
    limit_rate 200k;
}

(여기에 limit_con 을 이용하여 IP당 최대 연결 수를 적용하면 접속에 대한 평등한 접속을 제공 할 수 있습니다.)  
[연재 7 참조]

 

[참고]

* docs.nginx.com/nginx/admin-guide/monitoring/logging/

* nginx.org/en/docs/http/ngx_http_log_module.html

 

[웹서버 튜닝 목차]

1. 디스크의 I/O 병목 줄이기
2. 프로세스 처리량 늘리기 (Process)
3. TCP 관련 처리량 늘리기
4. 메모리 및 CPU 튜닝하기 (Processor)
5. 마이크로캐싱
6. 로그 부하 줄이기
7. Dos, DDos 방어 설정

 

728x90
반응형