Linux 메모리 스와핑 및 캐시 동작 튜닝을 위한 모범 사례
Linux 시스템은 사용 가능한 RAM을 애플리케이션, 파일 시스템 캐시 및 커널 작업에 활용하여 메모리를 동적으로 관리합니다. 이러한 유연성은 장점이지만, 잘못 구성된 메모리 매개변수는 불필요한 스와핑으로 인한 과도한 디스크 I/O 또는 비효율적인 캐싱으로 인해 성능 병목 현상을 유발할 수 있습니다.
이 가이드는 Linux가 메모리 압력에 대처하는 방식을 제어하는 두 가지 중요한 커널 매개변수인 vm.swappiness와 vfs_cache_pressure에 대해 자세히 설명합니다. 이러한 설정을 이해하고 튜닝하는 것은 애플리케이션 응답성을 극대화하고, 디스크 액세스로 인한 지연 시간을 최소화하며, 안정적인 서버 성능을 보장하려는 시스템 관리자에게 필수적입니다.
Linux 메모리 관리 매개변수 이해하기
Linux는 시스템에 더 많은 여유 RAM이 필요할 때 어떤 메모리 페이지를 복구할지 결정하기 위해 휴리스틱을 사용합니다. 커널 매개변수로 제어되는 두 가지 주요 영역은 스와핑(비활성 메모리 페이지를 디스크로 이동)과 캐싱(파일 시스템 메타데이터 및 데이터를 RAM에 유지)입니다.
1. vm.swappiness
vm.swappiness는 커널이 물리적 메모리에서 프로세스를 디스크의 스왑 공간으로 이동시키는 경향을 결정합니다. 이 값은 0에서 100 사이의 값입니다.
- 높은 값 (예: 60, 많은 배포판의 기본값): 커널은 여유 메모리가 충분하더라도 비활성 페이지를 공격적으로 스왑 아웃합니다. 이는 페이지 캐시를 크게 유지하는 것을 우선시하지만, 애플리케이션이 갑자기 해당 메모리를 필요로 할 경우 빈번하고 지연을 유발하는 스와핑으로 이어질 수 있습니다.
- 낮은 값 (예: 10 이하): 커널은 프로세스를 스왑 아웃하기 시작하기 전에 페이지 캐시에서 메모리를 복구하는 것을 선호합니다. 이는 실행 중인 애플리케이션을 RAM에 더 오래 유지하여 응답성을 향상시키지만, 시스템이 지속적으로 캐시 페이지를 해제해야 하는 경우 디스크 I/O 성능이 저하될 수 있습니다.
- 0 값: 최신 커널(2.6.32 이후)에서는
swappiness를 0으로 설정하면 절대적으로 필요한 경우(즉, 메모리 부족 상태)를 제외하고는 완전히 스와핑을 피하려고 시도하여 시스템이 먼저 페이지 캐시에서 메모리를 복구하도록 의존하게 만듭니다.
vm.swappiness의 실제 적용
최적의 설정은 워크로드에 따라 크게 달라집니다:
| 워크로드 유형 | 권장 swappiness 범위 |
근거 |
|---|---|---|
| 데이터베이스 서버, 고성능 컴퓨팅 (HPC) | 1 - 10 | 디스크 지연을 피하기 위해 활성 데이터베이스 작업 세트를 물리적 메모리에 상주하도록 유지합니다. |
| 범용 서버, 데스크톱 | 30 - 60 (기본값) | 응답성과 디스크 캐싱 요구 사항의 균형을 맞춥니다. |
| 대용량 파일 캐시에 크게 의존하는 서버 (예: 높은 디스크 트래픽을 가진 웹 서버) | 60 - 80 | 후속 요청을 RAM에서 빠르게 제공하기 위해 디스크 캐시를 크게 유지하는 것을 우선시합니다. |
현재 값 확인 방법:
cat /proc/sys/vm/swappiness
값을 일시적으로 변경하는 방법 (재부팅 시까지):
스와피니스를 10으로 설정하려면:
sudo sysctl vm.swappiness=10
값을 영구적으로 변경하는 방법:
/etc/sysctl.conf 파일을 편집하고 다음 줄을 추가하거나 수정합니다.
# /etc/sysctl.conf
vm.swappiness = 10
저장 후, 재부팅 없이 다음을 사용하여 변경 사항을 적용합니다.
sudo sysctl -p
모범 사례 팁: 데이터베이스와 같은 메모리 집약적 애플리케이션을 호스팅하는 최신 서버의 경우, 성능 저하를 방지하기 위해
vm.swappiness를 1에서 10 사이로 설정하는 것이 일반적으로 가장 좋은 시작점입니다.
2. vfs_cache_pressure
vfs_cache_pressure는 디렉터리 및 inode 메타데이터(VFS 캐시)에 사용되는 메모리를 커널이 얼마나 공격적으로 복구하는지를 제어합니다.
- 이 값의 범위는 0에서 1000 사이입니다.
- 기본값은 일반적으로 100입니다.
값이 100일 때, 커널은 메모리 압력이 있을 때 페이지 캐시(디스크 데이터)에 사용되는 메모리를 복구하는 것과 VFS 캐시 메모리를 복구하는 것의 균형을 맞춥니다. 값이 100이라는 것은 커널이 페이지 캐시 메모리 1 부분당 1 부분의 inode/dentry 캐시 메모리를 복구하려고 시도한다는 의미입니다.
vfs_cache_pressure 조정
- 값 증가 (예: > 100): 커널이 VFS 캐시 메모리를 복구하는 데 더 공격적이 되도록 만듭니다. 이는 RAM을 더 빨리 확보하지만, 메타데이터를 디스크에서 다시 읽어야 하므로 후속 파일 시스템 조회가 느려질 수 있습니다.
- 값 감소 (예: < 100): 커널이 VFS 캐시를 복구하는 데 덜 보수적이 되도록 만듭니다. 이는 디렉터리 및 inode 정보를 메모리에 더 오래 유지하여 반복적인 파일 시스템 작업을 가속화합니다.
vfs_cache_pressure를 감소시켜야 하는 경우:
시스템에서 동일한 대규모 디렉터리 구조에 자주 액세스하는 경우(복잡한 애플리케이션, 컨테이너 오케스트레이션 또는 특정 네트워킹 설정에서 흔함), 이 값을 낮게(예: 50) 설정하면 메타데이터를 RAM에 쉽게 사용할 수 있도록 유지하여 성능을 향상시킬 수 있습니다.
vfs_cache_pressure를 증가시켜야 하는 경우:
시스템이 일반적인 메모리 압력으로 인해 어려움을 겪고 있으며 커널이 사용되지 않는 모든 메모리를 빠르게 복구하도록 하려면 이 값을 높일 수 있지만, 이는 값을 낮추는 것보다 덜 일반적입니다.
현재 값 확인 방법:
cat /proc/sys/vm/vfs_cache_pressure
값을 영구적으로 변경하는 방법:
/etc/sysctl.conf 편집:
# /etc/sysctl.conf
vfs_cache_pressure = 50
sudo sysctl -p로 변경 사항 적용.
경고:
vfs_cache_pressure를 0으로 설정하면vm.swappiness=0을 스와핑에 대해 설정하는 것과 유사하게 커널이 VFS 캐시 메모리를 복구하는 것을 효과적으로 비활성화합니다. 이는 풍부한 RAM을 보유하고 절대적으로 최고의 파일 시스템 성능이 필요한 시스템에서만 수행해야 합니다.
포괄적인 튜닝 시나리오
이러한 매개변수들의 올바른 조합을 선택하는 것은 애플리케이션 안정성과 파일 시스템 캐싱 간의 상충 관계를 최적화합니다.
시나리오 1: 데이터베이스 서버 (메모리 우선순위)
목표: 애플리케이션 메모리 상주 극대화; 어떤 수를 써서라도 스와핑 최소화.
vm.swappiness = 5vfs_cache_pressure = 50(디렉터리 데이터를 어느 정도 캐시 상태로 유지하지만, RAM이 부족해지면 VFS 메타데이터보다 애플리케이션 메모리에 우선순위를 둡니다).
시나리오 2: 높은 디스크 I/O 서버 (캐싱 우선순위)
목표: 자주 액세스하는 파일 데이터를 페이지 캐시에 유지하여 디스크 성능 극대화.
vm.swappiness = 80(RAM을 디스크 캐시 확장을 위해 확보하기 위해 스와핑이 더 일찍 발생하도록 허용).vfs_cache_pressure = 100(inode 및 페이지 캐시 간의 표준 균형).
시나리오 3: 가상화 호스트 또는 범용 시스템
목표: 다양한 워크로드 전반에 걸친 안정적인 성능.
vm.swappiness = 30(기본값인 60보다 활성 VM/프로세스를 RAM에 약간 더 오래 유지하는 것을 선호하지만, 제어된 스와핑을 허용하는 적당한 설정).vfs_cache_pressure = 100(기본값이 종종 충분함).
모니터링 및 검증
변경 사항을 적용한 후에는 영향을 검증하기 위해 지속적인 모니터링이 중요합니다. free, vmstat 및 시스템 성능 모니터링 대시보드를 사용하십시오.
vmstat 사용:
si(swap in) 및 so(swap out) 열을 모니터링합니다. 낮은 swappiness를 가진 정상적인 시스템은 일반적인 부하에서 si 및 so에 대해 낮거나 0에 가까운 값을 보여야 합니다.
vmstat 5 10
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----\ r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 0 123456 102400 5123456 0 0 0 5 40 70 1 1 98 0 0
swappiness를 줄인 후에도 so 값이 계속 높게 유지된다면, 이는 물리적 RAM이 워크로드에 대해 실제로 불충분하다는 것을 나타내며, RAM을 늘리는 것이 유일한 영구적인 해결책입니다.
결론
vm.swappiness 및 vfs_cache_pressure 튜닝은 Linux 성능 최적화의 기본 기술입니다. 메모리 집약적인 애플리케이션에 대해 swappiness를 보수적으로 줄이면(예: 10으로), 중요한 프로세스가 물리적 RAM에 상주하도록 보장합니다. 동시에 vfs_cache_pressure를 미세 조정하면 관리자는 파일 시스템 메타데이터 저장과 애플리케이션 데이터 저장 중 커널의 선호도를 지정할 수 있습니다. 원하는 성능 향상을 확인하려면 항상 실제 부하 조건에서 변경 사항을 테스트해야 합니다.