Linux에서 Swappiness란 무엇입니까? (및 변경 방법)

게시 됨: 2022-01-29
컴퓨터용 RAM(Random Access Memory) 스틱.
subin-ch/Shutterstock.com

Linux swappiness 값은 스와핑이 시작되기 전에 사용된 RAM의 양과 관련이 없습니다. 그것은 널리 보고되고 널리 믿어지는 실수입니다. 우리는 그것이 실제로 무엇인지 설명합니다.

Swapiness에 대한 신화 깨기

스와핑은 RAM(Random Access Memory)의 데이터를 하드 디스크의 특정 위치(스왑 파티션 또는 스왑 파일)에 기록하여 RAM을 확보하는 기술입니다.

Linux에는 swappiness 값이라는 설정이 있습니다. 이 설정이 무엇을 제어하는지에 대해 많은 혼란이 있습니다. swappiness에 대한 가장 일반적인 잘못된 설명은 RAM 사용에 대한 임계값을 설정하고 사용된 RAM 양이 해당 임계값에 도달하면 스와핑이 시작된다는 것입니다.

이것은 너무 자주 반복되어 이제는 지혜로 받아들여지는 오해입니다. (거의) 다른 모든 사람들이 이것이 정확히 스왑이 작동하는 방식이라고 말한다면 우리가 그렇지 않다고 말할 때 왜 우리를 믿어야 합니까?

단순한. 우리는 그것을 증명할 것입니다.

RAM이 영역으로 분할됨

Linux는 RAM을 하나의 큰 동종 메모리 풀로 생각하지 않습니다. 영역이라고 하는 여러 영역으로 분할된 것으로 간주합니다. 컴퓨터에 존재하는 영역은 컴퓨터가 32비트인지 64비트인지에 따라 다릅니다. 다음은 x86 아키텍처 컴퓨터에서 가능한 영역에 대한 간략한 설명입니다.

  • DMA(직접 메모리 액세스) : 16MB의 낮은 메모리입니다. 이 영역의 이름은 오래전에 이 물리적 메모리 영역에 대한 직접 메모리 액세스만 수행할 수 있는 컴퓨터가 있었기 때문입니다.
  • Direct Memory Access 32 : 이름에도 불구하고 DMA32(Direct Memory Access 32)는 64비트 Linux에서만 볼 수 있는 영역입니다. 4GB의 낮은 메모리입니다. 32비트 컴퓨터에서 실행되는 Linux는 (PAE(물리적 주소 확장) 커널을 사용하지 않는 한) 이 양의 RAM에 대해서만 DMA를 수행할 수 있으며, 이것이 영역 이름이 된 방식입니다. 32비트 컴퓨터에서는 HighMem이라고 합니다.
  • 일반 : 64비트 컴퓨터에서 일반 메모리는 4GB(대략) 이상의 모든 RAM입니다. 32비트 시스템에서는 16MB에서 896MB 사이의 RAM입니다.
  • HighMem : 이것은 32비트 Linux 컴퓨터에만 존재합니다. 충분히 큰 시스템에서 4GB 이상의 RAM을 포함하여 896MB 이상의 모든 RAM입니다.

PAGESIZE 값

RAM은 고정된 크기의 페이지에 할당됩니다. 그 크기는 부팅 시 컴퓨터의 아키텍처를 감지하여 커널에 의해 결정됩니다. 일반적으로 Linux 컴퓨터의 페이지 크기는 4KB입니다.

광고

getconf 명령을 사용하여 페이지 크기를 볼 수 있습니다.

 getconf 페이지 크기 

getconf 페이지 크기

영역이 노드에 연결됨

영역은 노드에 연결됩니다. 노드는 중앙 처리 장치(CPU)와 연결됩니다. 커널은 해당 CPU와 연결된 노드에서 CPU에서 실행 중인 프로세스에 대한 메모리 할당을 시도합니다.

CPU에 연결된 노드의 개념을 통해 Non-Uniform Memory Access 아키텍처를 사용하여 전문 다중 CPU 컴퓨터에 혼합 메모리 유형을 설치할 수 있습니다.

모두 매우 고급스럽습니다. 일반적인 Linux 컴퓨터에는 노드 0이라고 하는 단일 노드가 있습니다. 모든 영역은 해당 노드에 속합니다. 컴퓨터의 노드와 영역을 보려면 /proc/buddyinfo 파일을 살펴보십시오. 그렇게 하기 위해 less 사용합니다:

 적은 /proc/buddyinfo 

다음은 이 문서에서 조사한 64비트 컴퓨터의 출력입니다.

 노드 0, 영역 DMA 1 1 1 0 2 1 1 0 1 1 3
노드 0, 영역 DMA32 2 67 58 19 8 3 3 1 1 1 17
광고

노드 0인 단일 노드가 있습니다. 이 컴퓨터에는 2GB의 RAM만 있으므로 "일반" 영역이 없습니다. DMA와 DMA32의 두 영역만 있습니다.

각 열은 특정 크기의 사용 가능한 페이지 수를 나타냅니다. 예를 들어 DMA32 영역의 경우 왼쪽에서 읽습니다.

  • 2 : 2^( 0 *PAGESIZE)개의 메모리 청크 중 2개가 있습니다.
  • 67 : 2^( 1 *PAGE_SIZE)개의 메모리 청크 중 67개가 있습니다.
  • 58 : 사용 가능한 메모리 청크가 2^( 2 *PAGESIZE)개 중 58개입니다.
  • 등등...
  • 17 : 2^( 512 *PAGESIZE) 청크 중 17개가 있습니다.

그러나 실제로 우리가 이 정보를 보는 유일한 이유는 노드와 영역 간의 관계를 보기 위함입니다.

파일 페이지 및 익명 페이지

메모리 매핑은 페이지 테이블 항목 집합을 사용하여 어떤 메모리 페이지가 무엇을 위해 사용되는지 기록합니다.

메모리 매핑은 다음과 같을 수 있습니다.

  • 파일 지원 : 파일 지원 매핑에는 파일에서 읽은 데이터가 포함됩니다. 모든 종류의 파일이 될 수 있습니다. 주목해야 할 중요한 점은 시스템이 이 메모리를 해제하고 해당 데이터를 다시 가져와야 하는 경우 파일에서 다시 한 번 읽을 수 있다는 것입니다. 그러나 메모리에서 데이터가 변경된 경우 메모리를 해제하기 전에 해당 변경 사항을 하드 드라이브의 파일에 기록해야 합니다. 그렇지 않으면 변경 사항이 손실됩니다.
  • Anonymous : Anonymous 메모리는 파일이나 장치가 지원하지 않는 메모리 매핑입니다. 이러한 페이지에는 데이터를 보유하기 위해 또는 스택 및 힙과 같은 것을 위해 프로그램에서 즉석에서 요청한 메모리가 포함될 수 있습니다. 이러한 유형의 데이터 뒤에는 파일이 없기 때문에 익명 데이터를 저장하기 위한 특별한 장소를 따로 마련해야 합니다. 그 위치는 스왑 파티션 또는 스왑 파일입니다. 익명 페이지가 해제되기 전에 익명 데이터가 스왑에 기록됩니다.
  • 장치 지원 : 장치는 파일인 것처럼 처리할 수 있는 블록 장치 파일을 통해 주소가 지정됩니다. 데이터를 읽고 쓸 수 있습니다. 장치 지원 메모리 매핑에는 장치의 데이터가 저장되어 있습니다.
  • Shared : 여러 페이지 테이블 항목이 동일한 RAM 페이지에 매핑될 수 있습니다. 매핑을 통해 메모리 위치에 액세스하면 동일한 데이터가 표시됩니다. 서로 다른 프로세스는 이러한 공동 관찰 메모리 위치의 데이터를 변경하여 매우 효율적인 방식으로 서로 통신할 수 있습니다. 쓰기 가능한 공유 매핑은 고성능 프로세스 간 통신을 달성하는 일반적인 수단입니다.
  • Copy on write : Copy on write는 지연 할당 기술입니다. 이미 메모리에 있는 리소스의 복사본이 요청되면 원래 리소스에 대한 매핑을 반환하여 요청이 충족됩니다. 리소스를 "공유"하는 프로세스 중 하나가 쓰기를 시도하는 경우 새 복사본에 변경 사항을 적용할 수 있도록 리소스를 메모리에 실제로 복제해야 합니다. 따라서 메모리 할당은 첫 번째 쓰기 명령에서만 발생합니다.

교환을 위해 목록의 처음 두 개, 즉 파일 페이지와 익명 페이지에만 관심이 있으면 됩니다.

스와핑

다음은 GitHub의 Linux 설명서에서 swappiness에 대한 설명입니다.

광고

"This control is used to define how aggressive (sic) the kernel will swap memory pages. Higher values will increase aggressiveness, lower values decrease the amount of swap. A value of 0 instructs the kernel not to initiate swap until the amount of free and file-backed pages is less than the high water mark in a zone.

The default value is 60."

스왑이 스왑의 강도를 높이거나 낮추는 것처럼 들립니다. 흥미롭게도 swappiness를 0으로 설정해도 스왑이 꺼지지 않는다고 명시되어 있습니다. 커널에 특정 조건이 충족될 때까지 스왑하지 않도록 지시합니다. 그러나 스와핑은 여전히 ​​발생할 수 있습니다.

더 깊이 파헤쳐 봅시다. 커널 소스 코드 파일 vmscan.c에서 vm_swappiness 의 정의와 기본값은 다음과 같습니다.

/*
* From 0 .. 100. Higher means more swappy.
*/
int vm_swappiness = 60;

swappiness 값의 범위는 0에서 100까지입니다. 다시 말하지만, 이 설명은 확실히 swappiness 값이 얼마나 많은 스와핑이 발생하는지와 관련이 있는 것처럼 들리며, 수치가 높을수록 더 많은 스와핑이 발생합니다.

소스 코드 파일에서 더 나아가, 우리는 swappiness 라는 새로운 변수에 mem_cgroup_swappiness() 함수에 의해 반환된 값이 할당되었음을 알 수 있습니다. 소스 코드를 좀 더 추적하면 이 함수에서 반환된 값이 vm_swappiness 있습니다. 이제 변수 swappinessvm_swappiness 가 설정된 값과 동일하게 설정됩니다.

int swappiness = mem_cgroup_swappiness(memcg);

광고

그리고 같은 소스 코드 파일에서 조금 더 내려가면 다음과 같습니다.

/*
* With swappiness at 100, anonymous and file have the same priority.
* This scanning priority is essentially the inverse of IO cost.
*/
anon_prio = swappiness;
file_prio = 200 - anon_prio;

그 흥미 롭군요. 두 개의 고유한 값이 swappiness 에서 파생됩니다. anon_priofile_prio 변수는 이러한 값을 보유합니다. 하나가 증가하면 다른 하나는 감소하고 그 반대 의 경우도 마찬가지입니다.

Linux swappiness 값은 실제로 값 사이의 비율 을 설정합니다.

황금 비율

파일 페이지는 해당 메모리가 해제되면 쉽게 검색할 수 있는 데이터를 보유합니다. Linux는 파일을 다시 읽을 수 있습니다. 우리가 보았듯이 RAM에서 파일 데이터가 변경된 경우 파일 페이지를 해제하기 전에 해당 변경 사항을 파일에 기록해야 합니다. 그러나 어느 쪽이든 RAM의 파일 페이지는 파일에서 데이터를 읽어 다시 채울 수 있습니다. 그렇다면 왜 이러한 페이지를 스왑 파티션이나 스왑 파일에 추가해야 합니까? 해당 데이터가 다시 필요한 경우 스왑 공간의 중복 복사본 대신 원본 파일에서 다시 읽을 수도 있습니다. 따라서 파일 페이지는 스왑에 저장되지 않습니다. 원본 파일에 다시 "저장"됩니다.

익명 페이지의 경우 메모리의 값과 연결된 기본 파일이 없습니다. 해당 페이지의 값은 동적으로 도달했습니다. 단순히 파일에서 다시 읽을 수 없습니다. 익명 페이지 메모리 값을 복구할 수 있는 유일한 방법은 메모리를 해제하기 전에 데이터를 어딘가에 저장하는 것입니다. 그리고 그것이 스왑이 유지하는 것입니다. 다시 참조해야 하는 익명 페이지.

광고

그러나 파일 페이지와 익명 페이지 모두에 대해 메모리를 확보하려면 하드 드라이브 쓰기가 필요할 수 있습니다. 파일 페이지 데이터 또는 익명 페이지 데이터가 파일에 마지막으로 기록된 이후 또는 스왑을 위해 변경된 경우 파일 시스템 쓰기가 필요합니다. 데이터를 검색하려면 파일 시스템 읽기가 필요합니다. 두 가지 유형의 페이지 회수 모두 비용이 많이 듭니다. 익명 페이지의 스와핑을 최소화하여 하드 드라이브 입력 및 출력을 줄이려고 하면 파일에 쓰고 읽는 파일 페이지를 처리하는 데 필요한 하드 드라이브 입력 및 출력의 양이 증가할 뿐입니다.

마지막 코드 스니펫에서 볼 수 있듯이 두 개의 변수가 있습니다. 하나는 "파일 우선 순위"에 대해 file_prio 라고 하고 다른 하나는 "익명 우선 순위"에 대해 anon_prio 라고 합니다.

  • anon_prio 변수는 Linux swappiness 값으로 설정됩니다.
  • file_prio 값은 200에서 anon_prio 값을 뺀 값으로 설정됩니다.

이러한 변수는 함께 작동하는 값을 보유합니다. 둘 다 100으로 설정되어 있으면 동일합니다. 다른 값의 경우 anon_prio 는 100에서 0으로 감소하고 file_prio 는 100에서 200으로 증가합니다. 두 값은 Linux 커널이 파일 페이지 회수(해제) 또는 익명을 선호하는 방식으로 실행되는지 여부를 결정하는 복잡한 알고리즘에 입력됩니다. 페이지.

file_prio 는 파일 페이지를 해제하려는 시스템의 의지로, anon_prio 는 익명 페이지를 해제하려는 시스템의 의지로 생각할 수 있습니다. 이러한 값이 하지 않는 것은 스왑이 사용될 트리거 또는 임계값을 설정하는 것입니다. 그건 다른 곳에서 결정합니다.

그러나 메모리를 해제해야 하는 경우 이 두 변수와 이들 간의 비율은 해제 및 해제에 우선적으로 고려되는 페이지 유형을 결정하기 위해 회수 및 스왑 알고리즘에 의해 고려됩니다. 그리고 이는 연결된 하드 드라이브 활동이 파일 페이지의 파일을 처리할지 아니면 익명 페이지의 스왑 공간이 될 것인지를 결정합니다.

스왑이 실제로 언제 중단됩니까?

우리는 Linux swappiness 값이 잠재적인 회수를 위해 스캔될 메모리 페이지 유형에 대한 기본 설정을 설정한다는 것을 확인했습니다. 괜찮지만 스왑이 중단될 시기 를 결정 해야 합니다.

광고

각 메모리 영역에는 상위 워터 마크와 하위 워터 마크가 있습니다. 시스템 파생 값입니다. 각 영역의 RAM 비율입니다. 스왑 트리거 임계값으로 사용되는 값입니다.

최고 및 최저 워터 마크가 무엇인지 확인하려면 다음 명령을 사용하여 /proc/zoneinfo 파일 내부를 살펴보십시오.

 덜 /proc/zoneinfo 

각 영역에는 페이지 단위로 측정된 메모리 값 집합이 있습니다. 다음은 테스트 머신의 DMA32 영역에 대한 값입니다. 로우 워터 마크는 13966 페이지이고 하이 워터 마크는 16759 페이지입니다.

  • 정상적인 실행 조건에서 영역의 여유 메모리가 영역의 로우 워터 마크 아래로 떨어지면 스왑 알고리즘은 anon_priofile_prio 의 상대 값을 고려하여 회수할 수 있는 메모리를 찾는 메모리 페이지 검색을 시작합니다.
  • Linux swappiness 값을 0으로 설정하면 파일 페이지와 여유 페이지의 합이 상위 워터 마크보다 작을 때 스왑이 발생합니다.

따라서 Linux swappiness 값을 사용하여 RAM 사용과 관련된 스왑 동작에 영향을 줄 수 없음을 알 수 있습니다. 그냥 그렇게 작동하지 않습니다.

Swapiness는 무엇으로 설정해야 합니까?

이는 하드웨어, 작업 부하, 하드 드라이브 유형 및 컴퓨터가 데스크탑인지 서버인지에 따라 다릅니다. 분명히 이것은 모든 유형의 설정에 맞는 한 가지 크기가 되지는 않을 것입니다.

그리고 스왑은 메모리 공간이 부족할 때 RAM을 확보하는 메커니즘으로만 사용되지 않는다는 점을 명심해야 합니다. 스왑은 잘 작동하는 시스템의 중요한 부분이며, 스왑이 없으면 정상적인 메모리 관리를 Linux에서 달성하기가 매우 어려워집니다.

광고

Linux swappiness 값을 변경하면 즉시 적용됩니다. 재부팅할 필요가 없습니다. 따라서 약간의 조정을 수행하고 효과를 모니터링할 수 있습니다. 이상적으로는 컴퓨터에서 다양한 유형의 활동으로 며칠 동안 이 작업을 수행하여 가능한 이상적인 설정에 가장 가까운 것을 찾으려고 합니다.

다음은 고려해야 할 몇 가지 사항입니다.

  • Linux swappiness 값을 0으로 설정하여 "스왑 비활성화"를 시도하면 스왑 관련 하드 드라이브 활동이 파일 관련 하드 드라이브 활동으로 전환됩니다.
  • 노후된 기계식 하드 드라이브가 있는 경우 Linux swappiness 값을 줄여서 익명 페이지 재확보에서 벗어나 스왑 파티션 변동을 줄일 수 있습니다. 물론 한 설정을 낮추면 다른 설정도 높아집니다. 스왑 변동을 줄이면 파일 시스템 변동이 증가할 수 있습니다. 그러나 컴퓨터는 다른 방법보다 한 방법을 더 선호할 수 있습니다. 실제로, 확실히 아는 유일한 방법은 시도하고 보는 것입니다.
  • 데이터베이스 서버와 같은 단일 목적 서버의 경우 데이터베이스 소프트웨어 공급업체로부터 지침을 얻을 수 있습니다. 매우 자주 이러한 응용 프로그램에는 사용자가 더 신뢰할 수 있는 고유한 목적으로 설계된 파일 캐시 및 메모리 관리 루틴이 있습니다. 소프트웨어 제공업체는 시스템 사양 및 작업 부하에 따라 Linux 스왑니스 값을 제안할 수 있습니다.
  • 합리적으로 최신 하드웨어를 사용하는 일반 데스크탑 사용자의 경우? 그대로 두십시오.

Linux Swappiness 값을 설정하는 방법

swappiness 값을 변경하기 전에 현재 값이 무엇인지 알아야 합니다. 조금 줄이고 싶다면 질문은 무엇보다 조금 적습니다. 다음 명령으로 알 수 있습니다.

 고양이 /proc/sys/vm/swappiness 

고양이 /proc/sys/vm/swappiness

swappiness 값을 구성하려면 sysctl 명령을 사용하십시오.

 sudo sysctl vm.swappiness=45 

새 값은 즉시 사용되며 재부팅할 필요가 없습니다.

실제로 재부팅하면 swappiness 값이 기본값인 60으로 돌아갑니다. 실험을 마치고 사용할 새 값을 결정했으면 이 값을 /etc/sysctl.conf 파일. 원하는 편집기를 사용할 수 있습니다. 다음 명령을 사용하여 nano 편집기로 파일을 편집하십시오.

 sudo nano /etc/sysctl.conf 

nano 가 열리면 파일 맨 아래로 스크롤하여 이 줄을 추가합니다. 우리는 35를 영구 교환 값으로 사용하고 있습니다. 사용하려는 값으로 대체해야 합니다.

 vm.swappiness=35 

변경 사항을 저장하고 nano 를 종료하려면 "Ctrl+O"를 누르고 "Enter"를 누르고 "Ctrl+Z"를 누릅니다.

메모리 관리가 복잡함

메모리 관리가 복잡합니다. 그렇기 때문에 일반 사용자의 경우 일반적으로 커널에 맡기는 것이 좋습니다.

광고

자신보다 더 많은 RAM을 사용하고 있다고 생각하기 쉽습니다. topfree 와 같은 유틸리티는 잘못된 인상을 줄 수 있습니다. Linux는 디스크 캐싱과 같은 다양한 자체 목적을 위해 여유 RAM을 사용합니다. 이것은 인위적으로 "사용된" 메모리 수치를 높이고 "사용 가능한" 메모리 수치를 줄입니다. 실제로 디스크 캐시로 사용되는 RAM은 언제든지 매우 빠르게 회수할 수 있기 때문에 "사용됨" 및 "사용 가능"으로 플래그가 지정됩니다.

스왑이 작동하지 않거나 스왑 값을 변경해야 하는 것처럼 보일 수 있는 초심자에게.

언제나 그렇듯이 악마는 디테일에 있습니다. 또는 이 경우 데몬입니다. 커널 스왑 데몬.

관련: 개발자 및 열광자를 위한 최고의 Linux 노트북