리눅스 읽기 스왑을 다시 메모리로 만들기


28

Linux 커널은 16GB의 실제 메모리를 대부분 사용하는 응용 프로그램을 실행할 때 메모리에서 대부분의 페이지를 스왑합니다. 응용 프로그램이 완료되면 스왑에서 관련 페이지를 먼저 읽어야하므로 모든 작업 (명령 입력, 작업 영역 전환, 새 웹 페이지 열기 등)을 완료하는 데 시간이 오래 걸립니다.

Linux 커널에게 각 응용 프로그램을 수동으로 만지고 기다릴 필요없이 스왑에서 실제 메모리로 페이지를 복사하도록 지시하는 방법이 있습니까? 나는 많은 응용 프로그램을 실행하므로 대기는 항상 고통 스럽습니다.

swapoff -a && swapon -a시스템을 다시 반응하게 만드는 데 자주 사용 하지만 스왑에서 페이지가 지워 지므로 다음에 스크립트를 실행할 때 다시 작성해야합니다.

커널이 스왑에서 모든 페이지를 읽도록 지시하기 위해 아마도 sysfs를 사용하는 커널 인터페이스가 있습니까?

편집 : 실제로 스왑 캐시를 모두 만드는 방법을 찾고 있습니다. (로버트 감사합니다!)

[PS serverfault.com/questions/153946/…serverfault.com/questions/100448/… 은 관련 주제이지만 스왑을 지우지 않고 스왑에서 페이지를 메모리로 다시 복사하도록 Linux 커널을 가져 오는 방법에 대한 질문은 다루지 않습니다.]


모든 스왑이 시스템 메모리의 캐시가되기를 원하십니까? 그래서 당신은 당신이 자유롭게 다시로드 할 수있는 시스템 메모리의 이미지 를 원 하십니까? 이것은 기본적으로 최대 절전 모드가 작동하는 방식입니다. 시스템은 메모리를 디스크에 이미지화하고 전원을 끈 다음 전원을 켤 때 이미지를 복원합니다. 해당 스레드를 따르는 쿼리에서 도움이 될 가능성이 있습니까? 예를 들어, 메모리를 이미지화하려는 경우 스왑을 비활성화하고 작업을 완료 한 다음 이미지를 복원하고 반복하십시오. 그렇게 하시겠습니까?
mikeserv

이것이 스왑 캐시 상태로 스왑을 떠나지 않을 것이라고 생각합니다. 따라서 귀하의 제안은 스왑 오프 스왑 방법의 대안이라고 생각됩니다.
drrossum

아니, 그것은 스왑을 캐시하지 않습니다 (확실히 , 나에게는 조금 이상합니다) 당신이 가장 통합 된 시점에서 RAM을 캐시 한 다음 캐시를 복원하기 전에 시스템 메모리 전체를 집중적 인 작업에 바칩니다. 작업이 끝났습니다. 집중적 인 작업 중 스와핑이 원하는 경우 작업 속도를 늦추기 만하면 페이지를 스왑 아웃하는 데 시간이 더 필요합니다.
mikeserv

답변:


4

원래 여기 에서 찾은 memdump 프로그램을 기반으로 지정된 응용 프로그램을 메모리로 다시 읽을 수있는 스크립트를 만들었습니다. :remember

#!/bin/bash
declare -A Q
for i in "$@"; do
    E=$(readlink /proc/$i/exe);
    if [ -z "$E" ]; then.
        #echo skipped $i;.
        continue;.
    fi
    if echo $E | grep -qF memdump; then.
        #echo skipped $i >&2;.
        continue;.
    fi
    if [ -n "${Q[${E}]}" ]; then.
        #echo already $i >&2;.
        continue;.
    fi
    echo "$i $E" >&2
    memdump $i 2> /dev/null
    Q[$E]=$i
done | pv -c -i 2 > /dev/null

사용법 : 같은

# ./remember $(< /mnt/cgroup/tasks )
1 /sbin/init
882 /bin/bash
1301 /usr/bin/hexchat
...
2.21GiB 0:00:02 [ 1.1GiB/s] [  <=>     ]
...
6838 /sbin/agetty
11.6GiB 0:00:10 [1.16GiB/s] [      <=> ]
...
23.7GiB 0:00:38 [ 637MiB/s] [   <=>    ]
# 

스왑되지 않은 메모리 (초당 기가 바이트)를 빠르게 건너 뛰고 스왑이 필요할 때 속도가 느려집니다.


이 도구는 내가 찾던 것을 정확하게 수행합니다. 감사!
drrossum

한 가지 좋은 점은 내 관찰에서 스왑 된 페이지는 RAM으로 복사되지만 스왑에서 삭제되지는 않는다는 것입니다 (스왑 사용량이 약간만 줄어들 기 때문에 대부분은 그렇지 않습니다). 내 해석은 리눅스가 각 페이지의 사본 두 개를 RAM에 하나는 스왑에 보관한다는 것입니다. 이것이 올바르게 처리되면 스왑을 취소하고 다시 추가하는 것보다 낫습니다. 이는 이중 페이지를 다시 스왑해야 할 때 다른 사본이 필요하지 않기 때문입니다. 확인할 수있는 모든 커널 전문가에게 감사합니다.
Giovanni Mascellani

11

위로 올리는 데 도움이 될 수 있습니다 /proc/sys/vm/page-cluster(기본값 : 3).

커널 문서 ( sysctl/vm.txt)에서 :

페이지 클러스터

page-cluster는 한 번의 시도로 스왑에서 연속 페이지를 읽는 페이지 수를 제어합니다. 이것은 페이지 캐시 미리 읽기에 대한 스왑 대응입니다. 언급 된 연속성은 가상 / 물리적 주소가 아니라 스왑 공간에서 연속적입니다. 즉, 서로 스왑되었습니다.

로그 값입니다. 0으로 설정하면 "1 페이지", 1로 설정하면 "2 페이지", 2로 설정하면 "4 페이지"등이됩니다. 0은 스왑 판독을 완전히 비활성화합니다.

기본값은 3입니다 (한 번에 8 페이지). 워크로드가 스왑 집약적 인 경우이를 다른 값으로 조정하면 약간의 이점이있을 수 있습니다.

값이 낮을수록 초기 결함에 대한 대기 시간이 짧아 지지만 동시에 연속적인 페이지의 일부가되었을 경우 후속 결함에 대한 추가 결함 및 I / O 지연이 발생합니다.

이 문서에는 한도가 언급되어 있지 않으므로이 스왑을 모두 높게 설정하면 모든 스왑을 곧 다시 읽을 수 있습니다. 물론 나중에 제정신 가치로 되돌립니다.


이것은 유용한 해결 방법처럼 들립니다. 두 개의 수동 개입을 휴면 명령과 결합하여 단일 사용자 개입으로 만들 수 있습니다. 그러나 액세스되는 페이지에서 연속적으로 만 읽기 때문에 모든 스왑 캐시를 매우 빠르게 만들지는 않을 수도 있습니다. 그러나 지금까지 최고의 솔루션입니다. 감사!
drrossum

tbh 이것은 아마도 가장 좋은 해결책 일 것입니다. 전에는 들어 본 적이 없지만 스왑 인이 연속적인 작은 IOP 세트가 아닌 일련의 큰 IOP로 바뀌는 것처럼 보입니다. 이는 아마도 성능 문제의 원인 일 수 있습니다. 개인 상황에 완벽하게 부합하는 것이 있다면 합법적으로 놀랄 것입니다.
Bratchley

그와 관련하여, 연속적인 작은 스왑 인으로 인해 속도가 느려지면 page-cluster값을 영구적으로 조정하더라도 성능이 향상 될 수 있습니다.
Ilmari Karonen

5

다음에 응용 프로그램을 실행할 때 추가하는 프로그램이 스와핑 후보가 될 가능성이 없도록 가장 관심있는 프로그램을 cgroup에 추가하고 스왑 피스 튜닝을 시도 할 수 있습니다 .

일부 페이지는 여전히 교체 될 수 있지만 성능 문제를 해결할 수 있습니다. 많은 프로그램 페이지가 스왑 상태에 있고 페이지를 RAM으로 스왑하기 위해 프로그램이 지속적으로 일시 중지되어야하지만 4k 단위로만 중지되는 경우에는 "중지 및 시작"동작 일 수 있습니다.

또는 실행중인 응용 프로그램을 cgroup에 추가하고 swappiness를 조정하여 응용 프로그램이 스왑 파일을 가장 많이 사용하는 응용 프로그램이되도록 할 수 있습니다. 응용 프로그램 속도가 느려지지만 나머지 시스템은 절약됩니다.


4

마술처럼 "시스템을 다시 반응하게 만들 수 없다"고 생각합니다. 페널티가 발생하거나 스왑 공간에서 메모리로 페이지를 다시 읽거나 나중에 발생하지만 나중에는 발생합니다. 당신이 좋아하는 일을 할 경우 실제로, swapoff -a && swapon -a당신은 느낄 수 있습니다 당신이 그렇지 않으면 읽지 않고 다시 결국 필요하지 떨어 된 적이없는 것 메모리에 복사 돌아올 일부 페이지를 강제하기 때문에, 오히려보다 고통을 (생각 : 당신이 응용 프로그램을 잠시 종료 힙의 상당 부분이 스왑 아웃되므로 해당 페이지를 메모리로 다시 읽지 않고도 완전히 삭제할 수 있습니다.

그러나 이것은 스왑에서 페이지를 지우므로 다음에 스크립트를 실행할 때 다시 작성해야합니다.

스왑에서 기본 메모리로 다시 복사되는 거의 모든 페이지가 어쨌든 수정 될 예정이므로 나중에 다시 스왑하기 위해 다시 이동해야하는 경우 스왑에서 새로 작성해야합니다. 스왑은 주로 읽기 전용 페이지 (일반적으로 파일 백업)가 아니라 힙 메모리입니다.

나는 당신의 swapoff -a && swapon -a트릭이 당신이 생각해 낼 수있는 것만 큼 좋다고 생각합니다 .


그것은 우리 둘이 동시에 정확히 같은 것을 말하는 것입니다;)
goldilocks

@goldilocks 그래, 나는 내 준비가되기 전에 당신의 대답이 나타나는 것을 보았지만 이미 ¾ 했으므로 나는 그것을 고수했습니다 :-)
Celada

당신과 goldilocks는 같은 것을 말하지만 이것이 스왑 캐싱이 작동하는 방식이라고 믿지 않습니다. 내 이해는 페이지를 스왑 및 메모리에 동시에 가질 수 있다는 것입니다. 스왑 페이지는 메모리의 페이지가 업데이트 된 후에 만 ​​무효화됩니다.
drrossum

David Spillett언급 한 답변 이 정확 하다는 것을 확신 합니다 . 실제로 스왑과 RAM의 페이지를 가질 수 있지만 RAM 버전이 수정 될 때까지만 가능합니다. 그런 다음 오래된 복사본을 교체해야합니다. "스왑 [...]에서 다시 복사되는 거의 모든 페이지가 어쨌든 수정 될 예정"이라고 말했을 때 이것이 대부분의 시간에 발생할 것으로 예상되므로 페이지를 기대하지 않습니다. 두 곳 모두 걱정할만한 가치가 있습니다.
Celada

사용 시나리오가 다를 수 있습니다. 힙이 많은 응용 프로그램이 많고 자주 읽지 않고 쓰지 않을 수 있습니다. 제 생각에는 대부분의 사람들에게 그러한 시나리오가 없습니다. 그러나 당신이한다면, 당신이 옳은 것 같아요. 당신에게 swapoff -a && swapon -a좋지 않을 것입니다. 이 경우 /proc/<each-process>/memRAM에 존재하는지 확인하기 위해 각 메모리 페이지 를 스캔 하고 읽는 무언가가 필요하다고 생각합니다 . 그것이 존재하는지 모른다.
Celada

0

여기에 아주 좋은 토론이 있습니다 http://rudd-o.com/en/linux-and-free-software/tales-from-responsivenessland-why-linux-feels-slow-and-how-to-fix-that 시스템의 응답 속도를 높이려면 코드 스왑을 방지해야한다는 아이디어와 함께 스와 피 니스가 줄어 듭니다. 이것은 실제로 귀하의 질문에 대한 답변은 아니지만 문제가 나타나지 않도록 할 수 있습니다 (응용 프로그램은 스왑되지 않고 사용되지 않은 데이터와 페이지 캐시 만)


이 이론적으로 질문에 대답 할 수 있습니다 동안, 바람직 할 것이다 여기에 대한 대답의 본질적인 부분을 포함하고 참조 할 수 있도록 링크를 제공합니다.
slm
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.