충분한 양의 RAM이 있으면 스왑 공간이 필요합니까?


91

내가 이해 한 바에 따르면, Linux에서 스왑 파티션 의 목적은 RAM에서 "자주 액세스하지 않는"정보를 비우고 하드 드라이브의 특정 파티션으로 옮기는 것입니다 (읽기 또는 쓰기 속도가 느려짐). 본질적으로 활성 어플리케이션에 더 많은 "고속 메모리"를 허용합니다.

이것은 적은 양의 RAM이있는 머신에있을 때 유용하며 부족한 경우 문제가 발생하지 않습니다. 그러나 시스템에 16GB 또는 32GB 의 RAM이 있고 Linux에서 StackExchange 용 MySQL 데이터베이스를 실행하거나 1080p 전장 영화를 편집하지 않는 경우 스왑 파티션을 사용해야합니까?


16
@mikeserv 아시다시피, 나는이 두 글자를 코미디 효과를위한 답으로 받아들이고 싶습니다.
IQAndreas

3
@ 재니스-비용이 많이 듭니다. 또한 사운드 메모리 관리를 구현 한 경우 1GB 시스템에서도 스왑하지 않고도 쉽게 수행 할 수 있습니다. 스왑 비용 성능-커널이 있으면 필연적으로 커널이 사용합니다. 따라서 스왑 파티션을 만드는 1TB 또는 모든 크기의 디스크에서 메모리 페이지를 RAM에 보관하거나 완전히 삭제하지 않고 디스크에 커널을 초대합니다. 16GB를 사용하면 일반적인 사용자는 모두 사용하지 않을 것입니다 .3GB 가동 시간 후 24GB RAM을 사용하고 2GB를 사용하고 10GB를 캐시했습니다 (토런트를/tmp dl 했기 때문에 ) .
mikeserv

5
@ mikeserv, 당신은 내가 두려워하는 잘못이야; 표시된 디스크 메트릭을 지속적으로 관찰했습니다. 사용 가능한 메모리가있는 한, 스왑이 시작된 메모리 만 가득 찰 때만 스왑이 사용되지 않았습니다. 컴퓨터 사용 방법에 따라 다릅니다. 매일 저녁 종료되는 데스크톱 시스템은 메모리 문제가 거의 발생하지 않지만 시스템의 가동 시간은 몇 달이었습니다. 그렇습니다. 스왑 비용은 성능이지만 RAM 공간이 없으면 시스템이 계속 작동 할 수 있습니다. 어떤 옵션이 있습니까? 아마도 당신은 메모리 관리 논쟁에 대해 자세히 설명 할 수있을 것입니다. 미리 구성된 Linux 시스템을 사용합니다.
Janis

40
@ mikeserv 15 자 미만의 코멘트를 어떻게 게시 했습니까?
immibis

11
@immibis에는 12 개의 0 너비 공간 이 있습니다
dave

답변:


98

예.

디스크를 전혀 사용하지 않거나 네트워크 디스크 만 존재하는 등 매우 설득력 있고 불가피한 이유가있는 경우를 제외하고는 항상 스왑이 활성화되어 있어야합니다 . 자주 권장되는 말도 안되는 크기 (예 : RAM 크기의 두 배)로 교체해야합니까? 글쎄, 전혀 .

그 이유는 스왑이 실제 RAM보다 많은 메모리를 사용하는 경우에만 유용하지 않기 때문입니다 (실제로 스왑은 성능에 심각한 영향을 미치기 때문에 전혀 유용하지 않습니다 ). 스왑에 대한 주요 인센티브는 요즘 되지 마술 (32) 지브에 RAM의 16GiB를 켜하지만, 설치, 사용 가능한 RAM을보다 효율적으로 사용할 수 있도록.

최신 컴퓨터에서는 RAM이 사용되지 않습니다. 사용되지 않은 RAM은 돈을 사서 절약 할 수 없었던 것입니다. 따라서로드 한 내용이나 메모리로 매핑 된 내용, 나중에 (보안 제약 조건으로 제한됨) 누군가가 재사용 할 있는 내용은 캐시됩니다. 머신이 부팅 된 직후에 모든 물리적 RAM이 무언가 사용되었습니다 .

운영 체제에서 새 메모리 페이지를 요청할 때마다 메모리 관리자는 다음과 같이 교육 된 결정을 내려야합니다.

  1. 버퍼 캐시에서 페이지 제거
  2. 매핑에서 페이지를 제거합니다 (대부분의 시스템에서 효과적으로 # 1과 동일).
  3. 오랫동안 액세스하지 않은 페이지를 옮기십시오 (바람직하게는 절대로 절대로)
  4. 프로세스를 종료하거나 임의의 프로세스를 종료 (OOM)
  5. 커널 패닉

옵션 # 4 및 # 5는 매우 바람직하지 않으며 운영 체제에 다른 선택이없는 경우에만 발생합니다. 옵션 # 1과 # 2는 곧 다시 필요할 가능성이있는 것을 버립니다. 이는 성능에 부정적인 영향을 미칩니다.

옵션 # 3은 시간이 필요하지 않은 항목을 느린 스토리지로 곧바로 옮기는 것을 의미합니다. 이제 필요한 것이 빠른 RAM을 사용할 수 있기 때문에 괜찮습니다 .

옵션 # 3을 제거하면 운영 체제를 # 1 또는 # 2로 제한합니다. 디스크에서 페이지를 다시로드하는 것은 스왑에서 다시로드해야 할 가능성이 적다는 점을 제외하고는 스왑에서 다시로드하는 것과 동일합니다 (적절한 페이징 결정으로 인해).

즉, 스왑을 비활성화하면 아무것도 얻지 못하지만 메모리 요청을 처리 할 때 운영 체제의 유용한 옵션 수를 제한합니다. 어떤 되지 않을 수도 있습니다 ,하지만 매우 가능성이 있을 수 있습니다 단점을 (그리고 장점이 될하지 않습니다).

[편집하다]

mmap 맨 페이지를 주의 깊게 읽고 특히 설명을 MAP_NORESERVE읽으면 "충분한"물리적 메모리가있는 시스템에서도 스왑이 필요한 이유가 있습니다.

"스왑 공간이 예약되지 않은 경우 사용 가능한 실제 메모리가 없으면 쓰기시 SIGSEGV를 얻을 수 있습니다."

-잠깐만, 그게 무슨 뜻이야?

파일을 매핑하면 마치 프로그램의 주소 공간에 마치 마법처럼 마치 파일의 내용에 직접 액세스 할 수 있습니다. 읽기 전용 액세스의 경우 운영 체제 는 원칙적 으로 다른 가상 페이지에 액세스 할 때마다 다른 데이터로 다시 채울 수있는 물리적 메모리의 단일 페이지를 필요 하지 않습니다 (효율적인 이유로, 물론 수행되지는 않지만 원칙적으로 단일 페이지의 물리적 메모리로 테라 바이트에 달하는 데이터에 액세스 할 수 있습니다). 이제 당신 파일 매핑에 쓰시겠습니까? 이 경우 운영 체제에는 실제 페이지 또는 스왑 공간이 있어야 모든 페이지에 쓸 수 있습니다. 더티 페이지 쓰기 저장 프로세스가 작업을 완료 할 때까지 (몇 초 정도) 데이터를 보존 할 수있는 다른 방법은 없습니다. 이러한 이유로 OS는 스왑 공간을 예약하지만 (커밋하지 않을 수도 있음) 물리적 페이지를 사용하지 않는 동안 매핑에 쓰는 경우 (정상적으로 가능한 정상적인 조건) 여전히 작동한다는 것을 다시 보장 했습니다.

이제 스왑이 없으면 어떻게합니까? 이것은 스왑을 예약 할 수 없다는 것을 의미합니다 (duh!). 이것은 사용 가능한 실제 페이지가 남아 있지 않고 페이지에 쓰는 즉시 프로세스 수신의 형태로 즐거운 놀라움을 얻고 있음을 의미합니다 세그먼테이션 결함으로 인해 종료 될 수 있습니다.

[/편집하다]

그러나 스왑을 RAM 크기의 두 배로 만드는 기존의 권장 사항은 의미가 없습니다. 디스크 공간은 저렴하지만 많은 스왑을 할당하는 것은 의미가 없습니다. 저렴한 것을 낭비하는 것은 여전히 ​​낭비이며, 수백 메가 바이트 (또는 더 큰) 크기의 작업 세트를 계속해서 교환 하고 싶지는 않습니다 .

하나의 "올바른" 스왑 크기 는 없습니다 (사용자와 의견이있는만큼 많은 "올바른"크기가 있습니다). 나는 일반적으로 RAM 크기에 관계없이 고정 512MiB를 할당하여 나에게 매우 효과적입니다. 그 이유는 512MiB가 작은 디스크에서도 요즘 항상 감당할 수 있는 것입니다 . 반면에 몇 기가 바이트의 스왑을 추가하는 것이 좋습니다. 무언가 잘못 될 경우를 제외하고는 사용하지 않을 것입니다.

SSD에서도 스왑은 (버스 대역폭 및 대기 시간으로 인해) RAM보다 수십 배 느리며, 다시는 필요하지 않은 스왑으로 무언가를 옮기는 것이 매우 수용 가능 합니다. 다시 스왑하면 사용 가능한 페이지 풀이 무료로 효과적으로 확대 됩니다. 상당한 양의 스왑 이 필요한 경우 (즉, 50GiB 데이터 세트를 사용하는 응용 프로그램이 있음) 손실이 거의 없습니다.

컴퓨터가 기가 바이트에 해당하는 페이지를 교환하기 시작하면 모든 것이 크롤링됩니다. 따라서 (나를 포함한) 대부분의 사람들에게 이것은 옵션이 아니며, 많은 스왑을 갖는 것은 의미가 없습니다.


7
완전히 사실이 아님 : 특히 OOM을 사양에 맞게 구성한 경우 커널이 디스크를 사용하지 않는 것이 유리할 수 있습니다. OOM 킬러가 정리를 처리하도록 구성된 경우 디스크 공간을 낭비하고 시스템 속도를 저하시키지 않고 처리하는 것이 유리합니다.
mikeserv

22
8GB RAM과 8GB 스왑 및 16GB RAM과 스왑 없음의 차이점은 무엇입니까? 컴퓨터에 16.001GB의 메모리가 필요하다고 판단하면 동일한 것을 제거 / 제거하기 시작하지 않습니까?
Nick T

5
@ NickT : 스왑은 더 많은 RAM을 위해 빨간색 플래그가 아니기 때문에 곧 무언가가 죽을 것입니다. 나는 눈앞에 "무작위로"과정이 사라지는 것이 아니라 죽이기 전에 적기를하는 것을 좋아한다.
Mooing Duck

10
-1이 답변은 의미가 없습니다. 도대체 느린 메모리 (스왑)를 가진 이유가 같은 양의 빠른 메모리 (RAM)보다 성능이 더 좋은 이유는 무엇입니까? 어느 시점에서 당신은 충분한 RAM을 인정해야 스왑이 필요하지 않음을 의미합니다.
Mehrdad

14
@Mehrdad : 확실히 말이됩니다. "느린"속도는 거의 액세스하지 않거나 전혀 액세스하지 않는 항목에 대해서는 중요하지 않은 한 느린 메모리 (스왑)는 성능을 향상시킵니다. 스왑은 "콜드"데이터를 이동시켜 "핫"데이터에 사용할 수있는 메모리의 양을 효과적으로 증가시킵니다. 시간당 한 번만 무언가를 실행하거나 기본적으로로드되지만 결코 사용되지 않는 커널 모듈에 의해 할당 된 메모리를 실행하는 데몬이 그 예입니다. 그것들을 교환 하거나 대신 캐시에서 페이지를 삭제할 수 있습니다. 어느 것이 더 낫습니까?
Damon

50

나는 여기에 언급 된 몇 가지 의견에 동의하지 않을 것입니다. 나는 여전히 프로덕션 환경에서 SWAP 파티션을 만들고 있습니다. 가정용 컴퓨터와 VM에도 적용됩니다.

요즘 나는 약 1-1.5 배의 메모리 크기를 정하고 있습니다. 경험의 2 배는 경험의 법칙이었다. 스왑 디스크는 백업하거나 보호 할 필요가 없기 때문에 "저렴한"상태입니다.

메모리가 부족하면 스왑 공간이 문제를 해결하기 위해 약간의 시간과 쿠션을 제공합니다.

/ tmp와 같은 것이 스왑 공간에있을 수 있음을 인식하십시오.

스왑 영역에는 다음에 다시 부팅 할 때 부분 커널 덤프를 복원 할 수 있습니다. 이것은 나중에 호출해야 할 디버깅 비상 상황에 유용 할 수 있습니다.


16
+1. 스왑이 있다는 것은 메모리 부족과 하드 크래시 성능 저하 간의 차이를 의미합니다.
Davidmh

6
@mikeserv 구성 방법에 관계없이 프로그램이 사용 가능한 것보다 많은 메모리를 할당하려고하면 무언가 충돌이 발생하거나 OS가 메모리를 종료하기 시작합니다.
Davidmh

6
@Davidmh : 그 이유 때문에 스왑 파일은 무한히 커야합니다. 그렇지 않으면 스왑 파일을 모두 사용할 때 프로그램이 계속 충돌합니다.
Mehrdad

6
@Mehrdad 그러나 더 비싸다. 당신이 감당할 수있는만큼의 X GB의 RAM이 있다고 가정하면, 합리적인 Y 값에 대해 X GB의 RAM과 Y의 스왑을 갖는 것보다 엄청나게 나쁩니다. 당신의 HD).
Davidmh

9
"스왑 공간은 문제를 해결하기 위해 약간의 시간과 쿠션을 제공합니다."-또한 메모리 누수가 스스로 해결 될 때까지 응답이없는 머신 앞에 훨씬 더 오래 앉아야한다는 것을 의미합니다.
Raphael

23

아마도:

나는이 주제에 대해 많은 생각을했고, 논쟁의 양 측면에 내가 생각할 수있는 것보다 더 많은 의견이 제시되는 것을 보았다. 나의 접근 방식은 알아내는 방법을 개발하는 것이 었습니다.

충분한 크기라고 생각되는 활성 스왑 파티션으로 시작하십시오.

그런 다음 작업 공간에서 터미널을 열고 free -hs 1매초마다 한 번씩 사용량을보고 하는 명령 을 발행하십시오 .

선택적으로 다른 작업 공간으로 전환하십시오.

당신이 할 수있는 모든 일을하고 그 후에 더 많은 일을하십시오. 모든 공통 응용 프로그램을 한 번에 실행하고 여러 탭을 탐색하고 필사적으로 시스템에 실제 운동을 제공하면 컴파일 작업을 실행하고 전자 메일 등을 검사하는 동안 1/2 다스 비디오를 다시 인코딩해야 할 수 있습니다. 의는 사실을 직면하자,이 방법에 대한 모든 것입니다 당신은 당신의 시스템을 사용합니다.

시스템의 부하가 높을 때 (혹은 얻을 수있는 것보다 높을 때) 터미널을보고 결과를 조사합니다. 또는 >output.txt전체 실행을 검사 할 수 있도록 명령 에 추가 하여 출력을 파일로 리디렉션하는 것이 좋습니다 . 사용 된 스왑이 Mem free를 초과하지 않으면 스왑이 필요하지 않습니다. 그렇다면, 그렇습니다. free.png

스왑이 필요하지 않습니다. 어쩌면 당신은 할 수 있습니다. 왜 알아?

사이징 스왑과 관련하여 일반적으로 사용 기반 질문이므로 경험에 따라 규칙이 과대 평가됩니다.


2
스왑은 시스템에 절대적으로 필요한 경우에만 사용된다고 말하는가? 어떤 경우에 대비하여 스왑을 활성화하면 페널티가 있습니까? 다른 의견은 스왑의 존재조차도 성능에 해를 끼칠 수 있다고 제안하는 것 같습니다.
MrWhite

3
@ w3d 아뇨. 위의 출력에서 ​​볼 수 있듯이 스왑은 필요하지 않더라도 사용됩니다. 이것은 swappiness factor로 다소 조정할 수 있습니다. 스왑이 필요한지 여부에 대해 이야기하고 있습니다.
Geek

시간 swap이 지남에 따라 스왑을 증가시키기 위해 이것을 스크립트 할 수 있습니까 free?
JFA

@ JFA 나는 이것을 보지 못했습니다. 개인적으로 나는이 목적을 위해 결정되지 않은 스왑 공간을 예약하는 개념에 어려움이 있습니다. 이론적으로 모든 것이 가능합니다. 흥미로운 구현 단계입니다.
Geek

17

참고 : 이것은 특이하고 특이한 상황에서 나에게 일어났습니다. 문제를 해결하는 경우 유용 할 수 있습니다. 모든 머신에 반드시 스왑이 있어야한다는 의미는 아닙니다.

아마도!

나는 과거에 빌드 한 "어플라이언스"와 함께 Linux를 실행하는 문제를 겪었다. 컴팩트 플래시 장치에서 실행 중이고 스왑을 사용하여 CF를 착용하고 싶지 않았으며 애플리케이션을위한 메모리가 충분했다.

이러한 어플라이언스의 대부분은 정상적으로 작동했지만 특히 바쁜 상자에서 문제가 발생했습니다.

메모리 파편

스왑 공간이 없으면 메모리가 점점 더 조각화되었습니다. 특히 오래 실행되는 프로세스 (사용 가능한 메모리가 많더라도 모두 매우 작은 비트였습니다). 나는 스왑 공간을 넣고 리눅스가 필요하지 않으면 리눅스를 사용하지 말라고 말했다. 이것은 문제를 완전히 해결했습니다.

스왑 공간은 다른 모든 것 외에도 메모리를 이동하여 조각 모음을 수행 할 수있게합니다. 조각난 메모리가 있고 하나의 큰 청크가 필요한 경우 조각이 교체됩니다. 다시 교체되면 효과적으로 조각 모음이 수행됩니다.

/ proc / buddyinfo를 확인하십시오-내 모습은 다음과 같습니다.

Node 0, zone      DMA      9      5      3      4      2      3      2      2      3      3      1 
Node 0, zone    DMA32  33901   1149      0      0      0      0      0      0      0      0      1 
Node 0, zone   Normal   2414   1632    259     22      3      0      2      0      1      1      0 

숫자는 다른 크기의 블록을 나타냅니다. 각 크기는 다음 블록 크기의 절반이며 왼쪽의 4MB 블록에서 오른쪽의 4kb (즉, 4mb, 2mb, 1mb 등)입니다. 새로 부팅 된 머신은 왼쪽에 모든 블록이 있어야하고 오른쪽에 매우 적은 블록이 있어야합니다 (= 조각화되지 않음). 또한 같은 양의 메모리 (예 : 4mb)는 열에서 서로 다른 숫자로 표시됩니다. 가장 왼쪽 열의 1 블록, 가장 오른쪽 열의 1024입니다.

메모리는 가능한 한 풀에서 할당됩니다. 예를 들어 프로그램이 12kb의 메모리 (한 번에)를 원하면 16kb 열에서 가져옵니다. 나머지는 4kb 열에 나타납니다. 16kb 블록이없는 경우 32kb 블록에서 가져와 16kb 및 4kb가 남습니다.

충분히 큰 메모리 블록이없고 스왑 공간이있는 경우, 예를 들어 16kb의 메모리를 원하면 가장 적게 사용되는 16kb 블록 (예 : 4kb 사용 된 블록, 4kb의 사용 가능한 블록, 2 개의 더 많이 사용 된 4kb 블록), USED 부분 만 스왑으로 이동하고 사용 가능한 메모리를 새 응용 프로그램에 할당합니다.

충돌 한 상자에는 수십만 개의 4kb 및 8kb 블록이 있었지만 그다지 많지 않았습니다.

내가 말할 수있는 한 (충돌 된 머신에 의해 간다!) 커널은 메모리에서 스왑으로 이동하고 메모리로 스왑하지만 메모리에서 메모리로 이동하지는 않는다.


3
귀하의 사례는 거대한 페이지를 할당 / 구현하는 데 좋은 것으로 보입니다. 한 번 할당되면 특정 크기의 거대한 페이지가 그 크기로만 다시 할당되기 때문에 조각화 문제를 피할 수 있습니다 .
mikeserv

2
이것이 스왑 파티션 사용에 찬성하여 읽은 가장 좋은 이유입니다. 빠른 검색을 시도했지만 그것에 대한 참조를 찾지 못했습니다.이 기능이 더 자주 문서화되지 않은 이유가 궁금합니다.
SE 마하려면

1
(투명하지 않은) 거대한 페이지는 앱에서 사용하지 못할 수 있습니다. 일반적으로 많은 메모리가 필요한 앱은이를 사용할 수 있습니다. 예를 들어, 데이터베이스 서버, java jvm. 명시 적으로 활성화해야하며 다른 목적으로는 사용할 수없는 별도의 메모리 풀이됩니다. 상황에 따라 좋을 수도 있고 나쁠 수도 있습니다. 또한 투명한 hugepages에 대해 배웁니다. 앱이 어떻게 알지 못하더라도 거대한 페이지를 사용하도록 (성능 향상을 위해) 이동하려고 시도합니다. 메모리가 조각난 경우 hugepage 스위퍼가해야 할 일이 많아지면서 남쪽으로 갈 수 있습니다.
Dan Pritts

1
플래시 어플라이언스에 대한 귀하의 경험을 의심하지 않습니다. 귀하가 제시 한 단일 사용 사례가 아마도 스왑이 필요할 것으로 생각하고 메모리 조각화가 스왑이 있는지 여부에 대해서는 확신하지 않습니다. 쉽게 테스트하고 입증하거나 반증 할 수있는 흥미로운 질문을 제기합니다.
Geek

1
후속 질문 . "메모리 조각화"는 무엇을 의미합니까? MMU는 일부 가상 주소 공간에서 연속 페이지에 사용 된 실제 페이지가 연속적인지 여부를 신경 쓰지 않습니다. 물리적 페이지는 조각화되어 있지만 중요하지 않습니다 (단일 클러스터 물리적 시스템에서 일반 응용 프로그램 메모리를 말하고 주변 장치 나 하이퍼 바이저에서 사용하는 메모리 페이지가 아닌 경우). 프로그램이 16kB를 요청하면 실제 메모리에서 서로 가까이 있거나 없을 수있는 4 페이지를 얻습니다.
Gilles

15

스왑 파티션은 부족할 때 단순히 여분의 RAM 역할을하는 것 이상의 중요한 가치를 지닙니다.

하나의 경우, 리눅스는 가능한 많은 메모리를 사용하여 파일과 IO 작업을 캐시합니다. 스왑이 있으면 더 많은 메모리가 IO 캐싱에 들어가고 (디스크 액세스를 최소화하고 SSD의 마모를 줄임으로써) 더 빠르게 메모리를 만드는 것을 알 수 있습니다 일부 프로그램이 할당했지만 12 시간마다 한 번만 사용하는 데이터를 보유하는 데, 이는 일부 데몬의 경우 일 수 있습니다.

또한 리눅스는 낙관적 인 메모리 할당 전략을 사용하여 페이지를 채울 실제 메모리가 확실하지 않은 경우에도 명목상 페이지를 할당 할 수 있습니다. 이것은 적절한 검사를 수행하는 것보다 효율적이며 모든 할당을 매핑하며 일반적으로 문제를 일으키지 않습니다. 그러나 커널이 할당 허용 여부를 판단하기 위해 사용하는 휴리스틱에는 시스템에서 사용 가능한 스왑 수준이 포함되므로 시스템이 많이 사용되지 않더라도 시스템에 스왑이 많으면 할당 속도가 빨라질 수 있습니다.

이 요소들을 함께 사용하면 거의 모든 일반 시스템에서 스왑을하는 것이 낫다는 것을 개인적으로 믿게되지만 큰 램 크기의 경우 램 * 2 규칙을 무시하고 단순히 스왑을 4-8GB로 제한합니다 (디스크 크기에 따라 다름) ).


9
심지어 4GB도 데스크탑에 비해 너무 큽니다. 차라리 뭔가 잘못되었을 때 스왑이 가득 찰 때까지 OOM 킬러를 활성화하고 싶습니다. (내가 더 필요로하는 경우가 발생하면 RAM보다 많은 가상 메모리가 필요한 작업을 실행하기 전에 스왑 파일을 dd 및 mkswap 할 수 있습니다. 즉, 웹 브라우저를 종료해도 충분하지 않은 경우 ...)
Peter Cordes

@PeterCordes 아마 당신이하고있는 어떤 종류의 작업에 달려있을 것입니다. 개인적으로, 컴퓨터를 사용하는 동안 백그라운드에서 낮은 우선 순위로 긴 컴파일을 자주 수행하므로 높은 수준의 스왑이 도움이된다는 것을 알게됩니다. 어쨌든). 그럼에도 불구하고, 그것은 매우 개인적인 작업 부하 기반의 것이므로 동의하기 전에 항상 자신의 사용법에 대해 생각해야합니다.
Vality

1
재미있는 이야기 : 바로 오늘, 4GB RAM, 0.5G 스왑 (SSD)이있는 랩톱에서 파이어 폭스는 파이어 폭스를 선택한 OOM 킬러를 트리거했습니다. 나는 전에 그런 일이 없었습니다. (저는 평소보다 랩톱을 더 많이 사용하고 있었지만). 거의 아무것도 실행되지 않았습니다 (xfce의 gnome-terminal). 그래서 파이어 폭스는 너무 많은 RAM을 묶는 것보다 더 잘 알아야하기 때문에 괜찮습니다. 나는 누군가가 "가상 메모리 서브 시스템을 스트레스 테스트하기 위해 웹 브라우저가 존재한다"고 말하는 것을 보았다. Firefox는 며칠 동안 사용되지 않은 탭의 캐시를 비우는 데 상당히 나쁩니다.
Peter Cordes

3
리눅스가 사용 가능한 스왑 공간을 고려하는 한 가지 사례는 큰 프로세스가 자식을 시작하려고 할 때입니다. fork () + exec () 시스템 호출은 부모의 할당을 대략 복제하여 시작합니다. 커널은 새 자식이 더 작을 것이라고 보장 할 수 없습니다 부모보다. 스왑 공간은 일반적으로 사용되지 않지만 사용 가능한 경우가 아니면 fork ()가 실패 할 수 있습니다. 클라이언트의 일반적인 예는 플러그인을 시작하는 브라우저 또는 대형 애플리케이션 컨테이너가 헬퍼 프로그램을 호출 할 때 서버입니다. 1/2 또는 1GiB의 스왑만으로도 문제를 해결할 수 있습니다. Google "java exec가 메모리를 할당 할 수 없음"
James

13

커널이 스왑 인 / 아웃을 기다리는 것을 허용 할 수있는 최대 크기보다 큰 스왑이 없어야합니다. 그렇지 않으면 시스템에 대해 새로운 장애 모드를 생성하는 것입니다 (스왑시 복구 불가능한 상태가 됨). 최신 드라이브가 GB / 초 단위로 전송 될 수 있음에도 불구하고, Linux는 일반적으로 초당 수백 kB의 라인을 따라 더 높은 속도로 스왑을 이동할 수 있습니다. 따라서 스왑을 크게하면 몇 분, 몇 시간 또는 며칠 동안 시스템을 사용할 수 없게됩니다.

수행중인 작업에 충분한 실제 메모리가있는 경우 스왑의 이상적인 크기는 메모리를 "정크 데이터"프로세스가 유지하지만 사용하지 않는 양과 일치시키는 것입니다. 이것은 아마도 수백에서 수백 메가 바이트의 범위에있을 것입니다. 이 전략을 사용하면 다시는 사용할 수없는 데이터의 영구 저장소가 아닌 유용한 정보를 캐싱하는 데 모든 실제 메모리를 활용할 수 있습니다.

실제 메모리가 충분하지 않으면 심한 스와핑으로 인한 심각한 속도 저하를 견딜 수 있는지 평가해야합니다. 그렇다면 최대 1-2GB의 스왑 사용하는 것이 좋으며 드라이브가 매우 빠른 경우 최대 4GB를 사용할 수 있습니다. 그러나 그 이상은 시스템의 고장 모드를 악화시킬 뿐이므로 RAM을 더 구매하는 것이 좋습니다.


2
이것이 가장 좋은 대답이라고 생각합니다. 스왑 공간이 너무 많으면 모든 스와핑으로 인해 시스템이 완전히 응답하지 않을 수 있습니다. 그것은 당신이 문제의 프로세스를 죽일 수 없다는 것을 의미합니다. 스왑 공간을 줄이면 OOM 킬러가 자동으로 작업을 수행합니다. 파일 버퍼 캐싱에 대한 다른 답변의 주장은 완전히 설득력이 없습니다. 커널이 파일 버퍼를 스왑으로 옮길 수 있도록 스왑이 있어야합니다. 디스크에 있습니까? 부디.
Timmmm

내가 찾을 수있는 스왑 공간에 대한 유일한 논쟁은 "일부 프로그램에서 메모리 누수"입니다. 과? OOM 킬러가 저장하지 않은 중요한 것을 죽이면 효과적으로 작업을 잃게됩니다. 즉,이 주장이 완전히 관련이 없게됨에 따라, 많은 메모리를 사용하고 종종 스왑되는 우선 순위가 낮은 작업에 대해 높은 스왑 공간을 유지하면서 시스템을 강제로 셧다운시킬 수 있습니다. 기계가 그러한 상태에 갇 히면 그것은 당신 자신의 잘못입니다. 그것이 나에게 일어난 유일한 시간은 전체 작업 메모리를 채우는 프로그램을 직접 작성했을 때였습니다.
Sahsahae

11

최대 절전 모드로 전환 할 수있는 경우에만이 기능을 "디스크 일시 중단"이라고하며 RAM의 전체 내용을 저장하고 전원을 끄는 작업이 포함됩니다. 일반적으로 이것은 랩톱 및 기타 모바일 장치에서만 사용되므로 다릅니다.


6

수행하려는 작업에 따라 다르기 때문에 보편적이고 명확한 대답은 없습니다. DB, HTTP, 가상화 또는 캐시 서버를 실행하려는 경우 보유한 램 양에 관계없이 어떤 종류의 스왑도 사용하지 않아야합니다. 데스크탑 또는 혼합 작업 호스트가 있고 16GB 이상의 빠른 RAM이있는 경우 여기를 살펴보십시오. zRam


zRam은 훌륭한 선택입니다. 나는 작은 플래시 드라이브 시스템과 함께 사용하여 좋은 효과를 보았습니다.
Geek

1
@ElderGeek 네트워크 부팅과 같은 디스크없는 환경에서도 사용했습니다. 훌륭한 작업이지만 몇 가지주의 사항이 있습니다. 첫째, 더 많은 램이 필요하지 않고 빠른 것이 필요합니다. 느리고 저렴한 램 모듈은 일반적인 일반적인 경우에 문제가 될 수 있습니다. CPU Front-Side 버스도 고려해야합니다. CPU 주파수는 느리지 만 FSB 주파수는 빠를 경우 성능이 크게 향상됩니다. 두 번째 관심사는 많은 zRam 스왑 파티션입니다. 1에서 CPU 코어 수까지의 숫자를 시도하십시오. 단일 코어 시스템에서는 사용하지 마십시오!
Alexey Vesnin

모두 유효합니다. 저는 성능에 관심이 많고 항상 자체 시스템을 설계하고 구축하기 때문에 개인적으로 그런 우려에 시달리지 않습니다
Geek

@ElderGeek 저도 :) 만나서 반가워요! 또한 zRam 동작에서 이상한 점을 발견했습니다. 다른 커널 버전 및 구성에서는 나타나고 사라지지만 커널 HZ 100 및 1000에서는 재현성이 뛰어납니다. zRam은 1,2,4에서 잘 작동하지만 더 많은 파티션은 아닙니다. 거의 유휴 상태 인 작업의 상위 하드웨어에있는 8 개 및 16 개의 물리적 코어에서도 마찬가지입니다. 따라서 비틀기를 가지고 노는 것을 명심하십시오! 러시아에서 인사드립니다!
Alexey Vesnin

"db를 실행하면 램 마운트에 관계없이 어떤 종류의 스왑도 활성화해서는 안된다"는 것에 동의하지 않습니다. 임의의 프로세스를 죽이는 OOM 킬러보다 일반적으로 스와핑이 바람직합니다. 예, 실행중인 응용 프로그램에 충분한 메모리가 있어야합니다. 예, 많은 양의 스왑을 사용하면 시스템 속도가 느려질 수 있습니다. 나는 당신이 이상적인 세상에 사는 것을 부러워합니다.
AMADANON Inc.

5

스왑 공간이 필요한지 아닌지 알 수있는 유일한 방법은 우리가 알고있는 유일한 매개 변수가 설치된 RAM의 양인지 여부입니다.

어쨌든 스왑 공간이 시스템 성능에 부정적인 영향을 준다는 일반적인 오해가 있습니다. 이것은 올바르지 않습니다. 충분한 RAM이 있으면 크기에 상관없이 스왑 영역이 있으면 성능이 전혀 저하되지 않습니다. 성능에 영향을주는 것은 RAM이 부족하고 효과적으로 스왑 공간을 사용한다는 것입니다.

  • 사례 1 : 스왑 공간이없고 RAM이 부족한 경우 Linux 커널은 좋은 후보라고 생각하는 프로세스를 하나 이상 선택하여 종료합니다.

  • 사례 2 : 스왑 공간이 있고 RAM이 부족하면 커널은 사용 된 메모리 페이지를 덜 선택하여 스왑 영역에 배치하여 RAM을 비 웁니다. 이렇게하면 시스템 속도가 느려지지만 응용 프로그램에는 영향을 미치지 않습니다.

커널이 내 응용 프로그램을 죽일 가치가 있다고 생각하기 때문에 불편한 부분이나 모든 작업을 느낀다고 생각하기 때문에 항상 사례 2를 선호합니다. 또한, 평균 디스크의 현재 크기가 TB 범위에 있기 때문에 스왑을 위해 몇 퍼센트를 예약해도 문제가되지 않습니다.


6
RAM이 부족한 유일한 시간은 런 어웨이 프로그램이있을 때뿐이기 때문에 사례 1을 선호합니다. OOM 킬러는 일반적으로 런 어웨이를 식별하는 데 능숙하며, 몇 시간 동안 무거운 스와핑을 한 직후보다 실제로 죽이려고합니다.
Mark

1
@ 마크, 그게 맞습니다. 나는 여전히 알고리즘에 위임하는 것을 피하려고 노력한다.
jlliagre

2
case 2는이 상황에 대해 경고하는 것이 있고 시스템이 스왑에서 떨어지기 전에 수동으로 "뭔가를"수행 할 충분한 시간이있는 경우에만 유효합니다. 그러나 대신 동일한 결과에 대해 사용 된 RAM의 백분율을 모니터링 할 수 있습니다.
Totor

1
추론에 따라 RAM 사용량을 모니터링하면 충분 합니다.
Totor

1
@Totor 나는 많은 파일을 처리하고 RAM을 소진하는 배치를 시작했기 때문에 랩톱 모니터링 응용 프로그램으로 한밤중에 깨우기를 원하지 않습니다. 전체 작업을 중단하는 것보다 RAM 크기가 작아서 몇 시간이 더 걸리더라도 작업을 수행하는 것을 선호합니다.
jlliagre

3

모든 시스템에서 스왑을 적용하는 규칙은 다음에 대한 답변을 얻는 것입니다.

  • 시스템의 목적은 무엇입니까?
  • 응용 프로그램이 얼마나 많은 메모리를 사용합니까?
  • 이것이 중요한 시스템입니까?
  • 파일 전송을위한 임시 디스크 공간이 필요합니까?
  • 응용 프로그램의 예상 성장률?

이 정보에 대한 답변을 받으면 그에 따라 시스템의 크기를 조정합니다. 지난 몇 년 동안 나는 Sun Microsystem의 경험에 따라 경험했습니다. 16GB에서 같은 양으로 SWAP에 대해 최대 16GB의 RAM을 두 배로 늘립니다. 그러나 반면에 여유 공간이 충분하고 앱이 강제로 SWAP을 사용하지 않는 경우 스왑을 생략 할 수 있습니다. 필요한 경우 새 디스크를 넣거나 정리하고 SWAP을 구성하기 만하면됩니다. "kernel panic"의 경우 Solaris에서 메모리를 완전히 덤프하여 추가 분석을 위해 스왑하기 때문에 Sun의 규칙이 주로 적용되었습니다.


1

모든 프로그램을 실행 하기에 충분한 RAM이 없으면 스왑이 필요 합니다.

많은 RAM이 필요한 작업을 수행하지 않는다고 말합니다. 따라서 충분한 RAM이 있습니다.

그런 다음 스왑 공간이 필요 하지 않습니다 .

그러나 어떤 시점에서 질문에 암시하는 내용에도 불구하고 프로그램이 RAM의 절반 (또는 엄지 손가락)의 절반 (또는 2/3) 이상을 사용한다고 생각하면 다른 "프로 스왑 " 답변. 스왑 은 필요 하지 않지만 시스템 성능을 향상시킬 수 있습니다.


스왑을 사용하면 치명적인 충돌을 피할 수 있지만 낙하산 이상으로 페라리 속도가 빨라집니다. ;-)
Geek

@ElderGeek 가장자리 일 수도 있지만 스왑이 도움이 될 수 있습니다. 모든 것에 충분한 RAM이있는 경우가 있지만 유휴 프로그램을 교체하여 RAM을 더 잘 사용할 수 있습니다 (예 : 유용한 디스크 캐시). 나는 90 년대 후반에 이것을 많이 보았습니다. 실제로 스왑 공간이 필요없는 <1GB의 사용 가능한 RAM (디스크 캐시 포함)이있을 때 때때로이 문제가 발생합니다.
jbo5112

@ jbo5112 나는 당신이 그렇게 말하면 가능성을 완전히 배제하지 않을 것입니다. 내 경험은 지금까지 다르게 나타났습니다. 시스템이 단단하고 빠른 규칙 (모두가 찾는 것처럼 보이는 것) 이상으로 사용되는 경우이기 때문에 이것은 놀라운 일이 아닙니다.
Geek

@ElderGeek 내 디스크는 10 년이 지나서 필사적으로 캐시가 필요하기 때문에 지금 만 볼 수 있습니다. 일반적으로 거의 모든 경우에 대해 교환 률이 너무 높게 설정되는 추가 문제가 있으며, 이로 인해 교환 공간이 너무 적극적으로 사용됩니다. 값을 60에서 10으로 낮추는 것이 일반적인 권장 사항입니다. 더 낮아질 수는 있지만 언젠가는 너무 많은 디스크 캐시를 덤프하여 스와핑하는 동안 많은 추가 I / O가 발생합니다.
jbo5112

좋은 지적이야. 항상 서로 다른 하위 시스템 간의 균형 조정 작업입니다. 씨게이트 ST225 및 ST238 드라이브가 장착 된 80286 시스템에서 최대 성능을 발휘하기 위해 하드 디스크 인터리브 및 RAM 재생률과 같은 목표를 조정했던 것을 기억합니다. 우리는 최대의 성능과 안정성을 위해 항상 사례별로 접근해야합니다. 축하합니다 BTW! 마지막으로 드라이브에서 10 년을 que을 수 있었던 것은 총 600MB의 마이크로 폴리스였습니다.
Geek

0

짧은 대답 :

예, 응용 프로그램이 메모리 매핑을 방해하지 않고 가상 메모리를 직접 매핑하는 경우와는 달리 항상 스왑이 필요합니다.

스왑 파일을 다음과 같이 설정하십시오.

  • RAM+round(sqrt(RAM)) 최대 절전 모드를 사용하는 경우
  • round(sqrt(RAM)) 당신이하지 않으면

서버가 아닌swappiness 데스크탑에서는 10으로 설정하십시오 !

긴 대답 :

과거에:

지난 25 년 동안 사용 된 경험 법칙은 최소 1xRAM 및 최대 2xRAM 이므로 항상 인용됩니다.

내가 10 대 였을 때 석기 시대에 그 최소값이 설정 되었고 공룡은 여전히 ​​지구를 돌아 다녔고 RAM이 너무 비싸서 무언가를 성취 할 수있는 스왑 공간절대적으로 필요 했기 때문 입니다.

그 당시 최대 값은 반품 감소로 설정되었습니다. HDD 액세스가 RAM보다 1000 배 느리기 때문에 너무 많은 메모리를 교체해야하는 것은 너무 느립니다. 비상시에는 좋지만 일상적인 사용에는 좋지 않습니다! 스왑 공간이 부족해 졌을 때 RAM을 더 추가 할 때가되었습니다! (오늘은 여전히 ​​그렇습니다).

현재 :

  1. 최대 절전 모드를 사용하지 않고 메모리가 1GB 인을 초과하는 경우 엄지 손가락의 새로운 규칙은 round(sqrt(RAM))어디 RAM분명히 GB에 RAM의 크기입니다.

  2. 최대 절전 모드를 사용하는 경우 전체 RAM + 이미 스왑 된 RAM을 디스크로 스왑 할 수 있어야하므로 공식은 다음과 같습니다. RAM+round(sqrt(RAM))

  3. 반품 감소 규칙은 여전히 ​​최대 값을 유지하지만 실제 사용량을 테스트하지 않는 한 2xRAM을 사용하면 디스크 공간이 낭비 되므로 다른 방법을 사용하여 스왑 공간이 부족하지 않는 한 최대 값을 사용하지 마십시오 .

이들 모두 함께 다음 표를 제공합니다. (스왑 공간을 나타내는 마지막 3 개 열)

    RAM   No hibernation    With Hibernation    Maximum
    1GB              1GB                 2GB        2GB
    2GB              1GB                 3GB        4GB
    3GB              2GB                 5GB        6GB
    4GB              2GB                 6GB        8GB
    5GB              2GB                 7GB       10GB
    6GB              2GB                 8GB       12GB
    8GB              3GB                11GB       16GB
   12GB              3GB                15GB       24GB
   16GB              4GB                20GB       32GB
   24GB              5GB                29GB       48GB
   32GB              6GB                38GB       64GB
   64GB              8GB                72GB      128GB
  128GB             11GB               139GB      256GB
  256GB             16GB               272GB      512GB
  512GB             23GB               535GB        1TB
    1TB             32GB              1056GB        2TB

위 의 규칙 은 단지 경험의 법칙입니다. 중력의 법칙이 아닙니다! 특정 사용 사례가 다른 경우 (중력의 법칙과 달리)이 규칙을 어길
있습니다 !

전문가 팁 : 헤드는 디스크 내부에서 덜 움직여야하므로 HDD 시작시 항상 SWAP를 할당하십시오.
예 : SSD의 경우 이동 헤드 대신 양자 터널링을 사용하므로 스왑 영역을 찾는 위치는 더 이상 중요하지 않으며 최신 SSD는 모든 메모리 셀 (할당되지 않은 공간)을 사용하여 양자 열화를 방지합니다.

스왑 사용이 "일반"규칙과 다른지 테스트하는 방법 :

그냥 실행하십시오 :

for szFile in /proc/*/status ; do 
  awk '/VmSwap|Name/{printf $2 "\t" $3}END{ print "" }' $szFile 
done | sort --key 2 --numeric --reverse | more

스왑 아웃되는 모든 실행중인 프로그램의 목록을 제공합니다 (스왑 공간이 가장 많은 프로그램)

몇 KB 이상을 사용하는 경우 최소 크기 이상으로 크기를 조정하십시오. 그렇지 않으면 귀찮게하지 마십시오 ...

서버를 사용 중이라면 지금 읽기를 중지하십시오 : 모든 준비가 완료되었습니다!


서버가 아닌 데스크탑 / 노트북 클라이언트를 사용하는 경우 GUI가 가능한 한 신속하게 응답하고 실제로 필요할 때만 교환 하기를 원합니다 . Ubuntu는 서버 사용을 위해 조기에 스왑하도록 최적화 되었지만 클라이언트에서는 250MB의 원시 이미지를 gimp빠르게 편집하기를 원 하므로 swappiness10으로 설정 하면 커널이 너무 일찍 스왑되지 않도록하면서도 t 너무 늦게 교체 :

sudo nano /etc/sysctl.conf

그리고 추가하십시오 :

# change "swappiness" from default 60 to 10 
# (theoretically only swap when RAM usage reaches around 80 or 90 percent)
vm.swappiness = 10

파일의 끝 부분에 파일을 저장하고 ( 나노에서 Ctrl+ XY+ Enter) 다음을 실행하십시오.

sysctl --system

매개 변수를 다시로드하거나 오래된 시간 동안 Window $ 접근 방식을 사용하여 재부팅하십시오 ... :-)


-1

타협 한 답변 : "should"의 의미에 따라 다릅니다.

설명하는 작동 조건에서 불량이 발생하면 불량이 발생할 수 있다는 의미에서 스왑 파티션 이 필요 합니까? 아니.

이다 현명한 당신의 OOM 킬러 차기 전에 그들을 죽일 수있는 기회를 가질 수 있도록 당신이 실수로 메모리 돼지의 군대를 생성 단지의 경우 스왑 파티션을 가지고? 예.

실제 RAM이 "대부분"동시에 모든 프로그램의 데이터 메모리 사용량을 초과하면 항상 동시에 실행되므로 스왑을 사용하면 성능상의 이점이 없습니다. 초과하지는 않지만 "대폭"이 아닌 경우, OS가 거의 사용하지 않는 메모리를 교체하여 더 자주 액세스하는 파일 데이터를 메모리에 유지할 수있는 경우 성능상의 이점이있을 수 있습니다.

요약하면, 16GB RAM이있는 것이 좋습니다. 그러나 1TB 디스크도 있으면 16GB를 스왑 할 수 없습니다. 디스크의 1.5 %에 불과합니다.

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