리눅스에서 스와 파이는 무엇입니까? (및 변경 방법)

0
576
컴퓨터 용 RAM (Random Access Memory) 스틱.
subin-ch / Shutterstock.com

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

Swapiness에 대한 파열 신화

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

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

이것은 자주 반복되어 왔으며 이제는 지혜로 받아 들여지는 오해입니다. (거의) 다른 사람들이 스왑 피스의 작동 방식을 정확히 말해 준다면 왜 그렇지 않다고 믿어야합니까?

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

RAM이 영역으로 분할되었습니다

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

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

PAGESIZE 값

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

당신은 사용하여 페이지 크기를 볼 수 있습니다 getconf 명령:

getconf PAGESIZE

getconf PAGESIZE

영역이 노드에 연결됨

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

CPU에 연결된 노드 개념은 비 균일 메모리 액세스 아키텍처를 사용하여 혼합 메모리 유형을 특수 다중 CPU 컴퓨터에 설치할 수 있습니다.

모두 최고급입니다. 일반적인 Linux 컴퓨터에는 node 0이라는 단일 노드가 있습니다. 모든 영역이 해당 노드에 속합니다. 컴퓨터의 노드와 영역을 보려면 /proc/buddyinfo 파일. 우리는 사용할 것이다 less 그렇게하려면 :

less /proc/buddyinfo

터미널 창에서 적은 / proc / buddyinfo

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

Node 0, zone DMA   1  1  1  0  2  1  1  0  1  1  3
Node 0, zone DMA32 2 67 58 19  8  3  3  1  1  1 17

단일 노드, 노드 0이 있습니다. 이 컴퓨터에는 2GB의 RAM 만 있으므로 “정상”영역이 없습니다. DMA와 DMA32의 두 영역 만 있습니다.

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

  • 2: 2 개 중 2 개 있습니다 ^ (0* PAGESIZE) 메모리 청크.
  • 67: 2의 67 중 671* PAGE_SIZE) 메모리 청크
  • 58: 2의 58 중 582* PAGESIZE) 사용 가능한 메모리 청크.
  • 그리고 계속해서 …
  • 17: 2 ^ 17 중 17512* PAGESIZE) 청크

그러나 실제로이 정보를보고있는 유일한 이유는 노드와 영역 간의 관계를 보는 것입니다.

파일 페이지 및 익명 페이지

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

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

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

교환의 경우, 파일 페이지와 익명 페이지의 목록에서 처음 두 가지만 고려하면됩니다.

스와 피 니스

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와 같은 소리는 스왑의 강도를 높이거나 낮 춥니 다. 흥미롭게도 swappiness를 0으로 설정해도 스왑이 해제되지는 않습니다. 특정 조건이 충족 될 때까지 커널이 스왑하지 않도록 지시합니다. 그러나 여전히 스와핑이 발생할 수 있습니다.

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

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

swappiness 값의 범위는 0에서 100까지입니다. 또한, 의견은 swappiness 값이 스와핑 발생량과 관련이있는 것처럼 들립니다.

소스 코드 파일에서 새로운 변수라는 것을 볼 수 있습니다. swappiness 함수에 의해 반환되는 값이 할당됩니다 mem_cgroup_swappiness(). 소스 코드를 통해 좀 더 추적하면이 함수가 반환 한 값이 vm_swappiness. 이제 변수는 swappiness 어떤 값이든 동일하게 설정 vm_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 값은 실제로 비율 중에서 가치.

황금 비율

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

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

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

마지막 코드 스 니펫에서 볼 수 있듯이 두 가지 변수가 있습니다. 하나는 file_prio “파일 우선 순위”및 anon_prio “익명 우선 순위”

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

이러한 변수는 함께 작동하는 값을 보유합니다. 둘 다 100으로 설정되면 동일합니다. 다른 값의 경우 anon_prio 100에서 0으로 감소하고 file_prio 두 값은 Linux 커널이 파일 페이지를 회수 (사용 가능)하거나 익명 페이지를 선호하는 상태로 실행할지 여부를 결정하는 복잡한 알고리즘으로 제공됩니다.

당신은 생각할 수 있습니다 file_prio 파일 페이지를 비 우려는 시스템의 의지와 anon_prio 익명 페이지를 무료로 제공하려는 시스템의 의지로 이 값들이하지 않는 것은 트리거 또는 임계 값을 설정하는 것입니다. 언제 스왑이 사용됩니다. 그것은 다른 곳에서 결정되었습니다.

그러나 메모리를 비워야 할 때이 두 변수와 그 사이의 비율은 교정 및 스왑 알고리즘에 의해 고려되어 어느 페이지 유형을 해제하기 위해 우선적으로 고려할지 결정합니다. 그리고 관련 하드 드라이브 활동이 파일 페이지를위한 파일을 처리 할 것인지 익명 페이지를위한 스왑 공간을 처리 할 것인지를 지시합니다.

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

우리는 Linux swappiness 값이 잠재적 인 교정을 위해 스캔 될 메모리 페이지 유형에 대한 환경 설정을 설정한다는 것을 확립했습니다. 괜찮 습니다만 어떤 것 결정해야한다 언제 스왑이 줄어 듭니다.

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

높은 워터 마크와 낮은 워터 마크가 무엇인지 확인하려면 /proc/zoneinfo 이 명령으로 파일 :

less /proc/zoneinfo

터미널 창에서 적은 / proc / zoneinfo

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

터미널 창에서 DMA32 워터 마크 값

  • 일반적인 실행 조건에서 영역의 사용 가능한 메모리가 영역의 낮은 워터 마크 아래로 떨어지면 스왑 알고리즘은 메모리 페이지의 스캔을 시작하여 메모리 값을 검색합니다. anon_priofile_prio.
  • Linux swappiness 값이 0으로 설정되면 파일 페이지와 사용 가능한 페이지의 결합 된 값이 상위 워터 마크보다 작을 때 스왑이 발생합니다.

따라서 RAM 사용량과 관련하여 스왑의 동작에 영향을주기 위해 Linux swappiness 값을 사용할 수 없음을 알 수 있습니다. 그것은 그렇게 작동하지 않습니다.

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

하드웨어, 워크로드, 하드 드라이브 유형 및 컴퓨터가 데스크톱인지 서버인지에 따라 다릅니다. 분명히 이것은 모든 유형의 설정에 맞는 단일 크기가 아닙니다.

또한 스왑은 메모리 공간이 부족할 때 RAM을 비우기위한 메커니즘으로 만 사용되는 것이 아니라는 점을 명심해야합니다. 스왑은 제대로 작동하는 시스템의 중요한 부분이며,이를 사용하지 않으면 Linux에서 제대로 된 메모리 관리가 매우 어려워집니다.

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

고려해야 할 사항은 다음과 같습니다.

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

Linux Swappiness 값을 설정하는 방법

교환 가치를 변경하기 전에 현재 값이 무엇인지 알아야합니다. 조금 줄이려면 질문이 무엇보다 조금 작습니까? 이 명령으로 확인할 수 있습니다.

cat /proc/sys/vm/swappiness

고양이 / proc / sys / vm / swappiness

swappiness 값을 구성하려면 sysctl 명령:

sudo sysctl vm.swappiness=45

터미널 창에서 sudo sysctl vm.swappiness = 45

새로운 값은 바로 사용되며 재부팅 할 필요가 없습니다.

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

sudo nano /etc/sysctl.conf

터미널 창에서 sudo nano /etc/sysctl.conf

언제 nano 파일 하단으로 스크롤하여이 줄을 추가하십시오. 영구 교환 가치로 35를 사용하고 있습니다. 사용하려는 값을 대체해야합니다.

vm.swappiness=35

터미널 창의 nano 편집기에서 /etc/sysctl.conf

변경 사항을 저장하고 종료하려면 nano, “Ctrl + O”, “Enter”및 “Ctrl + Z”를 차례로 누르십시오.

메모리 관리는 복잡하다

메모리 관리가 복잡합니다. 그렇기 때문에 보통 사용자에게는 보통 커널에 맡기는 것이 좋습니다.

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

스왑이 작동하지 않거나 스왑 피스 값을 변경해야 할 수도 있습니다.

언제나처럼, 악마는 자세하게 설명되어 있습니다. 또는이 경우 데몬입니다. 커널 스왑 데몬