충분한 양의 RAM이 있으면 스왑 공간이 필요합니까? 따르면, Linux에서

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

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



답변

예.

디스크를 전혀 사용하지 않거나 네트워크 디스크 만 존재하는 등 매우 설득력 있고 불가피한 이유가있는 경우를 제외하고는 항상 스왑이 활성화되어 있어야합니다 . 자주 권장되는 말도 안되는 크기 (예 : 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 데이터 세트를 사용하는 응용 프로그램이 있음) 손실이 거의 없습니다.

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


답변

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

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

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

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

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


답변

아마도:

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

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

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

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

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

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

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

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


답변

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

아마도!

나는 과거에 빌드 한 “어플라이언스”와 함께 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 블록이 있었지만 그다지 많지 않았습니다.

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


답변

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

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

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

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


답변

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

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

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


답변

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