Як правильно налаштувати zram та swap


9

Я налаштовую і компілюю нове ядро ​​3.0. Одне з приємностей, які я планував використовувати протягом деякого часу (шляхом виправлення), яке було об'єднано в 3.0, - це zram.

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

Відповіді:


8

Сторінка: через блокування per-cpu важливо мати стільки zram-swaps, скільки CPU (modprobe zram_num_devices = n zram) замість одного великого. RTFM!


1
[цитування потрібне]? Я не можу знайти рекомендацію в документації Linux або Google.
Maciej Piechotka

За замовчуванням, max_comp_streamsздається, це 1відповідає документації . Я не перевіряв, чи існував цей параметр у 2011 році, але, здається, це кращий варіант, ніж кілька файлів підкачки.
Мацей П'єхотка

1
Тестуючи з пакетом zram-configпід Ubuntu (і, ймовірно, debian), я зазначив, що конфігурація за замовчуванням до 1 на ядро ​​або потік (2 на старому подвійному ядрі E2140 і 4 на i3-3220)
Elder Geek

Цікаво, і це також здається зрозумілим для розуміння, читаючи /etc/init/zram-config.conf
Водолій Сила

1
Цей сторонній знак є застарілим у версії 3.15 ядра. Тепер ви можете мати кілька ниток стиснення для одного великого зрам.
Перкінс

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

EDIT: Просто для повного рішення - такий рядок може бути корисним як правило udev:

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

1

Виберіть, скільки пристроїв zram вам потрібно, проходячи повз

zram.num_devices=4

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

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

echo 1000000000 > /sys/block/zram0/disksize

Можна також зробити це за правилом udev. Створіть своп на zram0

mkswap /dev/zram0

і ввімкніть його з більш високим пріоритетом, ніж інші пристрої для заміни

swapon -p 32767 /dev/zram0

Про які версії ядра та дистрибутива ви пишете тут?
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 сторінки" і т. Д. Нуль повністю відключає swap readadahead повністю.

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

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

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

Тому використовуйте echo "0" > /proc/sys/vm/page-clusterдля примусового використання однієї сторінки.

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

Ви створюєте своп файлів для кожного ядра? Можливо, це може відповісти на ваші запитання. Крім того, щоб створити резервну копію Googles Chrome OS та Android, які успішно працюють із вищевказаним кластером сторінок, оскільки його не відповідає диску, тому затримка може бути покращена, окремі пристрої.

Також для sys-admin важливо фактичне використання пам’яті або використання vm mem? Більшість прикладів показують створення через disk_size і повністю ігнорують mem_limit. disk_size = нестиснений розмір vm. mem_limit = фактична межа пам'яті.

Це щось робить вибір disk_size заплутаним, оскільки його віртуальний максимальний розмір залежить від співвідношення comp_alg та накладних витрат 0,1% від розміру диска, коли він не використовується, і насправді є здогадкою пам’яті mem_limit * (приблизно 2 - 4) зловмисних vs оптимізм.

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

Ви можете відредагувати цей файл (зробіть резервну копію 1-го), щоб знизити використаний реальний таран, я змінив мему-рядку на це:

mem=$(((totalmem / 4 / ${NRDEVICES}) * 1024))
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.