RAM에 충분한 여유 공간이있을 때 스왑을 사용하는 이유는 무엇입니까?


124

RAM 대신 스왑 공간을 사용 하면 PC 속도크게 저하 될 수 있습니다 .

그렇다면 사용 가능한 RAM이 충분할 때 Linux 시스템 (아치)이 스왑을 사용하는 이유는 무엇입니까?

아래의 conky 출력을 확인하십시오.

conky 출력

또한 이것이 속도 및 시스템 응답 문제의 원인 일 수 있습니까?

출력 free -m:

$ free -m
             total       used       free     shared    buffers     cached
Mem:          1257       1004        252          0         51        778
-/+ buffers/cache:        174       1082
Swap:          502        144        357

5
SSD가 표준이됨에 따라이 문제의 역학이 크게 바뀌 었다고 확신합니다. 일반 소비자 SSD는 여전히 RAM보다 속도가 훨씬 느리지 만 이제는 RAM $ / GB 또는 SSD $ / GB 중 저렴한 것이 중요합니다. SSD는 느리지 만 훨씬 저렴하고 대부분의 경우 충분히 빠르기 때문에 교체 미디어도 회전 미디어에서와 같이 사용자 경험을 크게 방해하지 않아야합니다.
lkraav

7
때로는 전체 RAM으로 인해 과거에 스왑을 사용한 경우 이전에 스왑 된 데이터가 현재 유용한 데이터가 아니기 때문에 해당 위치 에 머무를 수 있습니다 .
Totor

1
토토가 말했듯이. 때때로 시스템은 어떤 이유로 든 페이지를 출력합니다. 나중에 해당 페이지가 읽기 조작을 위해 메모리로 다시 이동되면 스왑 공간의 사본이 삭제되지 않습니다. 동일한 페이지가 나중에 변경되지 않고 다시 페이징 아웃되면 디스크에 다시 쓰지 않고도 그렇게 할 수 있습니다. 존재하는 사본이 이미 최신입니다. 즉, 페이지는 스왑 및 기본 메모리에서 공간을 차지할 수 있습니다.
izak

답변:


93

RAM이없는 경우에도 Linux 시스템에서 일부 스왑 을 사용 하는 것이 일반적입니다 . Linux 커널은 매우 드물게 사용되는 스왑 메모리 페이지로 이동합니다 (예 : gettyX11 만 사용 하는 인스턴스 및 일부 다른 비활성 데몬).

스왑 공간 사용은 사용 가능한 RAM이 충분하지 않은 경우에만 문제가되고 커널은 응용 프로그램을 계속 실행하기 위해 메모리 페이지를 계속 스왑 및 RAM으로 다시 이동해야합니다. 이 경우 시스템 모니터 응용 프로그램에는 많은 디스크 I / O 활동이 표시됩니다.

비교를 위해, 그놈 데스크탑을 실행하는 X11 세션으로 로그인 한 두 명의 사용자가있는 Ubuntu 10.04 시스템은 ~ 600MB의 스왑과 ~ 1GB의 RAM (버퍼 및 fs 캐시는 제외)을 사용하므로 스왑 수치는 다음과 같습니다. 사용법이 정상적으로 보입니다.


39
비활성 프로그램을 교체하면 파일 캐싱을위한 더 많은 메모리가 있습니다. 그리고 그것은 속도를 향상시킵니다.
jmanning2k

91

이 동작은 다음 값을 설정하여 구성 할 수 있습니다.

/proc/sys/vm/swappiness

기본값은 60입니다. 0으로 설정하면 RAM이 남아 있고 100이 가능한 빨리 메모리를 스왑 아웃 할 때 스왑을 사용하지 않습니다.

값을 일시적으로 변경하려면 (재부트시 손실) :

sudo sysctl vm.swappiness=10

값을 영구적으로 변경하려면 파일을 편집하십시오.

/etc/sysctl.conf

루트 (예 :)로 sudo nano /etc/sysctl.conf변경하고 행을 변경하거나 추가하십시오 (없는 경우).

vm.swappiness

원하는 값으로. 이 파일이 존재하지 않으면 (예 : Arch Linux에) /etc/sysctl.d/99-sysctl.conf대신 시도하십시오 .

사용 가능한 메모리로 교체하는 것이 좋은지 나쁜지에 대한 논쟁이 있었지만 Ubuntu 도움말은 실제로 데스크탑 시스템에 10의 값을 권장합니다 . CentOS 용 Digital Ocean에 대한이 학습서를 참조하십시오 .


27
교환 율이 감소 한다고해서 반드시 성능 또는 응답 성이 향상되는 것은 아닙니다 . 나는의 보고서를 본 적이 증가하고 더 나은 성능으로 swappiness 번역합니다. 벤치 마크가 포함되어 있지 않은 것으로 읽은 것을 믿지 말고 벤치 마크가 자신과 유사한 작업을 사용하는지 확인하십시오.
Gilles

재부팅 후에도 지속됩니까? 부팅 할 때마다 / proc가 재생성되었다고 생각했습니다.
HandyGandy

@ HandyGandy : 나는 그것을 영구적으로 변경하는 방법에 대한 정보를 답변에 추가했습니다.
Marcel Stimberg

@HandyGandy : 매번 부팅 할 때마다 / proc는 재생성되지 않고 proc은 가상 파일 시스템이므로 액세스 할 때 "생성"됩니다. 디스크에는 전혀 존재하지 않습니다.
Lie Ryan

swappiness가치는 내 시스템에 영향을 미치지 않습니다. 이 값을 0으로 설정하더라도 여전히 2GB의 여유 램이있을 때 중요하고 자주 사용되는 페이지 (예 : IDE의 인덱스)를 스왑하기 위해 계속 이동합니다.
chefarov

46

RAM이 가득 차기 전에 Linux가 스와핑을 시작합니다. 이는 성능과 응답 성을 향상시키기 위해 수행됩니다.

  • 때로는 프로그램 메모리를 저장하는 것보다 RAM이 디스크 캐시에 더 잘 사용되므로 성능이 향상됩니다. 따라서 한동안 사용하지 않는 프로그램을 바꾸고 자주 사용하는 파일을 캐시에 보관하는 것이 좋습니다.

  • 메모리가 가득 차고 일부 프로그램이 실행 중이고 작업을 완료하기 위해 더 많은 RAM을 요청하는 경우가 아니라 시스템이 유휴 상태 일 때 페이지를 스왑 아웃함으로써 응답 성이 향상됩니다.

스와핑은 물론 시스템 속도를 늦추지 만 스와핑의 대안은 스왑이 아니라 RAM이 많거나 RAM을 적게 사용하는 것입니다.


어떤 의미에서 스왑은 사건의 척도입니까? 그리고 최대 절전 모드 ?
tshepang

@Tshepang : 가상 메모리에 맞도록 충분한 스왑을 갖는 것은 "경우에"필요하지 않습니다 (그렇지 않으면 메모리 부족으로 인해 프로그램이 중단됩니다).
Gilles

1
@Tschepang : OOM 킬러가 충돌하는 이유입니다. (기술적으로 OOM 킬러없이 할 수 있고 아무것도 할당 할 수는 없지만 시스템을 잠글 가능성이 높습니다. OOM 킬러는 관리자가 로그인하여 중요한 프로세스를 계속 실행하십시오.)
Gilles

1
"메모리가 가득 찼을 때가 아니라 시스템이 유휴 상태 일 때 페이지를 스와핑"한다는 점을 이해하지만, 그 사람은 거의 15 %의 RAM을 사용하고 있습니다. 거의 꽉 차 있지 않습니까? 전체 RAM으로 인한 이전 스와핑이이 상황을 떠났을 수도 있지만 ...
Totor

1
"RAM이 가득 차기 전에 Linux가 스왑을 시작합니다"? 정확히
Yousha Aleayoub

11

이것은 오래된 게시물이지만 여전히 여기에 내 생각을 자유롭게 할 수 있습니다.

아래에서 시작하여 Linux는 먼저 메모리를 페이지 (일반적으로 x86_64 시스템의 페이지 당 4K)로 나눕니다. 그 후, MMU (Memory Management Unit)를 사용하여 물리적 메모리로 매핑되는 가상 메모리가 생성됩니다.

프로세스에는 가상 메모리 영역에서 메모리가 할당되므로 / proc / meminfo가 표시되면 VMalloc *가 가상 메모리 세부 정보로 표시됩니다.

메모리를 요청하는 프로세스 (예 : 300MB-웹 브라우저)가 있다고 가정 해 봅시다. 프로세스는 가상 메모리에서 300MB로 할당되지만 메모리 매핑 (실제 메모리에 매핑) 일 필요는 없습니다. 메모리 관리를위한 "Copy on Write"개념이 있는데, 프로세스가 실제로 가상 메모리에서 할당 된 메모리를 사용하는 경우 (즉, 메모리에서 일부 쓰기를 수행하는 경우) 물리적 메모리에만 매핑됩니다. 이를 통해 커널이 다중 프로세스 환경에서 효율적으로 올바르게 작동 할 수 있습니다.

캐시 란 무엇입니까?

프로세스가 사용하는 많은 메모리가 공유됩니다. glibc 라이브러리는 거의 모든 프로세스에서 사용됩니다. 모든 프로세스가 동일한 메모리 위치에 액세스하여 작업을 수행 할 수있을 때 glibc의 여러 복사본을 메모리에 보관하는 시점은 무엇입니까? 이와 같이 자주 사용되는 리소스는 캐시에 보관되므로 프로세스 요구시 동일한 메모리 위치를 참조 할 수 있습니다. 디스크에서 glibc 등을 다시 읽는 것은 시간이 많이 걸리므로 프로세스 속도를 높이는 데 도움이됩니다.

위의 말은 공유 라이브러리에 대한 것이며 파일 읽기와 비슷합니다. 큰 파일 (예 : 100-200MB)을 처음 읽으면 시간이 많이 걸립니다. 그러나 동일한 읽기를 다시 시도하면 더 빠릅니다. 데이터가 메모리에 캐시되었으며 모든 블록에 대해 다시 읽기가 수행되지 않았습니다.

버퍼 란?

버퍼와 관련하여 프로세스가 파일 I / O를 수행 할 때 디스크의 데이터를 쓰기 위해 커널 버퍼에 의존합니다. 프로세스는 커널에게 작업을 수행하도록 요청합니다. 따라서 프로세스를 대신하여 커널은 데이터를 "버퍼"에 기록하고 프로세스에 쓰기가 완료되었음을 알립니다. 비동기 방식으로 커널은 버퍼의이 데이터를 디스크와 계속 동기화합니다. 이런 식으로 프로세스는 커널에 의존하여 데이터를 디스크에 동기화 할 정확한 시간을 선택하고 프로세스는 계속 진행될 수 있습니다. 이것은 일반적인 프로세스가 수행하는 일반적인 I / O입니다. 그러나 실제로 디스크에서 I / O가 수행되는지 확인해야하는 특수 프로세스는 다른 메커니즘을 사용하여 디스크에서 I / O를 수행 할 수 있습니다. 오픈 소스 유틸리티 중 일부는 libaio입니다. 또한 프로세스 컨텍스트에서 열린 FD에 명시 적 동기화를 호출하는 방법이 있습니다.

그러면 페이지 결함은 무엇입니까?

바이너리가 약 300MB 인 프로세스 (예 : 웹 브라우저)를 시작할 때의 예를 고려하십시오. 그러나 전체 300MB의 웹 브라우저 바이너리가 즉시 작동하지 않습니다. 프로세스는 코드에서 함수 간 이동을 계속합니다. 앞에서 언급했듯이 가상 메모리는 300MB를 소비하지만 모든 메모리가 실제 메모리에 매핑되는 것은 아닙니다 (RSS-상주 메모리가 적을 수 있습니다. 상단 출력 참조). 코드 실행이 실제로 물리적으로 매핑되지 않은 지점에 도달하면 페이지 오류가 발생합니다. 커널은이 메모리를 물리적으로 매핑하고 메모리 페이지를 프로세스에 연결합니다. 이러한 페이지 오류를 "사소한 페이지 오류"라고합니다. 마찬가지로 프로세스가 파일 I / O를 수행 할 때 주요 페이지 결함이 발생합니다.

언제 그리고 왜 스왑 아웃이 발생합니까?

상황 1 :

위의 세부 사항과 함께, 많은 양의 메모리가 메모리 매핑되는 시나리오를 고려하십시오. 이제 메모리가 필요한 프로세스가 시작됩니다. 위에서 논의한 것처럼 커널은 메모리 매핑을 수행 할 것입니다. 그러나 메모리를 매핑하는 데 사용 가능한 물리적 RAM이 충분하지 않습니다. 이제 커널은 먼저 캐시를 살펴보고 사용하지 않는 오래된 메모리 페이지를 갖게됩니다. 해당 페이지를 별도의 파티션 (SWAP)으로 플러시하고 일부 페이지를 비우고 비워진 페이지를 새로 오는 요청에 매핑합니다. 디스크 쓰기가 솔리드 스테이트 RAM보다 훨씬 느리기 때문에이 프로세스에는 많은 시간이 걸리므로 속도가 느려집니다.

상황 2 :

시스템에서 사용 가능한 많은 여유 메모리를 볼 수 있다고 가정합니다. 그럼에도 불구하고 많은 스왑 아웃이 발생하고 있음을 알 수 있습니다. 메모리 조각화 문제가있을 수 있습니다. 커널에서 50MB의 연속 메모리가 필요한 프로세스를 고려하십시오. (인접을 명심하십시오). 분명히 커널은 다른 프로세스에 무작위로 페이지를 할당하고 그 중 일부를 해제했을 것입니다. 그러나 연속 메모리를 요구할 때는 프로세스 요구를 만족시키는 청크를 찾아야합니다. 그러한 메모리를 확보 할 수없는 경우 일부 오래된 메모리 페이지를 교체 한 다음 연속적인 페이지를 할당해야합니다. 그러한 경우에도 SWAP가 발생합니다. 커널 버전 2.6 이상부터는 이러한 조각화 문제가 상당히 줄었습니다. 그러나 시스템이 오랫동안 실행되는 경우에도 여전히 이러한 문제가 발생할 수 있습니다.

이 예를 참조하십시오 ( vmstat 출력 )

2016-10-29 03:55:32 procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------
2016-10-29 03:55:32  r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
2016-10-30 03:56:04 19 23 2914752 4692144 3344908 12162628 1660    1  8803 12701 4336 37487 14  7 40 38  0
2016-10-30 03:56:34  3 20 2889296 4977580 3345316 12026752 2109    2  8445 14665 4656 36294 12  7 46 34  0
2016-10-30 03:57:04  1 11 3418868 4939716 3347804 11536356  586 4744  2547  9535 3086 24450  6  3 59 33  0  <<<-----
2016-10-30 03:57:34  3 19 3456252 5449884 3348400 11489728 3291 13371  6407 17957 2997 22556  6  4 66 24  0
2016-10-30 03:58:04  7  6 4194500 5663580 3349552 10857424 2407 12240  3824 14560 2295 18237  4  2 65 29  0
2016-10-30 03:58:34  2 16 4203036 5986864 3348908 10838492 4601 16639  7219 18808 2575 21563  6  4 60 31  0
2016-10-30 03:59:04  3 14 4205652 6059196 3348760 10821448 6624 1597  9431  4357 1750 20471  6  2 60 31  0
2016-10-30 03:59:34  2 24 4206968 6053160 3348876 10777216 5221 2067 10106  7377 1731 19161  3  3 62 32  0
2016-10-30 04:00:04  0 13 4205172 6005084 3348932 10785896 6236 1609 10330  6264 1739 20348  4  2 67 26  0
2016-10-30 04:00:34  4 11 4206420 5996396 3348976 10770220 6554 1253 10382  4896 1964 42981 10  5 58 27  0
2016-10-30 04:01:04  6  4 4177176 5878852 3348988 10825840 8682  765 10126  2716 1731 32949  8  4 69 19  0

@ 2016-10-30 03:57:04, 우리는 여전히 충분한 양의 여유 RAM이 있음을 알 수 있습니다. 그러나 그때도 스왑 아웃이 발생했습니다. 우리는이 시점에서 프로세스 트리를 점검했지만, 많은 양의 메모리 (여유 메모리 이상)를 요구하는 프로세스는 나타나지 않았습니다. 명백한 의심은 위에서 설명한 상황 2였다. 위의 buddyinfo 및 zoneinfo 로그를 확인했습니다 (echo m> / proc / sysrq-trigger를 사용하여이를 확인하면 출력은 syslog로갑니다).

우리 시스템의 일반적인 시스템의 경우 영역 정보를 비교하면 다음과 같습니다. 캐시 / 프리 / 로우 메모리에 대한 그래프도 아래에 언급되어 있습니다.

영역 정보

스왑 프리 로우 프리

정보를 보면 노드 0 및 노드 1 정상에 메모리 조각화가 있음이 분명합니다 (노드는 NUMA 기반 시스템이므로 여러 노드 (시스템의 정보를 확인하려면 numactl 참조)).

메모리 조각화는 사용 가능한 메모리가있는 경우에도 스왑 사용량이 증가 할 수있는 이유입니다.


2
"상황 2"에서 까다로운 프로세스가 특별한 경우 인 물리적 메모리를 할당하고 있는지 명확히해야합니다. 대부분의 프로세스는 조각화가 거의 관련이없는 가상 메모리 만 처리합니다. 또한 처음에는 명확하지 않기 때문에 표시된 숫자와 차트에서 메모리 조각화가 있다고 주장하는 방법을 더 잘 설명하고 싶을 수도 있습니다. 아, 그런데, 당신은 실제로 연속적인 기억 에 대해 이야기하고 있습니다 . 희망적으로 전염성이 없는 기억 ;-)
jlliagre

@jlliagre : 입력 주셔서 감사합니다. "연속적인"오류를 편집하고 있습니다.
Anugraha Sinha

5

사용 가능한 메모리가 더 있음

모든 사람들이 말했듯이, 예 스왑은 사용하지 않는 메모리를 제거하는 데 도움이되므로 더 많은 메모리를 사용할 수 있습니다.

동면

그러나 스왑은 최대 절전 모드 로도 사용할 수 있습니다. 랩톱이 있거나 에너지를 절약하고 컴퓨터를 종료하고 작업을 떠나기 전에 최대 절전 모드로 전환하려고 할 때 매우 유용합니다. 따라서 아침마다 더 빨리 시작할 수 있습니다.

최대 절전 모드 기능을 사용하는 것이 요즘 여전히 스왑을 위해 최소 RAM 크기를 갖는 것이 좋습니다. 그렇게하면 시스템은 사용 된 모든 RAM을 스왑에 넣고 최대 절전 모드로 전환 할 수 있습니다.

단점

스왑이 암호화 된 경우가 아니라면 스왑 된 프로세스 데이터는 스왑 후에도 종료 후에도 스왑에서 읽을 수 있습니다.

최대 절전 모드에서 암호화 된 스왑을 사용하면 모든 배포에서 기본적으로 작동하지 않습니다. 다시 시작하기 전에 암호화 된 볼륨을 활성화하려면 일정한 암호화 키 (일부 설정에서는 각 부팅시 스왑 공간 암호화 키를 임의로 생성 함)와 initrd / initramfs를 사용해야합니다.


3

많은 현대적인 프로그램은 프로그램을 실행하기 위해 실제로 필요하지 않은 많은 쓰레기를 끌어들이는 부풀린 프레임 워크를 기반으로합니다. 사용하지 않는 페이지를 바꾸면 실제로 RAM을 사용할 수있는 캐시 및 프로그램을 위해 RAM이 비워집니다.

나는 여기에서 고통스러운 개인적인 경험에서 말합니다.

작년에 웹 사이트 중 하나를 Firefox 위에 구축 된 유망한 새 웹 서버 프레임 워크로 전환했습니다. Firefox와 같은 클라이언트 중심의 프로그램 위에 서버 측 시스템을 구축하는 것이 이상하게 들릴지 모르지만 큰 이점이 있습니다. Firefox는 매우 강력하고 매우 인상적인 내부 서비스를 제공하며 서버와 클라이언트 간의 임피던스 불일치를 줄여서 유사한 플랫폼을 실행합니다.

그러나 단점은 파이어 폭스가 크다는 것입니다. 매우 큰. 이것은 버전 1.x 종류의 프로젝트 였으므로 GUI 지원을 제거하는 것과 같은 문제를 해결하지 못했습니다. [*] 내 사이트에는 필요가 없었지만 호스팅 제공 업체가 사용한 VPS 기술 때문에 ' 스왑 공간, GUI 코드 및 Firefox의 다른 모든 부분은 실제 RAM을 사용하지 않았습니다. 메모리 소진으로 인해 사이트가 충돌하지 않고 사이트를 실행하기 위해 최소 512MB RAM이 필요 했습니다. 내 VPS에 스왑 공간이 있다면 256MB 요금제를 사용했을 수 있습니다.

[*] 프레임 워크에서 GUI 코드를 제거하는 것은 바람직하지 않을 수 있습니다. 서버 측 프레임 워크가 다른 사이트에서 웹 페이지를 다운로드하고 조작 할 수 있기 때문에이 플랫폼의 장점 중 하나는 충실도 높은 웹 스크래핑이었습니다. 클라이언트 쪽에서와 마찬가지로. 매시업을 생각하십시오. 웹 페이지를 일부 그래픽 컨텍스트로 "렌더링"할 수 없으면 많은 종류의 문제가 발생합니다.

그건 그렇고,이 웹 프레임 워크는 본질적으로 죽었으므로 이름을 밝히지 않아도됩니다. 더 넓은 교훈을 염두에 두는 것이 가장 좋습니다. 예. 여유 RAM이 많은 경우에도 스왑은 여전히 ​​유용합니다.


3

에서 우분투 스왑 자주 묻는 질문 마르셀에 연결되어 있음

기본적으로 스왑 공간은 실제 메모리 양 (RAM)과 같아야합니다. 또한 스왑 공간은 하드 디스크 양에 따라 실제 메모리 양 (RAM)의 두 배인 것이 좋습니다.

시스템에서 스왑 공간을 늘려야한다고 생각합니다. 스왑은 이미 페이징 된 데이터를 버리도록하여 RAM 메모리 할당 속도를 높입니다.


6
나는 아직도 이것을 믿을 수 없다고 생각한다. 최대 절전 모드가 아닌 4GB 시스템에 8GB의 스왑이 필요한 이유는 무엇입니까? 64GB 컴퓨팅 노드에 대해 128GB의 스왑이 실제로 필요합니까? 구체적인 이유가없는 한 스왑에 일반적으로 1GB 이하를 할당합니다.
David Mackintosh

2
번개처럼 빠른 RAM에 저속 HDD를 캐싱하기위한 더 많은 공간을 남겨 둡니다. (또한 일부 동면 구성표는 RAM 사본을 스왑 공간에 저장합니다)
Arafangion

6
@David, @Jader : swap = 2 * ram 수치는 원래 정당화가 관련이 없어진 후에도 살아남은 오래된 밤입니다. 이제 사람들은 시스템에 적합한 수치를 제시하는 대신이 수치를 정당화하는 방법을 찾으려고합니다. . 를 참조하십시오 우리는 우리의 물리적 메모리로 두 배 큰 스왑 공간을 설정해야합니다 왜? .
Gilles

1
@Gilles 나는이 주제에 관한 권위있는 논문을 한 번 보았 기 때문에 그들의 지식이 얼마나 깊은 지 모르는 많은 전문가들과 모순되기 때문에 나는 내 입장을 고수한다.
Jader Dias

4
참조를 기억할 수 있으면 공유하십시오.
Gilles

2

"Gilles"는 이미 충분한 RAM을 보유하고 있지만 특정 "약점"동안 스왑이 유용 할뿐만 아니라 종료 후에도 일부 데이터를 지속적으로 저장하는 데 유용 할 수 있다는 사실을 이미 언급했다고 생각합니다. 재부팅 후 RAM이 플러시되기 때문에) 시스템에 12GB의 RAM을 사용할 수 있으며 이전 에도이 질문에 대해 숙고했습니다. 어느 시점에서 모든 스왑을 비활성화하고 RAM에만 의존했을 때 시스템 종료 후 일부 시스템 오류 또는 충돌 등을 디버깅하는 데 어려움을 겪었습니다. 그 이후로 스왑 파티션을 다시 활성화했습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.