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

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

저는 Debian sid를 사용하고 있고 하드 디스크는 ext4로 포맷되어 있으며 Linux 3.1에서 실행되고 있습니다.

이전 Linux 버전(아마 3.0 이전)에서는 메모리가 부족하고 스와핑이 활성화되지 않은 경우 프로그램이 종종 충돌했던 것을 기억합니다. 이것은 내 환경에 완벽합니다. 간단한 웹 검색이 필요하고 중요한 작업이 필요하지 않습니다. 즉, 메모리를 너무 많이 차지하는 나쁜 웹사이트를 우연히 발견하면 터미널을 사용할 수 없게 되기보다는 그냥 충돌이 일어날 것입니다.

그러나 현재 설정에서는 I/O 처리량이 많아 컴퓨터가 백그라운드에서 작동하지 않습니다. iotop은 kswapd0을 범인으로 표시합니다. 이는 스와핑으로 인한 것임을 의미합니다. 이를 사용하여 swapon -s활성화된 스왑을 식별 한 후 swapoff -a모든 스왑을 비활성화하고 swapon -s모든 스왑이 비활성화되었음을 다시 확인했습니다.

그런 다음 다시 메모리 사용량을 최대화해 보았습니다. 아아, 내가 기대했던 행동은 일어나지 않았습니다. 대신 kswapd0은 계속해서 RAM 스왑을 시도하지만 스왑 공간이 없어 실패합니다. 결코 포기하지 않기 때문에 내 컴퓨터는 영구적인 I/O 정지 상태에 빠지게 되며 이는 내 디스크 상태에 좋지 않습니다.

내가 뭔가 잘못하려고 하는 걸까요 swapoff -a? 이전(아마 3.0 시대 이전)과 동작이 다른 이유는 무엇인가요?

답변1

스왑을 비활성화하면 원하는 효과가 나타나지 않습니다. 여전히 극적인 I/O 처리량을 얻을 수 있지만 더티 페이지 대신 클린 페이지가 됩니다.

스와핑이 없으면 시스템은 클린(수정되지 않은) 페이지의 캐시를 0에 가깝게 압축합니다. 왜냐하면 이러한 페이지가 물리적 메모리에서 제거할 수 있는 유일한 페이지이기 때문입니다. 더티 페이지(수정된)를 스왑 영역에 기록함으로써 메모리에서 더티 페이지만 제거할 수 있으며, 스왑 영역이 없으면 더티 페이지를 제거할 수 없습니다.

실제 메모리가 부족하면 각 프로세스는 이전 프로세스 코드 페이지를 제거하므로 디스크에서 해당 코드 페이지를 로드해야 합니다. 그 결과 스위칭 하위 시스템에 대한 심각한 스래싱과 과도한 작업이 발생합니다.

이것은 매우 중요한 원칙의 특별한 경우입니다. 옵션을 줄인다고 해서 잘 설계된 시스템을 더 잘 실행할 수는 없습니다. 리눅스는 잘 설계된 시스템이다. 스왑을 제거하면 옵션이 더 적어지므로 성능이 더 나빠지는 것은 놀라운 일이 아닙니다.

답변2

스왑을 끄는 것(메모리 부족 시 대부분의 임의 프로세스가 종료됨)보다 더 나은 솔루션은 네트워크에서 데이터를 가져오는 프로세스에 대해 프로세스별 데이터 세그먼트 제한을 설정하는 것입니다. 이렇게 하면 전체 시스템을 사용할 수 없게 되는 대신 런어웨이 브라우저가 한계에 도달하여 죽게 됩니다. 예, 쉘에서

(ulimit -d 400000; firefox) &

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

답변3

스왑이 사용되지 않도록 하려면 시작 시 스왑이 추가되지 않도록 하는 것이 가장 좋습니다. 시스템에 따라 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설정을 수정하여 목표를 달성할 수도 있습니다(참조:이 문제).

답변4

내 시스템(debian sid 2016-11-15)에서 다음을 수행했습니다.

  1. 지금 스왑을 비활성화합니다.

    swapoff -a
    
  2. 스왑 파티션이 있는 줄에 주석을 추가합니다. /etc/fstab(필요하지 않을 수도 있습니다. 3단계만 작동하고 2단계는 작동하지 않을 수도 있습니다.)

    #### #UUID=c6ddbc95-3bb5-49e1-ab25-b1c505e5360c none            swap    sw              0       0
    
  3. systemd에서 스왑 설치를 비활성화합니다(유닛 이름에 백슬래시 문자가 포함된 경우 유닛 이름을 따옴표로 묶습니다).

    systemctl --type swap
    systemctl stop "dev-\x2da821.swap"
    systemctl mask "dev-\x2da821.swap"
    

이것이 트릭을 수행하는 것 같습니다.

관련 정보