리눅스 : 가능한 모든 것을 명시 적으로 언 스왑하는 방법?


59

나는 많은 메모리를 필요로하는 것을 시작했으며 이제는 모든 것이 지연됩니다. 메모리를 많이 사용하는 프로세스를 위해 공간을 확보하기 위해 모든 응용 프로그램의 메모리가 바뀌 었으므로 이제는 액세스 할 때 모든 것이 천천히 RAM으로 돌아갑니다.

스왑에서 RAM으로 가능한 모든 것을 명시 적으로 옮길 수있는 방법이 있습니까? 아니면 모든 것이 아니라 특정 프로세스 데이터 만 처리합니까?

답변:


59

일반적인 Linux 메모리 제어 스왑을 실제로 사용하는 방식으로 교체하는 것이 좋습니다.

내가 생각할 수있는 유일한 것은 스왑을 껐다가 다시 켜는 것입니다.

sudo swapoff -a
sudo swapon -a

스왑에 모든 것을 포함하기에 충분한 여분의 물리적 메모리가 있다고 가정합니다 ...


4
그것은 매우 천천히 작동하지만 :) 감사합니다! 그러나 여전히 더 우아한 해결책이 있다고 생각합니다. :)
kolypto

7
이 솔루션에주의를 기울이면 스왑에서 모든 것을 강제로 제거 할 수 있습니다. 실제 메모리에 맞지 않으면 커널이 치명적인 OOM 킬러를 시작합니다. 나는 "모든 것을 RAM으로 옮기려고 노력하지만 가능하지 않으면 정상적으로 실패한다"는 명령을 모른다.
Juliano

1
나는 그것을 시도하고 그것이 매우 느리게 작동한다는 것을 알았습니다. 따라서 swapoff메모리가 부족한 경우 여유 RAM을 모니터링하고 죽일 수 있습니다.이 경우 스왑 공간은 계속 작동합니다. :)
kolypto

2
스왑 오프를 종료하면 실제로 작업이 중지됩니다. 구현 방법에 따라 다릅니다.
Douglas Leeder

2
swapoff 명령은 "새로운 쓰기 교환을 허용하지 않음"과 같은 작업을 수행하는 반면 다른 실행 프로세스 (스왑을 사용 중이거나 사용 중임)는 여전히 "스왑을 해제"할 수 있습니다. 이것이 느리게 진행되는 이유 일 수 있습니다. 다른 사람이 말한 것처럼 OOM을 유발하지 않는 것 같습니다 (우분투 바이오닉을 사용하고 있습니다). 따라서 모든 스왑 오프 / 스왑은 훌륭한 솔루션입니다. 온화하고 꾸준한. 이것은 프로세스를 사용하여 더 많은 메모리를 시작하지 않거나 실행중인 소비를 늘리지 않는다고 가정합니다.
Roel Van de Paar

12

0에서 100 사이의 숫자를 에코하도록 조정할 수 있습니다 /proc/sys/vm/swappiness.

이 컨트롤은 커널이 메모리 페이지를 얼마나 공격적으로 스왑할지 정의하는 데 사용됩니다. 값이 높을수록 공격성이 증가하고 값이 낮을수록 스왑 양이 줄어 듭니다 . 값이 0이면 사용 가능 및 파일 백업 페이지의 양이 영역의 상위 워터 마크보다 작을 때까지 커널이 스왑을 시작하지 않도록 지시합니다.

기본값은 60입니다.


13
/ proc / sys를 직접 사용하지 말고 sysctl대신 명령을 사용하십시오. 이 경우는 sysctl vm.swappiness=x입니다.
Juliano

7
스왑 피스가 0이라고해도 이미 스왑 된 페이지가 명시 적으로 메인 메모리로 가져 오게 될 것이라고 생각하지 않습니까?
Douglas Leeder

1
@Douglas가 맞습니다. vm.swappiness는 주로 메모리를 요구할 때 캐시와 버퍼의 양을 바꾸거나 줄일 것인지를 결정합니다.
Juliano

@Juliano, 왜 / proc / sys를 사용해서는 안됩니까?
James

@James / proc / sys는 커널 구성을 변경하고 쿼리하는 데 사용되는 하위 인터페이스이므로 "구현 정보"입니다. Linux는 sysctl사용자 상호 작용을위한 고급 명령을 제공합니다 . 최종 결과는 동일하지만 일반적으로 사용자가 직접 상호 작용하기 위해서는 더 높은 수준의 인터페이스가 선호됩니다. 키를 돌리는 대신 점화 와이어를 단락시켜 (낮은 레벨) 엔진을 시동하는 것을 좋아합니다.
Juliano

5

리눅스는 메모리 관리 작업을 훌륭하게 수행하므로 방해가되지 않아야한다. vm.swappiness 설정 (이전에 언급 한)은 방해가되지 않습니다. 다른 방법으로 이상한 문제가 발생할 가능성이 높습니다.

메모리가 너무 배가 고파서 무엇을 시작 했습니까? 조정할 수 있습니까? 자체 메모리 제한 지시문이 없으면 ulimit도 볼 수 있습니다.


내 경우에는이었다 convert -density 200 file.pdf jpegs/file.jpg. 어떤 이유로 든 많은 메모리를 사용하지만 맞습니다. 조정 할 수 있습니다. 어쨌든, 상황은 모든 응용 프로그램으로 가능합니다 :)
kolypto

1
이 답변에 동의합니다. 실제로 필요한 작업을 수행하기 위해 컴퓨터에서 정상적인 작업을 수행해야합니다.
Douglas Leeder

convert-limit메모리와 디스크 사용량을 제어 할 수 있는 논증 이 있으므로 읽어야합니다. 설정 -limit memory 512MB또는 유사 할 것입니다. 명시적인 MAGICK_TEMPORARY_PATH를 지정하고 명령이 완료된 후 정리하는 것이 좋습니다.
slacy

3

모든 응용 프로그램에 사용할 수있는 메모리가 있다면 스왑을 0으로 설정하여 스왑이되지 않도록하는 것이 좋습니다. 예를 들어, qemu-kvm은 VMM이 대부분의 시간 동안 유휴 상태 인 것처럼 보이기 때문에 스왑 아웃되는 큰 대상입니다. qemu-kvm 메모리 메모리의 최대 80 %가 스왑으로 작성되는 것을 보았습니다. qemu-kvm에서 실행되는 VM은 스왑이 부족하기 때문에 거의 응답하지 않습니다 (손님이이 상황을 알지 못하더라도). 게스트 VM은 실제로 성능이 매우 우수하다고 생각하지만 성능이 가장 우수하다고 생각합니다. 많은 VM이 "일어나"작업을 시작하면 메모리와 디스크가 빠른 엔터프라이즈 급 하드웨어에서도로드 평균을 30 이상으로 높일 수 있습니다. 이것이 바로 기본 qemu-kvm 디자인에서 실패한 것 같습니다.

이것이 누군가를 돕기를 바랍니다.


이것이 정확하지 않을까 걱정됩니다.
Marc.2377

2

커널에서 VM 하위 시스템을 생각하지 않는 것이 좋습니다. 실제보다 더 나은 결정을 내릴 수있는 충분한 정보가 실제로있을 가능성은 거의 없습니다. 그리고 만약 당신이 어떻게 든 잘못된 일을하도록 강요한다면, 일이 더 느려지 게됩니다.


9
OP가 원하는 것을하고 싶은 경우가 있습니다. 실수로 프로세스가 폭동을 일으켜 모든 RAM + 스왑을 차지하면 응용 프로그램의 메모리가 스왑에서 나올 때마다 15 초 동안 기다리거나 강제로 실행하고 평소처럼 빨리 실행되도록 할 수 있습니다.
Alex

1

시스템을 다시 부팅 할 수있는 경우 다른 솔루션을 시도하는 것보다 시간이 덜 걸릴 수 있습니다.


1

이 질문 에서 내 답변 중 일부를 복사합니다 .

swappiness 튜너 블이 어떻게 작동하는지 알 수 있습니다. 이는 프로세스 페이지 테이블 + swappiness 값에 매핑 된 메모리의 %가 100보다 큰 경우 VM 서브 시스템이 스왑 할 페이지를 찾도록 지시함으로써 작동합니다. 따라서 60으로 설정하면 시스템이 프로세스 페이지 테이블에서 오래된 페이지를 페이징 아웃하기 시작합니다 시스템 메모리의 40 % 이상을 사용하는 경우 캐시를 희생하여 프로그램이 더 많은 메모리를 사용하도록하려면 swappiness 값을 낮추십시오.


프로그램 메모리와 캐시가 여기에서 문제라고 생각하지 않습니다. 응용 프로그램 메모리와 사용되지 않은 메모리라고 생각합니다. 그리고 나는 스와핑이 그에 영향을 줄 것이라고 생각하지 않습니다.
Douglas Leeder

0

프로세스가 여전히 실행 중입니까? 터미널을 열고 시작된 프로세스를 발견 할 수 있는지 확인하십시오. (ps aux | grep processname을 사용하면 조금 더 쉬울 수 있습니다.) kill -9 PID를 사용하여 여전히 실행중인 경우 종료하십시오. 죽이는 것을 조심하십시오. 프로세스가 무엇인지 모른다면 죽이지 마십시오! 또한 free -m의 출력을 게시하여 실제로 여전히 많은 스왑을 사용하고 있는지 확인할 수 있습니다.

여전히 실행 속도가 느리더라도 여전히 실행중인 항목이있을 수 있습니다. 당신이 실제로 무엇을하고 있는지 또는 가장자리에 사는 것을 좋아하지 않는 한 스왑을 끄지 않을 것입니다. =)


0

Linux에서 디스크에서 메모리로 데이터를 스왑 해제하는 방법은 실제로 없다고 생각합니다. 스왑 오프 / 스왑이 작동하는 솔루션이지만 더럽고 쉽게 시스템을 불안정하게 만들 수 있습니다. 여유 메모리보다 스왑에 더 많은 데이터가있는 경우 어떤 데이터 조각이 메모리로 이동하고 어떤 조각이 디스크에 보관되는지 결정하기 위해 Linux가 사용할 수있는 효율적인 정책을 상상하기 어렵습니다.

요약 : Linux가 정상적인 방식으로 성능을 점차적으로 복원하도록하십시오. VM 서브 시스템은 이상적인 균형 상태로 노력하고 지속적으로 이동하도록 구성되어 있습니다.


-2

버퍼 캐시 비우기

비우기를 원한다면이 일련의 명령을 사용할 수 있습니다.

$ free && sync && echo 3 > /proc/sys/vm/drop_caches && free

             total       used       free     shared    buffers     cached
Mem:       1018916     980832      38084          0      46924     355764
-/+ buffers/cache:     578144     440772
Swap:      2064376        128    2064248
             total       used       free     shared    buffers     cached
Mem:       1018916     685008     333908          0        224     108252
-/+ buffers/cache:     576532     442384
Swap:      2064376        128    2064248

숫자 인수를 위의 명령으로 변경하여 캐시 된 항목의 다양한 측면을 삭제하도록 Linux 커널에 신호를 보낼 수 있습니다.

참고 : 불필요한 것들의 메모리를 정리하십시오 (Kernel 2.6.16 이상). 유용한 것들을 디스크로 플러시하려면 항상 sync를 먼저 실행하십시오 !!!

  • 페이지 캐시를 비우려면 :

    $ echo 1 > /proc/sys/vm/drop_caches
    
  • 덴 트리와 아이 노드를 해제하려면 :

    $ echo 2 > /proc/sys/vm/drop_caches
    
  • 페이지 캐시, 덴 트리 및 inode를 비우려면 다음을 수행하십시오.

    $ echo 3 > /proc/sys/vm/drop_caches
    

위의 내용은 루트로 실행됩니다. sudo를 사용하여 구문을 작성하려는 경우 구문을 다음과 같이 약간 변경해야합니다.

$ sudo sh -c 'echo 1 >/proc/sys/vm/drop_caches'
$ sudo sh -c 'echo 2 >/proc/sys/vm/drop_caches'
$ sudo sh -c 'echo 3 >/proc/sys/vm/drop_caches'
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.