Как правильно настроить zram и swap

9

Я настраиваю и собираю новое ядро ​​3.0. Одним из положительных моментов, которые я планировал использовать в течение некоторого времени (путем исправлений), который был объединен с 3.0, является zram.

Можно ли установить как hdd swap, так и zram swap, чтобы zram использовался первым, и только фактические страницы помещаются в настоящий swap?

Мацей Печотка
источник

Ответы:

8

Примечание: из-за блокировки на процессор важно иметь столько же zram-swap, сколько и CPU (modprobe zram_num_devices = n zram) вместо одного большого. RTFM!

eMPee584
источник
1
[нужна цитата]? Я не могу найти рекомендации в документации Linux или Google.
Мацей Печотка
По умолчанию, max_comp_streamsкажется, в 1соответствии с документацией . Я не проверял, существует ли этот параметр в 2011 году, но кажется, что он лучше, чем несколько файлов подкачки.
Мацей Пехотка
1
Тестируя с пакетом zram-configпод Ubuntu (и, вероятно, с Debian), я заметил, что по умолчанию конфигурация равна 1 на ядро ​​или поток (2 на старом двухъядерном E2140 и 4 на i3-3220)
Elder Geek
интересно, и это также кажется вполне понятным, прочитав /etc/init/zram-config.conf
Водолей Power
1
Эта sidenote устарела с версии ядра 3.15. Теперь вы можете иметь несколько потоков сжатия для одного большого zram.
Перкинс
6

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"
Мацей Печотка
источник
1

Выберите, сколько устройств Zram вы хотите, передав

zram.num_devices=4

к параметрам ядра или непосредственно к модулю (без zram.). Значение по умолчанию - 1. zram сможет использовать столько процессоров, сколько вы создаете.

Подготовьте устройство zram0, установите размер 1 ГБ.

echo 1000000000 > /sys/block/zram0/disksize

В качестве альтернативы вы можете сделать это по правилу udev. Создать своп на zram0

mkswap /dev/zram0

и включите его с более высоким приоритетом, чем другие устройства подкачки

swapon -p 32767 /dev/zram0
okias
источник
Для какой версии ядра и дистрибутива вы пишете здесь?
Cbhihe
Для записи, продолжить, как вы советуете на настольном Ubuntu 14.04.5, не удается. В частности, когда я пытаюсь установить приоритеты zram0и zram1до значения 10 на ядрах Intel T9300 коробки 2, он бросает мне: swapon: /dev/zram0 or 1: swapon failed: Device or resource busy.
Cbhihe
1

По некоторым причинам, по-видимому, существует много неверных толкований https://www.kernel.org/doc/Documentation/blockdev/zram.txt.

В нем четко говорится:

2) Установить максимальное количество потоков сжатия.
Независимо от значения, переданного этому атрибуту, ZRAM всегда будет выделять несколько потоков сжатия - по одному на онлайн-процессоры - таким образом, разрешая несколько одновременных операций сжатия. Количество выделенных потоков сжатия уменьшается, когда некоторые из процессоров отключаются. Больше нет режима единого потока сжатия, если только вы не используете систему UP или не имеете только 1 ЦП в сети.

Чтобы узнать, сколько потоков доступно в данный момент:

cat /sys/block/zram0/max_comp_streams

Но существует распространенный, постоянный городской миф о том, что максимальное количество потоков равно 1.

Это явно не правда.

Две ОС, где Zram доказала свою эффективность, Chrome OS и Android - это одно устройство. Также они настраивают page-cluster:

page-clusterуправляет количеством страниц, до которых последовательные страницы считываются из свопа за одну попытку. Это аналог подкачки для чтения кеша страниц.
Упомянутая последовательность не в терминах виртуальных / физических адресов, а в последовательности подкачки - это означает, что они были заменены вместе.

Это логарифмическое значение - установка его в ноль означает «1 страница», установка в 1 означает «2 страницы», установка в 2 означает «4 страницы» и т. Д. Ноль полностью отключает чтение подкачки.

Значение по умолчанию - три (восемь страниц за раз). Может быть несколько небольших преимуществ при настройке этого значения на другое, если ваша рабочая нагрузка требует интенсивного обмена.

Более низкие значения означают более низкие задержки для начальных неисправностей, но в то же время дополнительные неисправности и задержки ввода-вывода для следующих неисправностей, если бы они были частью этих последовательных страниц, которые могли бы привести к чтению.

                - из документации ядра для/proc/sys/vm/*

Так что используйте, echo "0" > /proc/sys/vm/page-clusterчтобы заставить одну страницу.

Похоже, многое происходит из zram_config пакета debian / ubuntu, который по некоторым причинам, похоже, очень мало коррелирует с документами ядра для zram и породил серию китайских шепотов, которые по сути могут быть совершенно неверными.

С помощью файла подкачки вы создаете диск подкачки для каждого ядра? Может быть, это может ответить на ваши вопросы. Также, чтобы поддержать это, Googles Chrome OS & Android, которые успешно работают с вышеуказанным кластером страниц, поскольку он не соответствует диску, так что задержка может быть улучшена для отдельных устройств.

Также для системного администратора, что важно фактическое использование памяти или использование памяти? Большинство примеров показывают создание через disk_size и полностью игнорируют mem_limit. disk_size = несжатый размер виртуальной машины. mem_limit = фактический предел памяти.

Это как-то делает выбор параметра disk_size запутанным, поскольку его виртуальный максимальный размер зависит от соотношения comp_alg и накладных расходов 0,1% от размера диска, когда он не используется, и действительно является приблизительным значением mem_limit * (приблизительно 2 - 4) относительно экономичного оптимизм.

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
}
Стюарт Нейлор
источник
0

Когда вы включаете zram, он автоматически будет иметь приоритет.

Для Ubuntu 16.04: /usr/bin/init-zram-swapping

Вы можете отредактировать этот файл (сначала сделайте резервную копию), чтобы опустить реальный оперативный памяти, я изменил строку mem на это:

mem=$(((totalmem / 4 / ${NRDEVICES}) * 1024))
VeganEye
источник