리눅스 커널 파라미터 튜닝 할 때 많이 사용하는 설정
리눅스 커널은 ?
리눅스 커널(Linux Kernel)은 운영체제의 핵심 부분으로, 하드웨어와 소프트웨어 간의 중개 역할을 수행합니다. 간단히 말해, 컴퓨터 자원을 효율적으로 관리하며 사용자가 원하는 작업을 수행할 수 있도록 지원합니다.
최근 클라우드 환경이 보편화 되면서 리눅서 커널 파라미터를 튜닝해야 할 일은 거의 없을 수 있습니다.
다만 이러한 파라미터는 단순히 OS 튜밍 뿐아니라 Network 프로그램의 성능을 높이고 시스템 자원을 효율화 하는데 중요한 파라미터 들입니다.
리눅스 커널은 하드웨어 를 컨트롤 하는 메모리, 파일시스템, 네트워크등 다양한 입출력 인터페이스와 연계하여 사용자의 명령을 처리하는 역할을 하고 있습니다.
아래와 같이 다양한 물리적 논리적인 계층구조를 포함하여 운영제제를 구성하는 요소입니다.
. 리눅스 커널의 역할
- 하드웨어와 소프트웨어의 연결: 사용자가 실행하는 소프트웨어(예: 애플리케이션)가 하드웨어 리소스(CPU, 메모리, 디스크 등)를 사용할 수 있도록 중간에서 명령을 처리합니다.
- 프로세스 관리: 여러 프로세스가 동시에 실행될 때, 각 프로세스에 CPU 시간을 적절히 분배하여 효율적으로 작동하도록 관리합니다.
- 메모리 관리: 시스템의 메모리를 효과적으로 분배하고, 프로그램 간 충돌을 방지하며, 필요한 데이터를 디스크에서 메모리로 불러옵니다.
- 장치 드라이버 관리: 다양한 하드웨어 장치를 지원하기 위해 장치 드라이버를 제공하며, 이를 통해 응용 프로그램이 하드웨어를 직접 접근하지 않고도 사용할 수 있게 합니다.
- 파일 시스템 관리: 데이터를 저장하고 읽는 데 필요한 파일 시스템을 지원합니다. 다양한 파일 시스템(예: ext4, XFS, Btrfs 등)을 지원하여 유연성을 제공합니다.
리눅스커널과 시스템 구성
리눅스 커널의 구성 요소
- 프로세스 스케줄러: 프로세스 실행 순서를 결정.
- 메모리 관리자: 가상 메모리, 스왑 관리.
- 파일 시스템: 데이터를 효율적으로 저장하고 관리.
- 네트워크 스택: TCP/IP 프로토콜 등 네트워크 통신 지원.
- 장치 드라이버: 다양한 하드웨어 입출력 장치를 지원하기 위한 코드.
리눅스 커널의 내부 계층구조
리눅스 커널 내부 맵구조
시스템 프로그래머라면 한번은 들어 봤을 내용을 정리해 봅니다.
다음 리눅스 커널 파라미터 튜닝은 서버 성능과 안정성을 높이기 위해 널리 사용됩니다.
1. 네트워크 관련 설정
- TCP 연결 및 대기열 관리
net.ipv4.tcp_tw_reuse
: TIME_WAIT 포트 재사용 가능 여부 설정. (1
로 설정 시 활성화)net.ipv4.tcp_tw_recycle
: TIME_WAIT 소켓 재사용을 빠르게 하는 옵션 (권장되지 않음, 폐기됨).net.ipv4.tcp_fin_timeout
: FIN_WAIT 상태 유지 시간을 조정 (기본값:60
).net.ipv4.tcp_max_syn_backlog
: SYN 큐 크기 증가로 대량 연결 처리.net.core.somaxconn
:listen()
호출 시 대기열 크기 조정.
- 네트워크 버퍼 및 처리량
net.core.rmem_max
,net.core.wmem_max
: 송수신 버퍼의 최대 크기 설정.net.ipv4.tcp_rmem
,net.ipv4.tcp_wmem
: TCP 연결에 대한 기본, 최소, 최대 버퍼 크기 조정.net.core.netdev_max_backlog
: 네트워크 장치가 처리하지 못한 패킷 큐 크기.
* net.ipv4.tcp_max_syn_backlog: SYN 큐의 최대 크기를 설정하여 대규모 트래픽 처리 능력을 향상시킬 수 있습니다. 기본값은 보통 128인데, 고성능 서버에서는 이 값을 더 높게 설정할 수 있습니다.
* net.core.somaxconn: listen() 호출 시 대기열의 최대 크기를 조정합니다. 이 값을 늘리면 대량의 클라이언트 요청을 처리하는 데 도움이 됩니다.
* net.ipv4.tcp_rmem 및 net.ipv4.tcp_wmem: TCP 수신 및 송신 버퍼 크기를 설정합니다. 네트워크 대역폭이 큰 경우 적절히 조정하여 성능을 극대화할 수 있습니다.
* sysctl -w net.ipv4.tcp_tw_reuse=1
기능: TCP 연결에서 TIME_WAIT 상태의 포트를 재사용할 수 있도록 설정하는 명령입니다.
설명: TCP 연결이 닫히면 일정 시간 동안 해당 포트는 TIME_WAIT 상태로 남아 있게 됩니다. 이 상태에서 새로운 연결에 사용할 수 없게 되어 포트 부족 문제가 발생할 수 있습니다. 이 옵션을 활성화(값 1)하면, 포트가 TIME_WAIT 상태에 있더라도 새로운 연결에서 재사용할 수 있습니다. 기본적으로는 비활성화(값 0)되어 있습니다.
사용 예시: 고부하 서버에서 많은 TCP 연결이 빠르게 생성되고 종료되는 경우 포트 재사용을 활성화하면 유용합니다.
* sysctl -w net.ipv4.tcp_fin_time_out=10
기능: TCP 연결이 닫힌 후 TIME_WAIT 상태를 유지하는 시간을 줄이는 명령입니다.
설명: 기본적으로 이 값은 60초로 설정되어 있습니다. 하지만 이 값을 10초로 줄이면 닫힌 연결이 더 빨리 정리되므로 서버의 자원 사용 효율이 개선될 수 있습니다.
주의: 값이 너무 낮으면 데이터 손실이 발생할 가능성이 생길 수 있습니다. 특히 클라이언트나 서버 간의 네트워크가 안정적이지 않은 환경에서는 신중한 설정이 필요합니다.
2. 파일 및 연결 제한
- 파일 디스크립터
fs.file-max
: 시스템이 열 수 있는 최대 파일 디스크립터 수.ulimit -n
: 사용자별 열려 있는 최대 파일 디스크립터 수.
- TCP 연결
net.ipv4.ip_local_port_range
: 할당 가능한 로컬 포트 범위를 설정.net.ipv4.tcp_keepalive_time
: TCP keep-alive 메시지 주기 설정.
ulimit -n: 열려 있는 파일 디스크립터의 수를 제한합니다. 기본값이 낮으면 많은 연결을 처리하는 서버에 병목현상이 생길 수 있으므로, 이를 늘리는 것이 중요합니다.
fs.file-max: 커널이 처리할 수 있는 최대 열린 파일 수를 조정합니다. /etc/sysctl.conf에 추가하면 영구적으로 설정할 수 있습니다.
3. 메모리 관리
- 스왑 및 메모리 정책
vm.swappiness
: 스왑 메모리 사용 비율 조정 (낮을수록 RAM 우선 사용).vm.dirty_ratio
및vm.dirty_background_ratio
: 디스크로 플러시되지 않은 데이터의 비율 설정.vm.overcommit_memory
: 메모리 초과 할당 설정.0
: 기본값 (커널이 적절히 판단).1
: 모든 요청 허용.2
: 엄격하게 제한.
vm.dirty_ratio 및 vm.dirty_background_ratio: 디스크로 플러시되지 않은 데이터를 조정하여 I/O 성능을 최적화할 수 있습니다. 큰 메모리가 있는 서버에서는 이를 조정하는 것이 도움이 됩니다.
4. 디스크 I/O
- I/O 성능 최적화
blockdev --setra
: 디스크의 리드 어헤드 값을 설정하여 I/O 성능 조정.- I/O 스케줄러: 워크로드에 따라
noop
,deadline
, 또는cfq
선택.
I/O 스케줄러 설정: cfq, noop, 또는 deadline 스케줄러 중 워크로드에 맞는 스케줄러를 선택합니다. 예를 들어, SSD를 사용하는 경우 noop 또는 deadline이 적합할 수 있습니다.
echo noop > /sys/block/sdX/queue/scheduler
5. 시스템 전반 설정
- 시스템 로깅
kernel.printk
: 커널 메시지 로그 수준 설정.
- IPv6 비활성화 (필요 시)
net.ipv6.conf.all.disable_ipv6=1
: IPv6 비활성화.
6. 적용 및 확인 방법
- 즉시 적용:
sysctl -w <파라미터>=<값>
- 영구적으로 저장:
/etc/sysctl.conf
에 설정 추가.echo "net.ipv4.tcp_fin_timeout=10" >> /etc/sysctl.conf sysctl -p
- 적용 상태 확인:
sysctl <파라미터>
이러한 설정은 서버 환경에 따라 결과가 달라질 수 있으므로, 변경 전후 성능 테스트와 모니터링을 반드시 병행해야 합니다.
[참고자료]
[InfraPlatform] - [꿀팁] 고성능 Nginx를위한 튜닝 - (3) TCP 관련 처리량 늘리기-리눅스커널튜닝
[InfraPlatform] - [Ubuntu]Linux Tunning -네트워크 커널 매개 변수 최적화
[InfraPlatform] - [꿀팁] 고성능 Nginx를위한 튜닝 - (1) 디스크의 I/O 병목 줄이기
'InfraPlatform' 카테고리의 다른 글
Linux에서 `syslog`를 효과적으로 구성하는 방법 (0) | 2025.03.19 |
---|---|
Dockerise를 이용한 Nginx와 Tomcat Container를 구성하는 방법 (1) | 2025.02.18 |
안전한 웹서버 구축 보안 가이드 12가지 (2) | 2025.02.10 |
Docker 사용량 최적화: 불필요한 이미지 삭제와 /var/lib/docker 디렉토리 초기화 팁 (1) | 2025.01.13 |
리눅스 XFS 파일 시스템: 디스크 포맷과 fstab 설정 완벽 가이드 (0) | 2025.01.12 |
Install Docker on RHEL 9 (0) | 2025.01.08 |
keycloak 을 설치하고 신규 Realm 생성 (1) | 2025.01.05 |