리눅스 서버 커널 튜닝
다음은 모 웹사이트의 성능개선을 위한 커널 튜닝
사례입니다. 심심한 분들 한번 연구를 해 보세요.
(실은 나도 잘 모름) 저는 그냥 자료만 옮겨왔을
뿐입니다.
참고자료
http://www.apache.org/docs/misc/perf-tuning.html
web performance tunning – 오렐리
그렇지만 명심할 점이 있습니다. 웹사이트의 성능 개선을
위해서는 커널에서만 손대주는 것이 아니라 OS, 네트웍,
프로그래밍 등 다양한 조건을 같이 고려해야 한다는 것입니다.
또한 하드웨어 성능을 고려하지 않은채 무작정 바꾸면 문제가
생긴다는 것입니다.
또한 일반적으로 정적인 html서비스는 문제가 안되지만 성능의
병목지점이 생기는 곳은 네트웍이 아니라면 cgi일 경우가 많습니다.
아파치에 들어있는 ab, 유닉스의 time, ping, netstat 등
다양한 명령어들을 이용해서 항상 시스템의 상태를 모니터링해보고
속도를 재어 보아야 합니다.
또한 아무리 튜닝을 잘해도 웹페이지에 이미지를 엄청나게
넣어둔다면 헛일하는것이지요. 저도 잘 모르면서 어설크게
오라클 튜닝을 한다고 했더니 cpu 4개, 메모리 2G인 시스템
에서 오히려 일반PC보다 오라클이 더 느려지더군요.
잘 모르는 경우에는 기본값을 사용하는 것이 더 나을때도
있지요.
아래 예에서 keepalive 옵션은 대형 사이트같은 경우에는 off로
해 놓는 것이 더 나은 경우도 많이 있습니다.
빨리 처리하고 연결을 빨리빨리 끊어주는 것이 아무일도 하지
않은채 그냥 프로세스를
띄워놓고 놀리는 것보다는 낫지요.
문태준(taejun at
tunelinux.pe.kr http://tunelinux.pe.kr)
ㅇ 아파치 웹 서버 튜닝
아파치 웹 서버의 튜닝은 간략하게 두 부분으로 나눌 수 있다.
첫 번째는 소스코드에
하드코딩 되어 있는 제한 값을 조정하는 것이고, 두 번째는
환경설정 파일의 각 제한
값들을 수정하는 것이다.
1) 소스레벨
httpd.h 파일에 리눅스의 경우 HARD_SERVER_LIMIT
값이 256으로 기본 설정되어 있으며, 이
값은 서버가 수용할 수 있는 최대 접속을 의미한다. 이 값을
1280으로 설정한다.
2) 환경설정 파일
가. KeepAliveTimeout
클라이언트가 서버로 접속을 했을 경우 하나의 웹 서버
프로세스가 해당 웹 페이지의
여러 개체들의 전송을 새로운 프로세스를 생성하지 않고
지속적으로 접속을 유지하며
담당하며, 이 클라이언트의 요청에 대한 타임아웃에 대한
값이다. 기본 15초에서 30초로
증가.
나. MaxKeepAliveRequests
웹 서버 프로세스가 지속적으로 접속을 유지하면서 처리할 수
있는 요청 개수이다.100으로 설정되어 있으며, 10000으로 증가.
다. StartServer, Min/MaxSpareServer
기본 설정은 5, 5, 10정도이며, 웹 서버가 Standalone
방식일 경우 새로운 접속 요청을 받으면
기존의 Spare Child Process를 포크하여 새로운 Child
Process를 만들어내므로 기본적으로
Spare Process가 많을수록 폭주에 빨리 대처할 수 있다.
StartServer 20, MinSpareServer 20,
MaxSpareServer 40으로 증가.
라. MaxRequestsPerChild
웹 서버 프로세스가 일정 횟수의 클라이언트 요청을 처리하고
종료되는 수치이며,
1000으로 증가.
마. MaxClients
동시에 실행될 수 있는 최대 프로세스 수를 제한하는 것이며,
기본 256으로 설정되어 있다.
이를 512까지 증가.
바. 로그파일 생성
이용자가 접속할 때마다 기록되는 access_log 파일의 경우
한번 접속당 약 85바이트가
증가하며, 접속량이 많을 경우 이 파일의 크기는 실제로
엄청나다. 이럴 경우 접속때마다
로그파일을 액세스하는데 상당한 시간과 부하가 걸리므로
로그 파일을 일정시간마다
초기화하여 항상 경량화 시켜 줄 필요가 있다. 아파치에서
제공하는 rotatelog를 이용.
ㅇ커널 소프트 레벨 튜닝
커널이 제공하는 파라메터값을 /proc 파일 시스템을
이용해서 부팅이 완료된 시점후에
변경한다. 여기서는 주로 파일시스템과 네트웍 자원에 관련된
내용에 대해서 튜닝한다.
1) 파일 시스템 관련
– 리눅스 커널이 할당할 수 있는 파일 개수의 최대값 : 4096
-> 32768
– 리눅스 커널이 할당할 수 있는 inode 개수의 최대값 :
16384 -> 65536
– root 사용자에 대해 할당할 수 있는 파일 개수의 최대값 :
1024 -> 32768
– 하나의 프로세스가 오픈할 수 있는 파일의 개수 : 256 ->
512
2) 네트웍 자원 관련
– TCP 가 Keep Alive 메시지를 보내는 시간 간격 : 7200
-> 1200 – 소켓이 항상 CLOSE되기 전에 마지막 FIN 을 기다리는
시간 : 180 -> 30
– 하나의 TCP 접속 요청에 대해 응답을 재전송하는 횟수 : 7
-> 2
이렇게 설정되는 값들은 시스템이 부팅되면서 스크립트를
통해 설정되어야 되기 때문에
/etc/rc.d/rc.local 파일의 마지막 부분에 정의된다.
ㅇ 커널 하드 레벨 튜닝
커널 소스를 직접 수정하여 제한값을 조정한다. 이를
위해서는 커널 컴파일이
필수적이며, 조심스런 접근이 필요하다.
– 파일 오픈 개수
– 처리할 수 있는 프로세스 개수
**참고
1. 아파치 웹 서버 튜닝
– apache/src/include/httpd.h:
HARD_SERVER_LIMIT 256 -> 1280
– apache/conf/httpd.conf:
MaxKeepAliveRequests 100 -> 10000
KeepAliveTimeout 15 -> 30
MinSpareServers 5 -> 20
MaxSpareServers 10 -> 40
StartServers 5 -> 20
MaxClients 256 -> 1024
2. 커널 소프트 레벨 튜닝
– ulimit -n 32768
– /proc/sys/fs/file-max: 4096 -> 32768
– /proc/sys/fs/inode-max: 16384 -> 65536
– /proc/sys/net/ipv4/tcp_keepalive_time: 7200 ->
1200
– /proc/sys/net/ipv4/tcp_fin_timeout: 180 -> 30
– /proc/sys/net/ipv4/tcp_sack: 1 -> 0
– /proc/sys/net/ipv4/tcp_timestamps: 1 -> 0
– /proc/sys/net/ipv4/tcp_syncookies: 0 -> 1
– /proc/sys/net/ipv4/tcp_retries1: 7 -> 2
– /proc/sys/net/ipv4/tcp_max_syn_backlog: 128 ->
8192
– /proc/sys/net/ipv4/tcp_window_scaling: 1-> 0
3. 커널 하드 레벨 튜닝
– /usr/src/linux/include/linux/fs.h:
NR_FILE 4096 -> 32768
INR_OPEN 1024 -> 32767
– /usr/src/linux/include/linux/tasks.h:
NR_TASKS 2560 -> 3192
MAX_TASKS_PER_USER 2048 -> 3192
– /usr/src/linux/include/linux/limits.h:
NR_OPEN 1024 -> 32767
– /usr/src/linux/include/net/tcp.h:
TCP_TIMEWAIT_LEN (60*HZ) -> (15*HZ)