충분한 여유 RAM이 있어도 스왑이 사용되는 이유는 무엇입니까?


208

스왑의 본질은 RAM이 가득 찼을 때 임시 스토리지 안전망 역할을하는 것이지만 때때로 3GB의 여유 RAM이 있어도 스왑 파티션이 계속 사용되고 있습니다. 이것이 정상입니까?


3
문제 해결에 도움이되도록 다음 명령 / 파일의 내용 또는 출력을 공유하십시오 ( 이 답변의 지침 ) : free -m,top -b 1
ish

내일 해당 명령의 pastebins로 질문을 업데이트합니다. 지금 오전 12시 :(
Mysterio

제목을 편집하여 "... 지금은 너무 졸려서 잠을 잘 수 없습니다": P
ish

답변:


188

"스왑"값을 변경해보십시오.

보내는 사람 우분투의 스왑 자주 묻는 질문 :

교환이란 무엇이며 어떻게 변경합니까?

swappiness 매개 변수는 커널이 프로세스를 실제 메모리에서 스왑 디스크로 옮기는 경향을 제어합니다. 디스크는 RAM보다 속도가 느리기 때문에 프로세스가 메모리에서 너무 적극적으로 이동하면 시스템 및 응용 프로그램의 응답 시간이 느려질 수 있습니다.

  1. swappiness는 0에서 100 사이의 값을 가질 수 있습니다

  2. swappiness = 0은 가능한 한 오랫동안 물리적 메모리에서 프로세스를 교환하지 않도록 커널에 지시합니다. 커널 버전 3.5 이상에서는 스왑 성을 비활성화합니다.

  3. swappiness = 100은 커널에게 물리적 메모리에서 프로세스를 적극적으로 교환하고 캐시를 교환하도록 이동시킵니다.

우분투의 기본 설정은 swappiness = 60입니다. swappiness의 기본값을 줄이면 일반적인 Ubuntu 데스크탑 설치의 전반적인 성능이 향상 될 것입니다. swappiness = 10의 값이 권장되지만 자유롭게 실험 해보십시오. 참고 : Ubuntu 서버 설치는 데스크탑 시스템마다 다른 성능 요구 사항이 있으며 기본값 60이 더 적합 할 수 있습니다.

교환 가치를 확인하려면

cat /proc/sys/vm/swappiness

swappiness 값을 변경하려면 swappiness 값이 10 인 임시 변경 (재부트시 손실)을 다음과 같이 수행 할 수 있습니다.

sudo sysctl vm.swappiness=10

영구적으로 변경하려면 즐겨 사용하는 편집기로 구성 파일을 편집하십시오.

gksudo gedit /etc/sysctl.conf

vm.swappiness를 검색하고 원하는대로 값을 변경하십시오. vm.swappiness가 없으면 다음과 같이 파일 끝에 추가하십시오.

vm.swappiness=10

파일을 저장하고 재부팅하십시오.

또한 다음을 확인할 수 있습니다 : https://askubuntu.com/a/103916/54187


1
유휴 추론 : 이것은 실제로 성능에 도움이 될 수 있습니다. 한동안 액세스하지 않은 페이지는 스왑 공간으로 복사되어 메모리가 필요한 경우 OS가 페이지를 빠르게 제거 할 수 있지만 페이지 내용은 메모리에 남아 있습니다 .
Simon Richter

7
@SimonRichter 그렇습니다. 현대 시스템에서는 60의 스와 피 (swappiness)가 너무 공격적 일 수 있습니다. 즉, 여전히 몇 개의 사용 가능한 메모리가있을 때 스왑을 시작하기 때문입니다.
Brendan Long

1
sudo sysctl --load=/etc/sysctl.conf파일을 편집 한 후 실행 하여 변경 사항을 적용하십시오.
deFreitas

92

귀하의 질문에는 몇 가지 다른 측면이 있습니다.

첫째, "무료"에 대한 귀하의 정의는 무엇입니까? Linux (또는 최신 운영 체제)에서 들리는 것만 큼 간단하지 않습니다.

리눅스가 RAM을 사용하는 방법 (매우 단순화 됨)

각 응용 프로그램은 일부 메모리를 사용할 수 있습니다. Linux는 다른 점유되지 않은 모든 메모리 (마지막 몇 MB 제외)를 "캐시"로 사용합니다. 여기에는 페이지 캐시, inode 캐시 등이 포함됩니다. 이것은 좋은 일입니다. 힙 속도를 높이는 데 도움이됩니다. 디스크에 쓰기와 디스크에서 읽기는 모두 캐시에 의해 엄청나게 빨라질 수 있습니다.

이상적으로는 모든 응용 프로그램에 충분한 메모리가 있고 여전히 캐시에 수백 Mb가 남아 있습니다. 이 상황에서 응용 프로그램이 메모리 사용을 늘리지 않고 시스템이 캐시를위한 충분한 공간을 확보하기 위해 고심하지 않는 한 스왑이 필요하지 않습니다.

응용 프로그램이 더 많은 RAM을 요구하면 캐시에서 사용한 일부 공간으로 들어가서 캐시가 축소됩니다. 캐시 할당 해제는 간단하고 실시간으로 간단하게 수행 할 수있을 정도로 저렴하고 쉽습니다. 캐시에있는 모든 것은 이미 디스크에있는 사본의 두 번째 사본 일 뿐이므로 즉시 할당 해제 할 수 있습니다. 어쨌든 몇 초 안에 디스크를 플러시해야 했습니다 .

이것은 Linux에만 해당되는 상황이 아닙니다. 모든 최신 운영 체제는 이러한 방식으로 작동합니다. 다른 운영 체제는 사용 가능한 RAM을 다르게보고 할 수 있습니다. 일부는 "사용 가능"으로 간주되는 일부로 캐시를 포함하고 일부는 그렇지 않을 수도 있습니다.

사용 가능한 RAM에 대해 이야기 할 때 실제로 사용 가능한 캐시이기 때문에 캐시 를 포함 하는 것이 훨씬 의미가 있습니다 . 응용 프로그램이 요청하면 사용할 수 있습니다. Linux에서 free명령은 두 가지 방법으로보고합니다. 첫 번째 행에는 사용 된 RAM 열에 캐시가 포함되고 두 번째 행에는 사용 가능한 열에 캐시 (및 버퍼)가 포함됩니다.

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

부드럽게 실행되는 캐시를위한 공간이 충분하지 않은 충분한 메모리를 사용한 후에는 Linux에서 사용되지 않는 일부 애플리케이션 메모리를 RAM에서 스왑으로 다시 할당하기로 결정할 수 있습니다.

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

시스템에는 "스왑"설정이있어이 "압력"계산 방법을 조정할 수 있습니다. 일반적으로 이것을 변경하지 않는 것이 좋으며 변경하지 않는 것이 좋습니다. 스와핑은 전반적으로 매우 좋은 일입니다. 성능이 저하되는 몇 가지 경우가 있지만 전체 시스템 성능을 살펴보면 광범위한 작업에 대한 순이익입니다. 스왑 성을 줄이면 실제로 유용 할 수있는 경우에도 캐시 메모리의 양이 다른 것보다 약간 줄어 듭니다. 이것이 스왑과 관련하여 발생하는 모든 문제에 대해 충분한 상충 관계인지 여부는 귀하에게 달려 있습니다. 당신은 무엇을하고 있는지 알아야합니다. 그게 전부입니다.

스왑이 데스크탑 시스템의 인식 된 성능에 실제로 해를 끼치는 잘 알려진 상황이 있으며, 오랜 시간 동안 유휴 상태로 유지되고 백그라운드 프로세스가 IO에서 과중한 경우 (예 : 야간 백업)을 실행합니다. 이것은 매우 눈에 띄는 부진이지만, 스왑을 모두 끄는 것을 정당화하기에는 충분하지 않으며 모든 운영 체제에서 방지하기가 매우 어렵습니다. 백업 / 바이러스 검사 후 스왑을 해제하면이 초기 부진이 발생하지 않지만 시스템은 하루 종일 조금 느려질 수 있습니다. 이것은 Linux에만 국한된 상황이 아닙니다.

디스크로 스왑 할 항목을 선택할 때 시스템은 실제로 사용되지 않거나 읽거나 쓰지 않는 메모리를 선택합니다. 그것은 대부분의 시간을 잘 선택하는 이것을 계산하는 매우 간단한 알고리즘을 가지고 있습니다.

많은 양의 RAM이있는 시스템이 있다면 (작성시 8GB는 일반적인 Linux 배포판의 경우 엄청난 양입니다) 스왑이 필요한 상황은 거의 발생하지 않습니다. 스왑을 끄려고 할 수도 있습니다. 나는 그렇게하는 것을 권장하지 않지만, 더 많은 RAM이 어떤 응용 프로그램 충돌에서 당신을 구할 수 있는지 알 수 없기 때문에. 그러나 필요하지 않다는 것을 알고 있다면 그렇게 할 수 있습니다 .

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

RAM에서 스왑으로 데이터를 전송하는 작업은 느리게 진행되지만 커널이 전반적인 이점이 이보다 중요하다고 확신하는 경우에만 수행됩니다. 예를 들어, 응용 프로그램 메모리가 거의 캐시가 남지 않은 지점으로 올라가고 이로 인해 I / O가 매우 비효율적이라면 실제로 일부 메모리를 확보하여 시스템 속도를 크게 높일 수 있습니다. 데이터를 확보하기 위해 데이터를 교환하는 초기 비용 후.

또한 응용 프로그램 이 실제로 보유한 것보다 더 많은 메모리를 요청하는 것이 최후의 수단 입니다. 이 경우 메모리 부족 상황을 방지하기 위해 스와핑이 필요하며 이로 인해 종종 응용 프로그램이 충돌하거나 강제 종료되어야합니다.

스와핑은 사용 가능한 RAM이 부족할 때 발생하여 스왑이 없어도 시스템이 느려지거나 불안정해질 수 있기 때문에 시스템 성능이 저하되는 시간과 만 관련 이 있습니다. 따라서 일을 단순화하기 위해 스왑 은 시스템이 다른 방향이 아닌 시스템 속도를 떨어 뜨리기 때문에 발생 합니다.

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

스왑에서 데이터를 전송하는 것은 (적어도 전통적인 하드 디스크의 경우) 거기에 넣는 것만 큼 시간 소모적입니다. 이해할 수 있듯이 커널은 스왑에서 데이터를 제거하는 것을 꺼려합니다. 특히 실제로 읽거나 쓰지 않는 경우에는 스왑에서 데이터를 제거합니다. 스왑에서 데이터를 가지고 있고 사용하지 않을거야 경우, 그것은 다른 것들에 대한 더 많은 메모리 잎 이후는, 스왑에 남아 있다는 사실은 좋은 일이 되어 잠재적으로 시스템을 속도, 사용합니다.


5
자세한 설명은 +1입니다. 또한 내 컴퓨터에서 2GiB 스왑을 유지하고 싶습니다. 메모리 누수 등과 같은 문제가 발생하면 스왑이 올라가고 메모리 부족이 발생하기 전에 문제를 찾을 수 있습니다. 성능 도구는 물론 안전망입니다.
Joe

1
RAM이 2GB 밖에 안되는 넷북에서는 4GB의 스왑을 유지합니다. 그 이유는 넷북을 의도 한 것보다 더 많이 사용하기 때문이며 프로그램에 2GB 이상의 메모리가 필요한 경우가 많습니다. 메모리가 부족한 상황에서 Linux는 매우 열악한 동작을하기 때문에 큰 안전망을 선호합니다. 그리고 디스크 공간이 충분합니다.
Scott Severance

프로그램에 자주 2GB 이상의 메모리가 필요한 경우 RAM을 소진하면 성능이 저하되므로 더 많은 RAM을 넣는 것이 좋습니다 (매우 저렴합니다!). 다른 독자의 이익을 위해 : 사용 가능한 RAM을 소싱 해야하는 캐시 메모리 만보 고 있지 않도록 하십시오 free -m.
thomasrutter

2
@neon_overload : HP에 따르면 넷북의 최대 RAM은 1GB입니다. 나는 지금 2GB를 가지고 있으며 인터넷 소스는 2GB가 실제 최대라고 제안합니다. 따라서 이러한 종류의 해결 방법이 필요합니다.
Scott Severance

@ Thomasrutter : 대형 서버에 대한 답변은 어떻게 변경됩니까? 하나 중 하나는 1TB (1 테라 바이트)의 램을 가지고 있지만 여전히 스왑을 사용하고 있습니다. 어떤 swappiness 설정과 어떤 크기의 swap 파티션을 추천 하시겠습니까?
chrisinmtown

24

swappiness 값 설정이 모든 상황에서 작동하지는 않습니다. 그것이 당신에게 효과적이라면, 좋습니다. 그렇지 않다면 스왑을 껐다가 다시 켜서 주기적으로 지우는 스크립트를 작성했습니다.

조심하지 않으면 스왑 전환이 약간 위험합니다. RAM 에있는 모든 것과 스왑 에있는 모든 것을 담을 수있는 충분한 여유 RAM이없는 경우 , 스왑을 비활성화하면 시스템이 응답하지 않게됩니다. 내 스크립트는 먼저 사용 가능한 RAM이 충분한 지 확인하고 (실제 사용 가능한 RAM의 양이 사용 가능한 free보고서와 다를 수 있으므로 약간의 작업이 필요함) 스왑 만 전환합니다. 그러나 RAM이 약간 부족하면 스크립트가 실행되는 동안 다른 주요 프로세스를 시작하지 마십시오. 여기있어:

#!/bin/bash

# Make sure that all text is parsed in the same language
export LC_MESSAGES=en_US.UTF-8
export LC_COLLATE=en_US.UTF-8
export LANG=en_US.utf8
export LANGUAGE=en_US:en
export LC_CTYPE=en_US.UTF-8

# Calculate how much memory and swap is free
free_data="$(free)"
mem_data="$(echo "$free_data" | grep 'Mem:')"
free_mem="$(echo "$mem_data" | awk '{print $4}')"
buffers="$(echo "$mem_data" | awk '{print $6}')"
cache="$(echo "$mem_data" | awk '{print $7}')"
total_free=$((free_mem + buffers + cache))
used_swap="$(echo "$free_data" | grep 'Swap:' | awk '{print $3}')"

echo -e "Free memory:\t$total_free kB ($((total_free / 1024)) MB)\nUsed swap:\t$used_swap kB ($((used_swap / 1024)) MB)"

# Do the work
if [[ $used_swap -eq 0 ]]; then
    echo "Congratulations! No swap is in use."
elif [[ $used_swap -lt $total_free ]]; then
    echo "Freeing swap..."
    swapoff -a
    swapon -a
else
    echo "Not enough free memory. Exiting."
    exit 1
fi

이 스크립트를 루트로 실행해야합니다 (예 : with sudo). 이 스크립트는 시스템을 응답하지 않습니다. RAM이 충분하지 않으면 스왑 전환을 거부합니다. 나는이 스크립트를 거의 5 년 동안 문제없이 사용했습니다.


스크립트의 경우 +1 출력에서 MB를 MiB로 변경하여 조금 현대화 할 수 있습니다. 나는 당신이 포함하는 모든 (좋은) 안전 테스트없이 비슷한 스크립트를 작성했습니다. 스왑이 많이 사용 된 오래된 노트북에서는 1 ~ 2 분 정도 실행되지만 시간이 걸리지 않았습니다. 한 번 실행하기에는 사용 가능한 메모리가 충분하지 않아 실패하지만 추가 문제는 발생하지 않았습니다. 그 일이 일어 났을 때 문제를 해결하기 위해 재부팅해야했습니다. 그것은 전송에서 메모리 누수처럼 보였고 (고정 된 이후로) 믿고 2GiB 램과 관련이 있습니다.
Joe

6
스왑으로 무언가가 이동하고 스왑 상태로 남아 있다면, 이는 일반적으로 좋은 일입니다. 데이터가 실제로 사용되지 않고 RAM의 일부를 다른 것들을 위해 확보하여 속도를 잠재적으로 향상시킵니다. 이 데이터가 스왑되어서는 안되며보다 가치있는 RAM을 대신 사용해야한다고 생각하는 이유는 무엇입니까? 일반적으로 커널은 사용되지 않는 것을 아는 데 능숙하며 RAM을 확보하기 위해 안전하게 스왑 상태를 유지할 수 있습니다.
thomasrutter

@neon : 내 컴퓨터에는 각각 2GB와 3GB의 RAM이 있으며 요즘에는 거의 없습니다. 증거는 성능에 있습니다. 예를 들어, 스왑으로 인해 메뉴를 불러 오거나 프로그램을 전환하면 Compos visoal 효과가 느려질 수 있습니다. 이러한 속도 저하는 스왑을 토글하여 해결되므로 최소한 일부 상황에서는 커널의 최적화 알고리즘이 차선 책임을 알 수 있습니다. 나는 반복 된 경험으로 논쟁 할 수 없다.
Scott Severance

휴 !! 이것은 스왑의 0 %로 떨어졌습니다 .... 나는이 완전한 질문과 그 답을 조사 할 시간이 없었지만, 자유 시간이 생겼을 때 그것을 읽도록 마음에 들었습니다.
AzkerM

왜 교체 가치를 낮은 값으로 설정하지 않습니까? 그것은 당신의 스크립트와 똑같은 일을하는 것처럼 보이지만 훨씬 통제 된 방식으로 수행됩니다.
jhfrontz

4

일반적으로 스왑은 현재 시스템에서 사용되지 않습니다. 내 경험상, 집중적 인 작업없이 오랫동안 실행중인 프로세스는 리눅스에 의해 교체되도록 이동되었습니다.
영향을받는 일부 프로그램이 느리게 실행됩니다.
: 무료 램을 많이하는 경우, 당신은 명령을 실행하여 스왑을 전환 할 수 있습니다
swapoff -av(당신이해야합니다 sudo그것에 대한 권리를.)
오프 스왑을 좋아하지 않는 경우에, 당신은 대칭 명령을 사용하여, 그것을 전환 할 수 있습니다을 :
swapon -av( 다시 sudo요구됨).


12
swapiness = 0 같은 일을하지만, 더 안전하기 때문에 완전히 떨어져 스왑을 설정하면 (이 경우 잔인한 메모리에 너무 많은 물건 결국, 그것은 스왑에서 뭔가를 던질 것이다).
Brendan Long

@BrendanLong Fair point .. 가르쳐 주셔서 감사합니다. :)
drake01 2016 년

3

스왑이 프로그램에 사용되면 프로그램 수명 동안 매핑 된 상태를 유지하는 경향이 있습니다. 많은 프로그램에는 거의 사용되지 않는 코드 (및 데이터)가 있습니다. 일단 메모리가 교체되면 교체 될 가능성이 없습니다.

이러한 페이지를 메모리에 강제로 저장하는 한 가지 방법은 스왑 장치를 끄는 것입니다. 두 개가있는 경우 하나를 껐다가 다시 켤 수 있습니다. 스왑이 실제로 필요한 경우 장치간에 이동합니다. 스왑 장치 (또는 파일)를 끌 수는 있지만 실제로 스왑 공간이 필요한 경우 과감한 일이 발생할 수 있습니다.

메모리의 일반적인 것 외에도 tempfs는 스왑 공간을 사용하고 나머지 메모리처럼 스왑됩니다. 많은 임시 디스크가 필요한 작업을 실행하면 페이지가 강제로 스왑 될 수 있습니다. 일단 생성 된 임시 파일은 몇 분 후에 더 이상 사용되지 않을 수 있으며 스왑 장치로 이동하기에 적합한 후보입니다.

핀치에서 파일을 스왑 장치로 사용할 수 있습니다. 이는 여분의 스왑 공간이 일시적으로 필요한 경우에 유용합니다.


2

Scott Severance의 스크립트를 편집 하여 사용 가능한 총 메모리 필드가 이미 포함 된 최신 버전의 free를 수정했습니다.

#!/bin/bash

free_mem="$(free | grep 'Mem:' | awk '{print $7}')"
used_swap="$(free | grep 'Swap:' | awk '{print $3}')"

echo -e "Free memory:\t$free_mem kB ($((free_mem / 1024)) MiB)\nUsed swap:\t$used_swap kB ($((used_swap / 1024)) MiB)"
if [[ $used_swap -eq 0 ]]; then
    echo "Congratulations! No swap is in use."
elif [[ $used_swap -lt $free_mem ]]; then
    echo "Freeing swap..."
    sudo swapoff -a
    sudo swapon -a
else
    echo "Not enough free memory. Exiting."
    exit 1
fi
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.