스왑을 완전히 비활성화하는 방법은 무엇입니까?


30

Linux 3.1에서 실행되는 ext4로 포맷 된 하드 드라이브 인 Debian sid를 사용하고 있습니다.

메모리가 부족하고 스왑이 활성화되어 있지 않으면 이전 Linux 버전 (3.0 이전)에서 기억합니다. 프로그램이 일반적으로 중단됩니다. 이것은 중요한 작업없이 간단한 웹 브라우징으로 내 환경에 완벽합니다. 즉, 실수로 너무 많은 메모리를 사용하는 나쁜 웹 사이트를 가로 질러 실행하면 터미널을 사용할 수 없게 만들지 않고 충돌합니다.

그러나 현재 설정에서 컴퓨터는 백그라운드에서 강력한 I / O 처리량으로 중단됩니다. iotop은 kswapd0을 범인으로 드러냅니다. 이는 스와핑 때문임을 의미합니다. 사용 후에는 swapon -s활성화 된 모든 스왑을 결정하기 위해, 내가 사용하는 swapoff -a모든 스왑을 해제하고 swapon -s모든 스왑이 비활성화되었는지 확인 다시.

그런 다음 메모리 사용량을 다시 최대화하려고했습니다. 아아, 내가 기대했던 행동은 일어나지 않았다. 대신 kswapd0은 RAM을 스왑 아웃하려고 여러 번 시도하고 스왑 공간이 없어서 실패합니다. 절대 포기하지 않기 때문에 내 컴퓨터는 영구적 인 I / O 과도한 동결 상태로 잠겨있어 디스크 상태가 좋지 않습니다.

내가 뭘 잘못하고 swapoff -a있습니까? 왜 행동이 예전과 다를까요 (아마 3.0 이전)?


그건 말이되지 않습니다. 스왑에 물건이 있으면 swapoff -a 자체를 수행하면 많은 I / O가 생성됩니다 (실제 RAM이 충분하지 않으면 프로세스가 종료 될 수 있습니다). swapoff -aI / O "폭풍"의 원인이 아닌 것이 확실 합니까?
Mat

1
fstab스왑에 대한 내용 을 언급하는 것으로 충분하다고 생각합니다 . 동작이 같은지 확인하십시오.
enzotib

@Mat swapoff -a은 스왑을 영구적으로 비활성화해야합니다. 즉, 다음에 다시 부팅 한 후에도 비활성화 상태를 유지해야합니다. 나는 이것을 확인했다. 그러나 다음 재부트 후에도 세션 중에 I / O "폭풍"이 계속 발생합니다. 기록적으로, swapoff -a당시 스왑이 0 이었기 때문에 I / O "폭풍"은 발생하지 않았습니다 .
syockit

9
@syockit : swapoff -a입니다 하지 영구적.
Mat

1
14 시간 동안 데이터베이스로드가 약 15 %가되었습니다. 스왑을 끄고 다음 시도에서 4 시간 만에 40 %가되었습니다. 분명히 서버의 전원이 부족하고 램 (ram)이 낮아졌지만 스왑이 켜지지 않으면 OpenSuSE가이 하나의 프로세스에서 훨씬 빠르게 작동합니다. "더 나은"및 광산에 대한 OS의 의견은 간단한 mysql db로드 동안 크게 다릅니다. / etc / fstab에서 스왑 드라이브를 주석 처리하고 재부팅했습니다.
TheSatinKnight

답변:


15

스왑을 비활성화하면 원하는 것을 수행하지 않습니다. 여전히 강력한 I / O 처리량을 얻을 수 있지만 더러워진 페이지가 아니라 깨끗한 페이지가됩니다.

스왑이 없으면 시스템은 실제 (수정되지 않은) 페이지의 캐시를 실제 메모리에서 제거 할 수있는 유일한 페이지이기 때문에 거의 0으로 압축합니다. 스왑없이 스왑하도록 페이지를 작성하여 더티 (수정 된) 페이지를 메모리에서 제거 할 수 있으며 더티 페이지는 제거 할 수 없습니다.

실제 메모리가 부족하면 각 프로세스는 이전 프로세스 코드 페이지를 제거 할 때 디스크에서 해당 코드 페이지를로드해야합니다. 그 결과 스왑 서브 시스템이 강력한 스 래싱과 과도한 작업을 수행하게됩니다.

이것은 매우 중요한 원칙의 특별한 경우입니다. 잘 설계된 시스템의 경우 선택을 줄임으로써 더 나은 시스템을 만들 수 없습니다. 리눅스는 잘 설계된 시스템입니다. 스왑을 제거하면 선택의 폭이 줄어들 기 때문에 더 나쁜 행동을하는 것은 놀라운 일이 아닙니다.


1
모든 메모리 부족을 할당하는 경우에만 해당됩니다. 런 어웨이 프로세스는 일반적으로 훨씬 더 많은 할당량을 할당하려고 시도하므로 더 많은 할당량을 수용하려고 시도하는 시스템을 계속해서 스왑으로 바꾸는 대신 스왑을 비활성화하면 도움이 될 수 있습니다. 런 어웨이 프로세스에서 램 사용량 만 최대한 활용하십시오.
psusi

1
모든 메모리가 부족하면 거의 항상 할당됩니다. 리눅스는 특별히 이런 식으로 조정됩니다. DO가 cat /proc/meminfo부하의 몇 시간 후에 어떤 전형적인 리눅스 상자를.
David Schwartz

2
@syockit 페이징을 비활성화하면 어떤 프로그램도 실행할 수 없습니다. 페이징은 메모리에 매핑 될 때 파일을 읽는 메커니즘입니다.
David Schwartz

2
@psusi : 스왑 할 때 클린 페이지가 최소로 줄어들지 않습니다. 대신 최근에 사용되지 않은 더럽고 익명의 페이지를 교체합니다. 물론 작업 세트가 실제 메모리를 초과하면 결국에는 강력한 스 래싱이 발생합니다. 요점은 스왑 유무에 관계없이 실제로 메모리가 부족하기 전에 많은 폭력을 일으킨다는 것입니다. 차이점은 스왑을 사용하면 폭력적인 스 래싱이 스왑됩니다 (더러운 페이지, 쓰기 및 읽기). 스왑이 없으면 폭력적인 스 래싱은 코드 오류입니다 (깨끗한 페이지, 읽기 전용).
David Schwartz

2
@psusi : 메모리 소비가 급격히 증가하는 런 어웨이 프로세스가 문제라면 올바른 것입니다. 그러나 그것은 OP가 말하고있는 것이 아닙니다. 이것은 과도한 메모리를 소비하지만 무한한 메모리 나 과도한 메모리를 소비하지 않는 프로세스입니다. 캐시가 압착되는 큰 스위트 스폿을 통해 커질수록 시스템이 스래쉬되면서 점점 더 느리게 커집니다.
David Schwartz

13

스왑을 끄는 것보다 더 나은 해결책은 메모리가 부족할 때 임의의 프로세스가 중단되는 결과를 가져 오는 것입니다. 이런 식으로 런 어웨이 브라우저는 전체 시스템을 사용할 수 없게 만드는 대신 한계에 도달하고 죽습니다. 예, 쉘에서

(ulimit -d 400000; firefox) &

-d 뒤의 숫자는 킬로바이트입니다. 브라우징 습관에 가장 적합한 값을 선택하려면 시스템에서이를 실험해야합니다. 괄호로 인해 서브 쉘이 작성됩니다. ulimit 명령은 해당 쉘과 해당 하위 항목에만 영향을 미치며 상위 쉘과의 영향을 분리합니다.


예를 들어, chromium작은 메모리 덩어리를 사용 하는 많은 프로세스 가있는 크롬에서 작동 합니까?
jberryman

@jberryman 아니요, 메모리 제한은 사용자가 아닌 프로세스 별입니다.
Kyle Jones

메모리 한계에 도달했을 때 지정된 신호 (예 : SIGHUP)를 전송하는 방법이 있습니까?
Geremia

1
@Geremia No. brk 및 sbrk 시스템 호출이 작동을 멈 추면 대부분의 일이 말리거나 죽습니다.
Kyle Jones

수동 튜닝 가고 싶은 경우 전체 프로세스 그룹에 대한 제한을 설정할 수 있습니다 cgroup에, 나는 때문에 메모리 대신에 ulimit를의 메모리 cgroup에를 사용하여 제안 중지하고 사용자 모드 정책 과정에 무엇을 결정할 수 과정을 할당 메모리를 구성 할 수 있습니다 (예 : 신호를 보내고, 죽일 프로세스를 선택하고, 메모리 제한을 즉각 높이십시오). 자세한 내용은 kernel.org/doc/Documentation/cgroup-v1/memory.txtkernel.org/doc/Documentation/cgroup-v2.txt 를 참조하십시오.
Mikko Rantalainen

4

스왑이 사용되지 않도록하려면 부팅시 스왑이 추가되지 않도록하는 것이 좋습니다. 시스템에 따라 swap부팅 서비스 를 비활성화 하거나에서 스왑 항목을 주석 처리하여 수행 할 수 있습니다 /etc/fstab.

끊기에 관한 한 stop()함수 /etc/init.d/swap는 힌트를 줄 수 있습니다.

stop()
{
       ebegin "Deactivating swap devices"

       # Try to unmount all tmpfs filesystems not in use, else a deadlock may
       # occure. As $RC_SVCDIR may also be tmpfs we cd to it to lock it
       cd "$RC_SVCDIR"
       umount -a -t tmpfs 2>/dev/null

       case "$RC_UNAME" in
               NetBSD|OpenBSD) swapctl -U -t noblk >/dev/null;;
               *)              swapoff -a >/dev/null;;
       esac
       eend 0
}

교착 상태에 대한 부분을 확인하십시오 . 스왑을 끄기 전에umount -a -t tmpfs 스스로 시도해 볼 수 있습니다 .


편집하다:

아마도 sysctl설정 을 수정하여 목표를 달성 할 수도 있습니다 ( 이 질문 참조 ).


나는이없는 swap에서 init.d,도 내가 그것을해야합니까 fstab,하지만 난이 어떻게 /etc/init.d/mountoverflowtmp그 마운트 tmpfs비상 로그 쓰기에 대한합니다. 스왑 데몬도 사용 tmpfs합니까?
syockit

다른 곳에서 활성화했을 수도 있습니다 grep -RF swap /etc/. 찾으려면 수행하십시오. 그러나 서비스를 비활성화하려면 service(IIRC; Debian을 직접 사용하지 않습니다) 와 같은 명령을 사용합니다 .
rozcietrzewiacz

1
메모리 자체 (RAM) 파일 시스템 이므로 스왑 자체는을 사용 하지 않습니다 . 그러나 사용하는 다른 서비스 / 프로그램 은 특별한 방식으로 스왑에 의존 할 수 있습니다. 잘 모르겠지만 캐싱 또는 드라이버가 스왑 공간에 대한 액세스 권한을 주장 하는 특별한 방법과 관련이있을 수 있습니다 . tmpfstmpfstmpfstmpfs
rozcietrzewiacz

Linux가 가상 메모리를 처리하는 방법에 대해 이해하지 못하는 내용이 있습니다. via swapoff와 via를 통해 가능한 많은 방법으로 스왑을 비활성화했습니다 vm.swappiness=0. 아직 kswapd0달렸다! 이것이 2.4 일의 회귀인지 궁금합니다…
syockit

5
@syockit 예상되는 동작입니다. 시스템이 여전히 클린 페이지 (파일 데이터의 사본이 포함 된 페이지)를 교환하고 있습니다. 클린 페이지를 스왑하기 위해 스왑 공간이 필요하지 않습니다. 스왑 이외의 소스에서 다시 읽을 수 있기 때문입니다.
David Schwartz

2

각 부팅 후에 /etc/fstab실행하는 것보다 스왑 파티션 항목을 주석 처리하는 것이 좋습니다 swapoff -a.

내 하드웨어에서 kswapd0과 동일한 문제가 있습니다.

튜닝 vm.swappiness시스템 매개 변수가 도움이되지 않습니다.

sysctl -w vm.swappiness=0

나는 많은 게시물, 메일 링리스트를 봤는데, 이것이 커널 버그라고 생각한다.

활성 스왑 파티션이없고 사용 가능한 메모리가 줄어들면 일부 임계 값 (제 경우 약 300MB)이 kswapd0 madness로 인해 시스템이 응답하지 않게됩니다.

아마도 그것은 특별한 구성과 조건으로 재현됩니다.

누군가는 kswapd0비활성화 된 상태로 사용자 정의 커널을 빌드하여 다른 파티션을 다시 파티션하여 시스템을 다시 설치하면 해결됩니다 .


2
경우에 kswapd0미친 간다 당신은 스왑은 당신이 RAM 밖으로있어 활성화가 없습니다. 선택 사항은 OOM Killer 또는 kswapd0입니다. kswapd0커널은 프로세스를 중단하는 것보다 느리게 끝내는 것이 더 중요하다고 가정하기 때문에 Linux는 계속 됩니다. 캐주얼 한 사람들에게는 커널이 앞으로 나아갈 수 있다고 생각하는 임계 값은 이미 빙하 적으로 느리고 거의 누구든지 OOM Killer를 선택할 것입니다.
Mikko Rantalainen

1

내 시스템 (debian sid 2016-11-15)에서 다음과 같이했습니다.

  1. 스왑을 비활성화하십시오 :

    swapoff -a
    
  2. / etc / fstab에서 스왑 파티션으로 줄을 주석 처리하십시오.

    #### #UUID=c6ddbc95-3bb5-49e1-ab25-b1c505e5360c none            swap    sw              0       0
    
  3. systemd에서 스왑 마운트를 비활성화합니다 :

    systemctl --type swap
    systemctl stop dev-sda6.swap
    systemctl mask dev-sda6.swap
    

충분할 것입니다. /etc/initramfs-tools/conf.d/resume파일에 스왑에 대한 참조가 있습니다. 나는 이것의 목적이 무엇인지 모른다. 어쩌면이 파일은 다음에 다시 부팅 할 때 문제가 될 수 있습니다 (아직 재부팅을 시도하지 않습니다. 가동 시간이 소중합니다.).


1

컴퓨터가 백그라운드에서 강력한 I / O 처리량으로 정지합니다. iotop은 kswapd0을 범인으로 밝혀

나는 그것을 피할 수있는 한 가지 방법을 찾았습니다. 당신이 그것을 검사 할이 시스템에서 수행하는 방법을 참조하면, 참조 커널 패치 안에 이 질문을 . 기본적으로 Active(file)메모리가 부족할 때 (적어도) 페이지를 제거하지 않으므로 디스크 스 래싱 (일정한 읽기)이 거의 없어 지고 OOM-killer가 1 초 이내에 트리거 될 수 있습니다. 영구적으로 (또는 적어도 몇 분 동안) 나는 실제 프로그래머 (내가 아닌)가 패치를 개선하고 실제 솔루션으로 만들기를 바라고 있습니다. 이제 그들이하는 일 이 이러한 상황에서 효과가 있음을 알았습니다 .


이 커널 패치는 이미 메인 라인입니까?
humanANDANDpeace

(내가 아닌 프로그래머 나처럼)이 좋은 같은, 그러나 나는 그것을 몇 가지 문제로 실행 않았다 아니기 때문에, 아니 아마도 @humanityANDpeace :와, 작업 부하에 따라, 때로는 패치, 당신이 경우에 메모리가 부족할 수 있습니다 하는이 패치없이 당신은하지 않았을 내가 실행하지 않는 한, 따라서 OOM 킬러는,으로 Xorg 및 xfwm4를 죽일 echo 1 | sudo tee /proc/sys/vm/drop_cachesActive(file):(의 / proc 디렉토리 / meminfo 파일) - 그것은이 최대 4G에 갈 수의 (a 16G의 RAM 시스템) 2기가바이트 이상
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.