zram을 설정하고 올바르게 스왑하는 방법

zram을 설정하고 올바르게 스왑하는 방법

새로운 3.0 커널을 구성하고 컴파일하고 있습니다. 제가 한동안 (패치를 통해) 사용하고 3.0에 병합할 계획인 훌륭한 기능 중 하나는 zram입니다.

hdd 스왑과 zram 스왑을 동시에 설정하여 zram을 먼저 사용하고 오버플로된 페이지만 실제 스왑에 넣도록 할 수 있나요?

답변1

swapon-p우선순위를 설정하는 스위치가 있습니다 . 다음을 설정할 수 있습니다.

swapon -p 32767 /dev/zram0
swapon -p 0 /dev/my-lvm-volume/swap

또는 /etc/fstab에서:

/dev/zram0              none swap sw,pri=32767 0 0
/dev/my-lvm-volume/swap none swap sw,pri=0     0 0

편집하다:완벽한 솔루션을 위해 다음과 같은 줄이 udev 규칙으로 도움이 될 수 있습니다.

KERNEL=="zram0", ACTION=="add", ATTR{disksize}="1073741824", RUN="/sbin/mkswap /$root/$name"

답변2

참고 사항: 각 CPU가 잠겨 있으므로 다음을 수행하는 것이 중요합니다.CPU 수만큼 zram 스왑 가능(modprobe zram_num_devices=n zram) 큰 것 대신. 실시간 FM!

답변3

왠지 오해가 많은 것 같다.https://www.kernel.org/doc/Documentation/blockdev/zram.txt

그것은 분명히 다음과 같이 말합니다:

2) 최대 압축 스트림 수 설정
이 속성에 전달된 값에 관계없이 ZRAM은 항상 여러 압축 스트림(온라인 CPU당 하나)을 할당하여 여러 동시 압축 작업을 허용합니다. 일부 CPU가 오프라인 상태이면 할당된 압축 스트림 수가 줄어듭니다. UP 시스템을 실행하거나 온라인에 CPU가 1개만 있는 경우가 아니면 더 이상 단일 압축 스트림 모드가 없습니다.

현재 사용 가능한 스트림 수를 확인하려면 다음을 수행하세요.

cat /sys/block/zram0/max_comp_streams

그러나 일반적이고 지속적인 도시 신화가 있습니다. 최대 유량은 1입니다.

이것은 분명히 사실이 아닙니다.

zram은 Chrome OS와 Android 운영체제가 모두 단일 기기에서 작동함을 입증했습니다. 그들은 또한 다음을 조정했습니다 page-cluster.

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

로그 값입니다. 0으로 설정하면 "1페이지"를 의미하고, 1로 설정하면 "2페이지"를 의미하고, 2로 설정하면 "4페이지"를 의미합니다. 0은 스왑 미리 읽기를 완전히 비활성화합니다.

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

값이 낮을수록 초기 오류에 대한 대기 시간이 짧아지지만, 미리 읽기 연속 페이지의 일부인 경우 추가 오류 및 후속 오류에 대한 I/O 대기 시간이 희생됩니다.

                - 에서커널 문서/proc/sys/vm/*

따라서 echo "0" > /proc/sys/vm/page-cluster강제 단일 페이지를 사용하십시오.

이 중 대부분은 debian/ubuntu 패키지의 zram_config에서 비롯된 것으로 보이며 어떤 이유로 zram의 커널 문서와 거의 관련이 없는 것으로 보이며 본질적으로 완전히 거짓일 수 있는 일련의 중국 소문을 낳았습니다.

파일 스왑을 사용하면 코어당 스왑 드라이브를 생성합니까? 아마도 이것이 귀하의 질문에 대한 답변일 것입니다. 또한 이를 지원하기 위해 Google의 Chrome OS 및 Android는 위의 페이지 클러스터링과 성공적으로 작동하여 디스크와 일치하지 않기 때문에 단일 장치의 대기 시간을 향상시킵니다.

또한 시스템 관리자에게 실제 메모리 사용량이나 가상 머신 메모리 사용량은 얼마나 중요합니까? 대부분의 예는 disk_size를 통한 생성과 mem_limit를 완전히 무시하는 것을 보여줍니다. disk_size=압축되지 않은 가상 머신 크기. mem_limit=실제 메모리 사용량 제한입니다.

가상 최대 크기는 comp_alg 비율과 사용하지 않을 때 디스크 크기의 0.1% 오버헤드에 따라 달라지며 실제로는 mem_limit *(약 2 - 4)를 낙관적으로 추측하기 때문에 disk_size 선택을 혼란스럽게 만듭니다.

zram_config는 이전 서비스 사용량을 확인하고 덮어쓰지도 않고 대신 zram sys 클래스(아래 표시)에 대한 간단한 확인만으로 문제를 해결합니다.

createZramSwaps () {
        totalmem=$(free|awk '/^Mem:/{print $2}')
        mem=$((( totalmem * MEM_FACTOR / 100 / BIG_CORES ) * 1024))

        # Check Zram Class created
        ZRAM_SYS_DIR='/sys/class/zram-control'
        if [ ! -d "${ZRAM_SYS_DIR}" ]; then
                modprobe zram
                RAM_DEV='0'
                echo ${COMP_ALG_SWAP} > /sys/block/zram${RAM_DEV}/comp_algorithm
                echo ${mem} > /sys/block/zram${RAM_DEV}/disksize
                mkswap /dev/zram${RAM_DEV}
                swapon -p ${SWAP_PRI} /dev/zram${RAM_DEV}
        else
                RAM_DEV=$(cat /sys/class/zram-control/hot_add)
                echo ${COMP_ALG_SWAP} > /sys/block/zram${RAM_DEV}/comp_algorithm
                echo ${mem} > /sys/block/zram${RAM_DEV}/disksize
                mkswap /dev/zram${RAM_DEV}
                swapon -p ${SWAP_PRI} /dev/zram${RAM_DEV}
        fi

        if [ "$BIG_CORES" -gt 1 ];then
                for i in $(seq $((BIG_CORES - 1))); do
                        RAM_DEV=$(cat /sys/class/zram-control/hot_add)
                        echo ${COMP_ALG_SWAP} > /sys/block/zram${RAM_DEV}/comp_algorithm
                        echo ${mem} > /sys/block/zram${RAM_DEV}/disksize
                        mkswap /dev/zram${RAM_DEV}
                        swapon -p ${SWAP_PRI} /dev/zram${RAM_DEV}
                done
        fi
}

답변4

zram을 활성화하면 자동으로 우선 순위가 부여됩니다.

우분투 16.04의 경우:/usr/bin/init-zram-swapping

파일을 편집하여(먼저 백업 만들기) 사용된 실제 메모리를 낮출 수 있습니다. mem 줄을 다음과 같이 변경했습니다.

mem=$(((totalmem / 4 / ${NRDEVICES}) * 1024))

관련 정보