서버에 스왑 공간을 추가하는 것은 메모리 부족(out-of-memory) 오류를 보완할 수 있는 훌륭한 옵션입니다. Linux은 시스템의 RAM 용량이 가득 찼을 때 사용자가 시스템에 스왑 공간을 추가할 수 있도록 합니다. 전용 공간 파티션을 생성하면 디스크 공간 부족에 대해 크게 걱정하지 않고 물리 메모리가 원활하게 작동하도록 할 수 있습니다.
스왑 개요
Linux에서 스왑 공간은 물리 메모리의 공간이 부족할 때 사용되는 머신의 가상 메모리의 일부입니다. 특히 추가 메모리가 필요한 대규모 프로그램이나 애플리케이션을 작업할 때, 스왑 공간은 일시적으로 비활성화된 메모리 페이지를 보관하기에 이상적인 선택입니다. 스왑 공간을 생성하면 대규모 프로그램이 실행 중일 때 데이터를 저장할 수 있으므로 애플리케이션 충돌을 줄일 수 있습니다. 즉, 시스템에 더 많은 메모리 리소스가 필요하고 RAM이 가득 찬 경우, 메모리의 모든 비활성 페이지가 스왑 공간으로 이동하여 프로그램이 중단 없이 실행될 수 있습니다.
얼마만큼의 스왑 공간이 필요한가요?
스왑 공간의 크기는 여러 요인에 따라 달라집니다. 여기에는 사용 가능한 RAM, 가해지는 부하, 시스템이 최대 절전 모드(suspend-to-disk) 기능을 지원해야 하는지 여부 등이 포함됩니다. RAM의 사용 가능한 공간을 기준으로 권장되는 스왑 공간을 확인하려면 아래 표를 참조하십시오:
|
연번 |
사용 가능한 RAM 공간 |
권장 스왑 공간 |
|
1. |
1GB |
1GB |
|
2. |
2GB |
1GB |
|
3. |
3GB |
2GB |
|
4. |
4GB |
2GB |
|
5. |
5GB |
2GB |
|
6. |
6GB |
2GB |
|
7. |
8GB |
3GB |
이 튜토리얼에서는 Ubuntu 20.04에서 스왑 공간을 추가하는 단계를 안내해 드립니다. 시작해 봅시다!
사전 요구 사항
이 튜토리얼을 따라 하려면 다음이 필요합니다.
- Ubuntu가 설치된 시스템.
- 루트(root)가 아닌 사용자 계정이 설정되어 있고 머신에 sudo 권한이 있어야 합니다.
1단계: 스왑 정보 확인
스왑 공간의 크기는 시스템의 RAM에 따라 달라집니다. 따라서 스왑 공간을 생성하기 전에 시스템에서 스왑 공간을 사용할 수 있는지 확인하는 것이 필수적입니다. 시스템에 구성된 스왑이 있는지 확인하려면 아래 명령어를 입력하십시오.
|
1 |
$ sudo swapon --show |
출력이 표시되면 시스템에 스왑 공간을 생성할 수 있는 공간이 있음을 의미합니다. 그러나 출력이 없으면 스왑 공간을 추가할 만큼 충분한 공간이 없음을 나타내는 신호입니다.
다음 free 유틸리티를 사용하여 활성화된 스왑이 없는지 확인합니다.
|
1 |
$ free -h |
출력 결과로 빈 스왑 행이 표시됩니다:
2단계: 하드 드라이브 파티션 여유 공간 확인
시스템 가용성을 확인하는 것과 마찬가지로, 이제 충분한 공간이 있는지 확인하기 위해 현재 디스크 사용량을 확인해 보겠습니다. 다음 df 명령어를 사용하여 하드 디스크 파티션 여유 공간을 확인합니다.
|
1 |
df -h |
다음이 있는 장치 / (다음 열에 있는) Mounted on 열은 우리의 디스크이며, 이 디스크는 11% 만큼 여유가 있습니다. 다음과 같은 출력이 표시됩니다:
시스템 요구 사항을 확인한 후, 계속 진행하여 파일 시스템에 스왑 파일을 생성해 보겠습니다.
3단계: 스왑 파일 생성
파일 시스템에 스왑 파일을 생성하려면, 루트 swapfile 디렉토리에 파일 이름을 (/) 로 할당하십시오. 이때 fallocate 프로그램을 사용합니다. 파일 크기 할당은 필요에 따라 다릅니다. 튜토리얼을 간단하고 이해하기 쉽게 유지하기 위해, 우리는 1G 파일을 생성하고 1G 의 RAM을 전용으로 할당합니다. 다음 sudo 명령어를 사용하여 스왑 파일을 생성합니다:
|
1 |
sudo fallocate -l 1G /swapfile |
다음으로, 예약된 공간을 확인하기 위해 이 명령어를 입력하십시오.
|
1 |
$ ls -lh /swapfile |
이제 시스템에 스왑 공간을 생성했으므로, 다음 단계에서 이를 활성화해 보겠습니다.
4단계: 스왑 파일 활성화
올바른 크기를 사용할 수 있게 되면 이를 스왑 공간으로 변환해 보겠습니다. 보안상의 이유로, 일반 사용자의 접근을 방지하고 root 사용자만 파일에 접근할 수 있도록 하는 것이 중요합니다. 루트 root 권한이 있는 사용자만 파일을 보고 그 내용을 읽을 수 있도록 제한을 추가하겠습니다. 다음 root 명령어를 사용하여 파일이 오직 root 사용자에게만 접근 가능하도록 설정하십시오:
|
1 |
sudo chmod 600 /swapfile |
그런 다음, 다음 ls 명령어를 사용하여 변경 사항을 확인합니다:
|
1 |
$ ls -lh /swapfile |
보시다시피, 오직 root 사용자만 읽기 및 쓰기 플래그가 활성화되어 있습니다:
그 후, 파일을 스왑 공간으로 지정합니다:
|
1 |
sudo mkswap /swapfile |
다음과 같은 출력이 표시됩니다:
그 후, 스왑 파일을 활성화하고 시스템이 이를 사용할 수 있도록 허용합니다:
|
1 |
sudo swapon /swapfile |
다음으로, 스왑이 활성화되었는지 확인합니다:
|
1 |
$ sudo swapon --show |
다음과 같은 출력이 표시됩니다:
앞서 Step 1에서 했던 것처럼, 다시 한번 free 유틸리티 공간을 확인하겠습니다:
|
1 |
free -h |
다음과 같은 출력이 표시됩니다:
스왑이 성공적으로 설정되었으며 운영 체제가 필요에 따라 이를 사용하기 시작할 것입니다. 다음 단계에서는 스왑 파일을 영구적으로 적용하겠습니다.
5단계: 스왑 파일 영구 적용하기
기본적으로 서버는 재부팅할 때마다 스왑 설정을 자동으로 유지하지 않습니다. 기본 설정을 변경하고 안전하게 유지하기 위해, 스왑 파일을 /etc/fstab 파일에 추가하겠습니다. sudo 명령어를 사용하여 /etc/fstab 파일을 백업합니다:
|
1 |
sudo cp /etc/fstab /etc/fstab.bak |
다음으로, 아래 명령어를 입력하여 스왑 파일 정보를 /etc/fstab 파일의 끝에 추가합니다:
|
1 |
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab |
그 후, 스왑 공간을 튜닝할 수 있도록 몇 가지 설정을 검토하고 수정해 보겠습니다.
6단계: 스왑 설정 수정
이 단계에서는 설정을 구성하고 몇 가지 수정을 진행하겠습니다. swappiness 속성을 조정하고 캐시 압력(cache pressure)을 변경해 보겠습니다.
-
Swappiness 속성 조정
The swappiness 매개변수는 조정 가능한 커널 매개변수입니다. 이는 런타임 메모리를 스왑 아웃하는 것 사이의 균형을 변경하고, RAM에서 스왑 공간으로 데이터를 스왑 아웃하는 데이터 교환을 제어합니다. 이 매개변수 값은 0에서 100까지의 백분율로 표시됩니다.
The vm.swappiness 값은 시스템 swappiness 동작에 직접적인 영향을 미칩니다. vm.swappiness 값이 높을수록 시스템은 더 많이 스왑을 수행하며, 그 반대도 마찬가지입니다. 값이 0에 가까우면 커널이 데이터를 스왑하지 않으므로 성능 저하가 발생할 수 있습니다. 시스템이 스왑에 크게 의존하지 않도록 하는 것은 성능을 향상시키고 강력한 응답성을 얻을 수 있는 훌륭한 방법입니다.
반대로, vm.swappiness 값이 100에 가까울수록 물리 메모리보다 스왑에 더 많은 데이터를 배치하려고 시도합니다. 낮거나 중간 정도의 vm.swappiness 값과 달리, RAM 안팎으로 데이터가 활발하게 스왑되는 양이 많을 때 시스템 스왑이 높으면 매우 바람직하지 않은 영향을 미칩니다.
다음 명령어를 입력하여 현재 swappiness 값을 확인합니다:
|
1 |
cat /proc/sys/vm/swappiness |
다음과 같은 출력이 표시됩니다:
You can also set the swappiness of your choice using the sysctl 명령어를 사용하여 원하는 swappiness를 설정할 수도 있습니다. 다음 명령어를 입력하여 swappiness 값을 15로 설정해 보겠습니다:
|
1 |
sudo sysctl vm.swappiness = 15 |
다음과 같은 출력이 표시됩니다:
시스템이 재부팅되기 전까지는 설정이 그대로 유지됩니다. 재부팅 시 자동으로 값을 설정하려면 /etc/sysctl.conf 파일에 해당 줄을 추가합니다:
|
1 |
sudo nano /etc/sysctl.conf |
맨 아래에 다음 코드를 추가할 수 있습니다:
|
1 |
Vm.swappiness = 15 |
그런 다음 파일을 저장하고 닫습니다.
-
캐시 압력(Cache Pressure) 조정
다음으로, 다른 데이터보다 vfs_cache_pressure 및 inode 와 dentry 정보를 관리하는 vfs_cache_pressure 설정을 수정하겠습니다. 이 설정은 커널이 디렉터리 캐싱에 사용된 메모리를 회수하는 경향도 제어합니다. 다시 proc 파일 시스템으로 이동하여 현재 값을 확인합니다:
|
1 |
cat /proc/sys/vm/vfs_cache_pressure |
다음과 같은 출력이 표시됩니다:
이 구성이 이미 완료되었으므로, 시스템은 캐시에서 inode 정보를 제거할 것입니다. 다음과 같이 sysctl vm.vfs_cache_pressure 값을 더 안정적인 설정으로 지정해 보겠습니다:
|
1 |
sudo sysctl vm.vfs_cache_pressure = 60 |
다음과 같은 출력이 표시됩니다:
swappiness 설정에서 했던 것과 마찬가지로, 여기서도 구성을 변경할 수 있습니다:
|
1 |
sudo nano /etc/sysctl.conf |
맨 아래에 새로 생성한 값을 나타내는 줄을 삽입합니다:
|
1 |
Vm.vfs_cache_pressure = 60 |
마지막으로 파일을 저장하고 닫습니다.
결론
스왑 공간은 전용 스왑 파티션, 스왑 파일 또는 이 둘의 조합으로 추가할 수 있습니다. 스왑 공간을 생성하고 그 이점을 활용하면 메모리 부족(out-of-memory) 경고에 대해 크게 걱정하지 않고 애플리케이션을 원활하게 실행할 수 있습니다. 메모리 공간이 제한된 시스템에서 스왑 공간을 생성하는 것은 추가적인 이점이지만, 더 많은 RAM 공간을 대체하는 대안으로 취급되어서는 안 됩니다. 기억하세요, 스왑 공간은 하드 디스크에 위치하므로 물리적 메모리에 비해 액세스 시간이 약간 느려질 수 있습니다.
다음은 저희 블로그에서 제공하는 Ubuntu 서버 시작에 도움이 되는 더 많은 튜토리얼입니다:
즐거운 컴퓨팅 되세요!










댓글
아직 댓글이 없습니다. 첫 번째로 작성해 보세요.