스왑 공간 해제


10

때로는 실제 메모리가 충분하고 파이어 폭스를 사용하고 있지만 커널은 예를 들어 파이어 폭스를 스왑 상태로 유지하려고합니다.

robert@rm:~> free -m
             total       used       free     shared    buffers     cached
Mem:          3009       1904       1104          0        109        679
-/+ buffers/cache:       1116       1892
Swap:         4102        885       3216

커널에게 스왑 공간을 삭제하고 사용 가능한 여유 메모리를 사용하도록 지시하는 명령이 있습니까?


업데이트 : 단기적으로 swapon / swapoff를 사용했지만 이제는 설정했습니다.

sudo sysctl vm.swappiness=30

다른 응답에서 제안한 것처럼 매우 좋은 결과를 얻습니다.

답변:


2

당신은 할 수 swapoff 루트 권한이 필요합니다 -
내가 당신을 위해 문제가 아니라고 생각하지만.


15

nik가 제안한 것을 수행하고 swapoff를 사용할 수 있습니다 . 그러나 "스왑"을 조정하는 또 다른 더 우아한 방법이 있거나 2.6 커널을 실행하는 시스템에서 커널이 프로그램을 디스크로 얼마나 적극적으로 교환하는지가 있습니다.

리눅스 커널 메일 링리스트에서 커널이 스와핑 행동 과 관련 하여 따라야 할 정책에 대한 열띤 논쟁이 있었다 . 결론은 2.6 커널에 패치를 적용 하여이 동작을 크게 조정할 수 있다는 것입니다.

swapoff / swapon 명령을 실행하는 것처럼 루트 권한이 필요합니다.

"swappiness"의 현재 값은 / proc / sys / vm / swappiness 파일에서 검사하거나 다음 sysctl 명령 을 실행 하여 검사 할 수 있습니다 .

sudo sysctl vm.swappiness

"스왑"값의 범위는 0 (스왑 없음)에서 100 ( 가능한 한 디스크로 스왑 )입니다. 우분투는 기본 swappiness가 60으로 설정되어 제공됩니다.

세션에 대해 이것을 변경하려면 sysctl을 다시 호출하고 swappiness 값을 전달하여 사용하십시오.

sudo sysctl vm.swappiness=30

free 이외에도 우수한 htop 또는 iotop 유틸리티 를 통해이 작업의 효과를 모니터링 할 수 있습니다.

당신이보고있는 것을 좋아하고 재부팅을 통해이 값을 유지하려면, "vm.swappiness = 30"/etc/sysctl.conf 파일 에 두십시오 .

$ sudo sysctl vm.swappiness
vm.swappiness = 30
$ sudo sysctl vm.swappiness=40
vm.swappiness = 40
$ sudo sysctl vm.swappiness
vm.swappiness = 40
$ sudo tail /etc/sysctl.conf 
#net.ipv4.conf.all.accept_source_route = 0
#net.ipv6.conf.all.accept_source_route = 0
#
# Log Martian Packets
#net.ipv4.conf.all.log_martians = 1
#
# The contents of /proc/<pid>/maps and smaps files are only visible to 
# readers that are allowed to ptrace() the process
# kernel.maps_protect = 1
vm.swappiness=30

머신에서 허용되는 스와핑 레벨을 수반하는 값을 찾을 때까지 다른 값으로 재생할 수 있습니다.


sysctl의 경우 +1 다른 값의 swappiness를 실험 할 때 proc 파일에 직접 쓸 수 있습니다 (echo "30"> / proc / sys / vm / swappiness). 이 변경은 일시적이며 /etc/sysctl.conf에 쓰지 않습니다. 설정에 만족하면 sysctl을 사용하여 '영구적 인'변경을하십시오.
Shawn Chin

6

스왑의 물건은 지금보다 더 바쁜 시간에 거기에 놓였다는 것을 기억하십시오.

데이터가 RAM 에도 있음을 알 수 있습니다. 사용하기 위해 다시로드되었지만 스왑에서 삭제되지 않았습니다. 커널은 다음 사용 시간에 시간을 절약하기 위해이를 수행합니다. 데이터가 이미 복사되어 있으면 디스크 쓰기를 먼저 수행하는 대신 사용중인 RAM을 해제 할 수 있습니다. 따라서 가까운 시일 내에 머신을 다시 스왑 할 필요가 없다는 것을 알지 못하면 스왑 공간을 강제로 해제하면 다음에 스왑이 필요할 때 속도를 조금 더 느리게하는 것 외에는 아무 것도 달성 할 수 없습니다.

이것은 쓰기시 삭제 기반으로 관리되므로 RAM의 사본이 업데이트되면 스왑의 블록이 해제됩니다.

스왑 공간이 다른 용도로 필요한 경우 충분한 여유 공간이 없어도 지금은 사용하지 않을 수 있습니다.

의 출력에서이 상태에있는 데이터 양 (스왑 영역의 디스크 기반 페이지 및 RAM 모두에 있음)을 볼 수 없습니다 free. /proc그러나 특수 파일 시스템을 통해 볼 수 있습니다 . 카운트 출력 cat /proc/meminfo을 확인하십시오 SwapCached.

여분의 메모리가있을 때 스왑이 사용되는 또 다른 두 가지 이유는 다음과 같습니다.

  • I / O로드가 많을 때 커널은 오랜 기간 동안 사용되지 않은 페이지가 더 잘 스왑 아웃되도록 캐시 / 버퍼에 RAM을 사용할 수 있다고 결정했지만 free여기서는 그렇지 않을 수도 있습니다. 실제로 할당되지 않은 RAM과 IO 캐시 / 버퍼가 사용하는 RAM이 있습니다.
  • 페이지는 어떤 이유로 인해 이전에 스왑 아웃되었으며 그 이후 다시 필요하지 않았습니다. 아마도 한동안 비활성 상태였던 프로세스에서 사용중인 메모리 일 수 있습니다. 이 경우 스왑을 해제하면 (페이지를 RAM으로 다시로드) 다음에 휴면 이외의 작업을 수행해야 할 때 해당 프로세스의 응답 시간이 향상 될 수 있지만 일정 시간 동안 비활성 상태 인 경우에는 필요하지 않을 수 있습니다. 어쨌든 가까운 장래에 언제든지.

1
훌륭한 설명을 위해 +1. 참고로 vmstat를 사용하면 / proc / meminfo 데이터를 모두 볼 수는 없습니다.

1

그 기억 free메모리 사용의 단지 스냅 샷입니다. 결과는 과거 어느 시점에서 시스템에 RAM이 부족하여 RAM 상주 자료가 스왑 아웃되었음을 의미합니다. 그 이후로 RAM은 사용 가능해졌지만 스왑시 자료가 필요하지 않았기 때문에 RAM을 어지럽히 기보다는 여전히 스왑 상태로 유지됩니다. 이 경우 스왑을 끄는 것이 좋지 않습니다. 마지막 재로드 이후로 많은 양의 RAM을 요구할 수있는 프로세스가 있습니까?

또한 ulimit를 통해 설정된 최대 상주 크기에 대한 제한이 없는지 확인하고 싶을 수도 있습니다 (보통 / etc / profile에 있지만 배포판에 따라 다를 수 있으며 프로세스별로 설정할 수 있습니다 (예 : 시작 스크립트)). ).

마지막으로 Microsoft Windows에는 Firefox와 같이 디스크로 스왑 아웃되는 특정 문제에 대한 보고서가 있습니다 (예 : 최소화 된 경우). http://joeabiraad.com/mozilla-firefox/control-your-firefox-ram-usage/113 ). GNU / 리눅스 시스템에 대해서는 들어 보지 못했지만 살펴볼 가치가 있습니다.


답변 해주셔서 감사합니다. 내 문제는 스왑이 사용되는 것이 아니라 현재 느리게 느껴지는 Firefox 및 Thunderbird와 같은 활성 프로그램에 사용된다는 것입니다. 스왑 오프 / 스왑으로 인해 다시 한 번 느끼게되었습니다.
Robert Munteanu
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.