대부분의 사람들이 교체율을 10-20으로 줄 이도록 권장하는 이유는 무엇입니까?


65

여러 사이트에서 성능 향상을 위해 스왑을 10-20으로 줄이는 것이 좋습니다.

신화인가 아닌가? 이것이 일반적인 규칙입니까? 4GB Ram 및 128GB SSD 하드가 장착 된 랩톱이 있습니다. 교체 가치는 무엇입니까?

감사.


5
귀하가 나열한 사이트는 기본값 변경을 권장하는 이유를 설명하지 않습니다. 복잡한 문제에 대한 까다로운 선택에 대한 답변이 여기에 훨씬 좋습니다.
nealmcb

답변:


88

대부분의 경우 교환 = 나쁜 것으로 생각하고 교환을 줄이지 않으면 시스템이 실제로 필요하지 않을 때 교환합니다. 둘 다 사실이 아닙니다. 사람들은 스와핑을 시스템이 다운되는 시간과 연관 시키지만 시스템은 다른 방식이 아닌 스왑 다운 되기 때문에 스와핑 됩니다. 시스템을 교체 할 때 이미 교체 비용을 결정할 때 성능 비용을 고려했으며, 그렇게하지 않으면 시스템 성능이나 안정성에 전반적으로 더 큰 불이익이있을 것이라고 결정했습니다.

전반적으로 기본 설정은 전반적인 성능과 안정성을 향상시킵니다. 기본값을 그대로 두는 것이 좋습니다. 리눅스가 메모리 관리를 개선하여 일부 경우를 해결하는 방법이 더 있지만 대체로 스왑 피스 제어는 좋은 해결 방법이 아닙니다. 한 방향으로 조정하면 문제를 해결하고 다른 문제를 만들 수 있습니다. 가능하면 더 많은 실제 RAM을 설치하고 스왑 피스 만 남겨두면 다른 모든 해결 방법이 사라집니다.

리눅스가 RAM을 사용하는 방법

응용 프로그램에서 사용하지 않는 RAM은 "캐시"로 사용될 수 있습니다. 캐시는 빠르고 부드러운 실행 시스템에 중요하며 디스크 읽기 및 쓰기 속도를 모두 높여줍니다.

응용 프로그램이 거의 모든 RAM을 사용하는 시점까지 메모리 사용을 늘리면 캐시가 줄어들고 결과적으로 평균 디스크 작업 속도가 느려집니다. 요즘 캐시에는 수십 메가 바이트 이하로 충분하지 않습니다.

스왑 공간이 없다고 가정 할 때 응용 프로그램의 메모리 사용이 더 늘어날 경우 캐시 공간이 부족할뿐만 아니라 결국 메모리가 부족하게되어 시스템에서 실행중인 프로세스를 종료해야합니다. 프로세스를 죽이는 것은 불안정하고 예측할 수없는 시스템을 제공하기 때문에 속도 저하보다 더 나쁩니다.

리눅스가 스왑을 사용하는 방법

이러한 두 가지 문제를 해결하기 위해 시스템은 거의 사용하지 않는 일부 응용 프로그램 메모리를 디스크의 스왑 공간에 다시 할당하여 RAM을 비울 수 있습니다. 추가 RAM을 사용하면 메모리 부족으로 인해 프로세스가 종료되는 것을 막을 수 있으며 약간의 캐시를 회수하여 디스크 작업이보다 원활하게 작동 할 수 있습니다.

이 재 할당은 명확한 컷오프에 따라 수행되지 않습니다. Linux가 스와핑을 시작한 후 일정 비율의 할당에 도달하지 않습니다. "퍼지"알고리즘이 있습니다. "메모리 할당에 대한 압력이 얼마나 많은지"에 의해 가장 잘 설명 할 수있는 많은 것들이 고려됩니다. 새 메모리를 할당해야하는 "압력"이 많으면 더 많은 공간을 확보하기 위해 일부 메모리를 교체 할 가능성이 높아집니다. "압력"이 적 으면 이러한 기회가 줄어 듭니다.

시스템에는 "스왑"설정이있어이 "압력"계산 방법을 조정할 수 있습니다. 종종 "RAM의 백분율"로 잘못 표시되지만, 공식의 일부로 사용되는 값이 아닙니다. 40에서 60 사이의 값이 권장되는 정상 값이며, 현재 60은 기본값입니다.

RAM이 많더라도 시스템을 교체해야하는 것은 전반적으로 매우 좋은 일입니다. 시스템을 교체해야하는 경우 일시적으로 (많은 메모리를 사용하는 짧은 프로세스를 실행하는 동안) 메모리 부족 상황에 처하게되면 시스템이 모든 것을 계속 실행할 수있는 두 번째 기회를 갖게됩니다. 스와핑을 완전히 비활성화하지 않으면 메모리를 할당 할 수 없어 프로세스가 종료 될 위험이 있습니다.

시스템이 다운되거나 크게 스왑되면 어떻게됩니까?

스와핑은 느리고 비용이 많이 드는 작업이므로 시스템은 캐시 성능의 균형이 전체적으로 보상을 받거나 프로세스 종료를 피해야하는 경우를 계산하지 않는 한이를 피합니다.

많은 사람들이 디스크를 많이 쓰러 뜨리고 많은 스왑 공간을 사용하고 스왑을 비난하는 시스템을 살펴볼 것입니다. 그것은 잘못된 접근 방식입니다. 스와핑이이 극한에 도달하면 스와핑이 문제의 원인이 아니라 메모리 부족 문제를 해결하려는 시스템의 시도이며, 스왑하지 않으면 실행중인 프로세스를 스와핑하지 않고 임의로 죽는다는 의미입니다.

데스크탑 시스템은 어떻습니까? 다른 접근 방식이 필요하지 않습니까?

데스크탑 시스템 사용자는 실제로 응용 프로그램 열기와 같이 사용자가 시작한 작업에 대한 응답으로 시스템이 "응답 감"을 기대합니다. 이는 필요한 메모리 증가로 인해 때때로 스왑을 트리거 할 수있는 작업 유형입니다.

일부 사람들이이를 조정하려는 한 가지 방법은 메모리를 사용하고 캐시 공간이 부족한 상태에서 응용 프로그램에 대한 시스템의 허용 오차를 높일 수있는 swappiness 매개 변수를 줄이는 것입니다.

그러나 이것은 단지 목표를 바꾸는 것입니다. 첫 번째 응용 프로그램은 이제 스왑 작업없이로드 될 수 있지만 다음에로드되는 응용 프로그램의 경우 여유가 줄어 듭니다. 다음에 애플리케이션을 대신 열 때 동일한 스와핑이 나중에 발생할 수 있습니다. 그 동안 캐시 크기가 줄어들어 시스템 성능이 전반적으로 저하됩니다. 따라서 감소 된 스와 피 니스 설정의 이점은 측정하기 어려울 수 있으며, 때때로 스와핑 지연을 줄이지 만 다른 시간에는 다른 성능 저하를 유발할 수 있습니다. 수행중인 작업을 알고 있으면 스왑을 줄이는 것이 정당화 될 수 있지만 10 %로 줄이면 시스템이 매우 작은 캐시 크기에 견딜 수 있고 시스템이 짧은 통지로 스왑해야 할 가능성이 높아집니다.

프로세스가 충돌하거나 종료 될 수있는 메모리 부족 조건에 대한 추가 보호 기능을 상실하므로 스왑을 완전히 비활성화하지 마십시오.

지금까지 가장 효과적인 해결책은 여유가있는 경우 더 많은 RAM을 설치하는 것입니다.

어쨌든 많은 RAM이있는 시스템에서 스왑을 비활성화 할 수 있습니까?

응용 프로그램에 필요한 것보다 훨씬 많은 RAM이 있다면 스왑이 거의 필요하지 않습니다. 스왑을 비활성화하면 대부분의 시간에 차이가 없을 것입니다. 그러나 충분한 RAM이 있다면 스왑을 활성화 상태로두면 시스템이 필요하지 않을 때 스왑되지 않기 때문에 페널티가 없습니다.

차이가 생길 수있는 유일한 상황 은 시스템에 메모리 부족이 발생하여 캐시 시스템이 방해를받는 경우가 거의 없을 것이며, 이런 상황에서는 스왑을 가장 많이 원합니다 . 따라서 메모리가 충분할 때 부정적인 영향을주지 않고 안심하고 사용할 수 있도록 정상 설정으로 스왑을 안전하게 유지할 수 있습니다.

그러나 스왑은 어떻게 시스템 속도를 높일 수 있습니까? 스와핑이 느려지지 않습니까?

RAM에서 스왑으로 데이터를 전송하는 작업은 느리게 진행되지만, 합리적인 캐시 크기를 유지 한 결과로 커널이 전반적인 이점을 능가하는 것이 확실한 경우에만 수행됩니다.

데이터가 교환되면 언제 다시 나옵니까?

메모리의 주어진 부분은 읽거나 쓰는 즉시 사용되는 즉시 스왑에서 나옵니다. 그러나 일반적으로 스왑되는 메모리는 오랫동안 액세스하지 않았으며 곧 필요하지 않을 메모리입니다.

스왑 외부로 데이터를 전송하는 작업은 스왑 외부로 전송하는 것만 큼 시간이 많이 걸립니다. 커널은 필요하지 않은 경우 데이터를 제거하지 않습니다. 데이터가 스왑 중이고 사용되지 않는 동안 사용중인 다른 것들에 대한 더 많은 메모리 와 더 많은 시스템 캐시 남습니다 .

교환 율 감소가 적절한 경우가 있습니까?

예. 시스템 캐시의 이점이없는 하나의 특정 서버 응용 프로그램 전용 서버를 실행하는 경우 Oracle 서버, MySQL / MariaDB와 같은 일부 데이터베이스 서버는 이러한 데이터베이스 엔진이 자체 캐싱을 사용하므로 스왑을 1에서 10으로 줄이는 것을 권장합니다.

이것은 시스템이 하나의 작업에만 전념하고 MySQL / MariaDB의 경우에만 MyISAM 또는 Aria 등이 아닌 순수 InnoDB 또는 XtraDB를 사용하는 경우에만 해당됩니다.


철저한 설명 감사합니다. 필자의 경우 (4GB Ram 및 128GB SSD 하드) 내 사용법 (자바 EE 개발 및 가상 상자의 여러 운영 체제) swappiness = 20이 적합하다고 생각합니다. 어떻게 생각해?
Saeed Zarinfam

내 생각에 기본값 60이 가장 좋을 것이라고 생각합니다.
thomasrutter

4
@BlancaHiggins 댓글을 올린 글을 읽었습니까? 귀하의 의견은 실제로 스왑 피스가하는 일을 설명하지 않는 것 같습니다.
thomasrutter 2018 년

1
이것은 훌륭한 답변입니다. 훌륭한 설명에 감사드립니다.
Dan Barron

2
내 의견으로는 SwapFaq이 오해의 소지가 있다는 정보의 일부입니다. 100으로 설정하면 "공격적으로"교환됩니다. 사용 가능한 메모리 또는 캐시가 조금 낮아지고 있다는 첫 신호를 교환하면서 매우 신중하고 사전 예방적인 설정이라고 말하는 것이 더 정확하다고 생각합니다. 사용 가능한 메모리가 매우 적고 캐시가 거의 완전히 사라질 때까지 스와핑을 피하여 10과 같은 낮은 설정은 더 위험하고 스릴 넘치는 설정입니다.
thomasrutter

14

일반적인 데스크톱에는 메모리의 50-60 %를 소비하는 4-5 개의 활성 작업이 있습니다. swappiness를 60으로 설정하면 ACTIVE 작업 페이지의 약 1 / 4-1 / 3이 스왑 아웃됩니다. 즉, 모든 작업 변경, 열었던 모든 새 탭, 모든 JS 실행에 대해 스와핑 프로세스가 수행됩니다.

해결책은 swappiness를 10으로 설정하는 것입니다. 실제 관찰에 따르면 시스템은 디스크 io 캐시를 포기합니다 (읽기 / 쓰기 캐시가 거의 사용되지 않기 때문에 데스크탑에서 거의 아무런 역할도하지 않습니다). LARGE를 계속 복사하지 않는 한 파일을 교체하지 말고 스왑에 넣습니다. 실제로, 이는 사용 된 메모리가 90 %에 도달하지 않는 한 시스템이 페이지 교체를 거부하고 대신 io 캐시를 줄입니다. 그리고 이는 원활하고 교환 할 수없는 빠른 데스크톱 경험을 의미합니다.

그러나 파일 서버에서는 swappiness를 60 이상으로 설정합니다. 서버에는 메모리에 전체적으로 보관해야하는 대규모 활성 포 그라운드 작업이 아니라 작동 중이거나 절전 상태 인 작은 프로세스가 많기 때문입니다. 실제로 상태를 즉시 변경하지는 않습니다. 대신, 서버는 종종 클라이언트에게 정확히 동일한 데이터를 제공 (동료)하여 디스크 IO 캐시를 훨씬 더 가치있게 만듭니다. 따라서 서버에서는 절전 프로세스를 교체하여 디스크 캐시 요청을위한 메모리 공간을 확보하는 것이 훨씬 좋습니다.

그러나 데스크톱에서이 정확한 설정은이 데이터에 거의 지속적으로 수정하거나 액세스하는 REAL 응용 프로그램의 메모리 블록을 교체합니다.

이상하게도 브라우저는 종종 많은 양의 메모리를 예약하여 끊임없이 수정합니다. 이러한 청크가 스왑 아웃되면 다시 요청하면 시간이 걸리고 동시에 브라우저는 캐시를 업데이트합니다. 큰 대기 시간이 발생합니다. 실제로 새 탭의 단일 웹 페이지가로드 될 때까지 2 분 동안 대기합니다.

데스크탑은 거의 디스크 Io를 신경 쓰지 않습니다. 데스크탑은 캐시 가능한 반복적 인 많은 양의 데이터를 읽고 쓰는 경우가 거의 없기 때문입니다. 디스크 스왑을 최대한 방지하기 위해 디스크 io를 줄이는 것이 데스크톱에 훨씬 유리합니다. 30 %의 RAM (활성으로 사용되는 응용 프로그램에 속하는 전체 블록)이 스왑 아웃 된 디스크 캐시 용으로 30 %의 메모리를 예약하는 것입니다.

Htop을 실행하고 브라우저, GIMP, LibreOffice를 열고 몇 개의 문서를로드 한 다음 몇 시간 동안 탐색하십시오. 정말 쉽습니다.


3
서버 대 데스크톱 차이 설명의 경우 +1 서버의 디스크 캐시는 디스크 필드에서 수행 될 수 있습니다.
Dee

이 경우 서버 및 데스크탑 버전의 Ubuntu가 왜 기본적으로 스왑 피스 60으로 설정됩니까? 당신이 말한 것이 사실이라면 데스크탑 버전에 기본값 20 또는 10이 제공되는 것이 더 합리적이지만 그렇지 않습니다.
JAB

1
swappiness가 스왑되는 램의 직접 백분율이라는 의미에 대한 참조? 나는 그것이 그렇게 작동한다고 생각하지 않습니다.
Xen2050

1
그렇지 않습니다. 스왑 피는 RAM의 백분율과 관련이 없습니다. 주어진 문제 상황에서 스왑 가능성을 높이기 위해 퍼지 알고리즘을 조정하는 노브입니다. 또한이 답변에서 서버 대 데스크톱 워크로드에 대한 설명은 항상 유지되는 것은 아니라고 가정합니다.
thomasrutter

9

Linux 시스템에서 Java 서버를 실행하는 경우 기본값 60에서 스왑 피스를 크게 줄이십시오. 따라서 실제로 20을 시작하는 것이 좋습니다. 수집은 매번 프로세스 메모리의 많은 부분을 터치해야하기 때문에 스와핑은 가비지 수집 프로세스의 킬러입니다. OS에는 그러한 프로세스를 감지하고 올바른 프로세스를 얻을 수있는 수단이 없습니다. 생산적인 응용 프로그램 서버에 대해 가능한 많이 교환하지 않는 것이 좋습니다.


데이터베이스 캐시와 같은 시스템 캐시의 이점을 얻지 못하는 특수 워크로드에 서버를 전용으로 사용하는 경우 스왑을 줄이는 것이 합리적 일 수 있습니다. 가비지 수집이 충분히 전문적인 사례라고 생각하지 않습니다. 메모리를 자주 만지면 스왑되지 않으며 실제 RAM에 유지됩니다. 그렇지 않은 유일한 경우는 메모리 부족 상황이 심각하고 스왑이 책임을지지 않는 경우입니다.
thomasrutter

4

시스템 모니터를 열어 시스템의 부하를 정확히 확인하면서 4GB의 메모리와 128GB SSD로 실행 중이므로 스왑 성능 값을 10으로 변경하여 부하시 성능을 향상시킬뿐만 아니라 보너스는 SSD 드라이브의 수명을 연장시켜 쓰기가 줄어 듭니다.

전체 설명으로이 작업을 수행하는 방법에 대한 간단한 비디오 자습서는 아래 YouTube 비디오를 참조하십시오.

http://youtu.be/i6WihsFKJ7Q


1
당신이 만든 훌륭한 비디오이지만, 비디오는 실제로 질문에 직접적으로 대답하지는 않으며, 스왑 피스 (swappiness)를 변경하는 방법에 대한 더 많은 정보입니다.
jmunsch

SSD 수명 힌트의 경우 +1, SSD의 경우 시스템이 가능한 한 읽기 전용이고 나머지는 메모리에 남아 있어야하며 오늘날의 메모리는 현재 데스크탑 PC에서 큰 문제가되지 않습니다.
Dee

3

다른 사람들에게 2017 기술에 대한 더 많은 배경 지식을 제공하기 위해 Big Data Performance 엔지니어의 관점을 추가하고 싶습니다.

내 개인적인 경험은 특정 문제에 대한 내 워크 스테이션에서 시스템이 최고 속도로 실행되도록 보장하기 위해 일반적으로 스와핑을 비활성화했지만 1과 10의 스와핑이 멈추고 (영원히) 길게 멈추는 것으로 나타났습니다. 이 특정 응용 프로그램에 대해 스와 피 (Swappi)가 80이면 기본값 (60)보다 성능이 훨씬 뛰어나고 일시 중지가 짧아집니다. HDD 1GB로 8GB RAM과 4x 256GB의 스왑을 지원했습니다. 필자는 일반적으로 벤치 마크 및 전체 하드웨어 사양에 표시된 정확한 통계를 언급하지만 아직 수행하지 않았으며 여기서 중요하지 않은 최근의 저가형 데스크톱입니다.

이전 회사로 돌아가서 [500GB ~ ​​4TB] x [10-100] 노드가있는 Spark 서버에서 교체 기능을 활성화하지 않은 이유는 데이터 파이프 라인 및 데이터 구조를보다 효율적으로 재 설계하기위한 신호로 성능 저하를 보았 기 때문입니다. 방법. 또한 HDD / SSD를 벤치마킹하고 싶지 않았습니다. 또한, 많은 RAM을 교체하려면 디스크 액세스 시간을 최소화하기 위해 병렬 쓰기를 사용하여 노드 당 10-30 개의 디스크가 필요합니다.

현재 20 년 전과 20 년 후에도 RAM에 비해 일부 문제가 여전히 큰 경우가 남아 있습니다. 시간과 비용이 무한하므로 더 많은 하드웨어를 구매 / 임대하거나 프로세스를 재 설계하여 성능을 원하는 수준으로 높일 수 있습니다. 스와핑은 실제 문제를 무시할 수있는 해킹 일뿐입니다 (램이 충분하지 않고 더 많은 돈을 쓰고 싶지 않음).

높은 스왑 피스가 나쁜 조언이라고 생각하는 사람들에게는 여기 약간의 관점이 있습니다. 과거에는 HD에 캐시가 몇 kb 밖에 없었습니다. 인터페이스는 IDE / Parallel ATA였습니다. CPU 버스는 RAM 및 다른 많은 것들과 함께 훨씬 느려졌습니다. 요컨대, 시스템은 모든면에서 매우 느립니다 (오늘날 기준). 몇 년 전에 HDD는 SATA3을 사용했습니다. 현재 이들은 NVMe 프로토콜을 사용하는데,이 기능은 대기 시간이 크게 개선되었습니다. HD에는 많은 MB의 캐시가 있습니다. 가장 흥미로운 부분은 NVMe 또는 PCIe를 스왑 스토리지로 사용하는 최신 SSD (보다 안정적인 읽기 / 쓰기 내구성 및 성능)를 사용할 때입니다. 비용과 성능 사이의 최상의 절충안입니다. 싸거나 오래된 SSD로 시도하지 마십시오.

스왑 + SSD! 고성능 휘발성 스토리지를 사용하는 경우 높은 교체 가치를 실험하는 것이 좋습니다. 디스크 대역폭이 이미 포화 상태 인 경우 메모리 액세스 패턴 (임의로 모든 메모리에 액세스하고 대부분에 거의 액세스하지 않음), 메모리 사용량, 실제 스 래싱 비용에 따라 다릅니다.


1

시작 또는 프로그램을 열 때 인식되는 스와핑 동작은 디스크에서 구성 파일 등을 읽는 Linux 일 수 있습니다. 따라서 하드 드라이브 액세스가 스왑으로 인한 것이라고 가정하기 전에 시스템 모니터 프로그램을 사용하는 것이 가장 좋습니다.

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