web-dev-qa-db-ja.com

zramとswapを適切に設定する方法

新しい3.0カーネルを構成してコンパイルしています。 3.0にマージされた、しばらくの間(パッチを適用することで)使用することを計画していた利点の1つはzramです。

Hdd swapとzram swapの両方を設定して、zramが最初に使用され、スピルされたページのみが実際のスワップに入れられるようにすることは可能ですか?

9

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"
6

補足:CPUごとのロックのため、単一の大きなものではなく、CPUと同じ数のzramスワップ(modprobe zram_num_devices = n zram)を使用することが重要です。 RTFM!

8
eMPee584

何らかの理由で の誤解が多いようですhttps://www.kernel.org/doc/Documentation/blockdev/zram.txt

それは明確に述べています:

2)圧縮ストリームの最大数を設定する
この属性に渡される値に関係なく、ZRAMは常に複数の圧縮ストリーム(オンラインCPUごとに1つ)を割り当てるため、複数の同時圧縮操作が可能です。一部のCPUがオフラインになると、割り当てられた圧縮ストリームの数が減少します。 UPシステムを実行しているか、オンラインにCPUが1つしかない場合を除いて、単一圧縮ストリームモードはもうありません。

現在利用可能なストリームの数を確認するには:

cat /sys/block/zram0/max_comp_streams

しかし、最大ストリーム数が1であるという一般的で永続的な都市の神話があります。

それは明らかに真実ではありません。

Zramが効果的であることが証明されている2つのOS Chrome OS&Androidあなたに単一のデバイスです。また、それらを微調整しますpage-cluster

page-clusterは、連続するページが1回の試行でスワップから読み込まれる最大ページ数を制御します。これは、ページキャッシュの先読みに対応するスワップです。
前述の接続性は、仮想/物理アドレスではなく、スワップスペースで連続しています。つまり、それらは一緒にスワップアウトされました。

これは対数値です。ゼロに設定すると「1ページ」を意味し、1に設定すると「2ページ」を意味し、2に設定すると「4ページ」を意味します。ゼロはスワップ先読みを完全に無効にします。

デフォルト値は3(一度に8ページ)です。ワークロードがスワップを多用する場合は、これを別の値に調整することでいくつかの小さな利点があるかもしれません。

値が小さいほど、初期フォールトのレイテンシは低くなりますが、連続するページの先読みの一部であった場合は、追加のフォールトと後続のフォールトのI/O遅延が発生します。

/proc/sys/vm/* のカーネルドキュメントから

したがって、echo "0" > /proc/sys/vm/page-clusterを使用して単一ページを強制します。

多くはzram_configのdebian/ubuntuパッケージに由来するようですが、何らかの理由でzramのカーネルドキュメントとの相関がほとんどなく、本質的に完全に間違っている可能性がある一連の中国語のささやきが生まれました。

ファイルスワップでは、コアごとにスワップドライブを作成しますか?多分それはあなたの質問に答えるかもしれません。また、これをバックアップするGoogle Chrome OS&Androidこれは、ディスクと一致しないため、上記のページクラスタで正常に使用できるため、レイテンシを改善できます。デバイス。

また、sys-adminにとって、重要な実際のmem使用量またはvm mem使用量は何ですか?ほとんどの例では、disk_sizeによる作成を示し、mem_limitを完全に無視しています。 disk_size =非圧縮vmサイズ。 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
}
1
Stuart Naylor

渡すことで、必要なzramデバイスの数を選択します

zram.num_devices=4

カーネルパラメータまたは直接モジュール(zramなし)に。デフォルト値は1です。zramは、作成したデバイスの数と同じ数のCPUを利用できます。

Zram0デバイスを準備し、サイズを1GBに設定します。

echo 1000000000 > /sys/block/zram0/disksize

代わりに、udevルールでそれを行うこともできます。 zram0にスワップを作成する

mkswap /dev/zram0

他のスワップデバイスよりも高い優先度でそれを有効にします

swapon -p 32767 /dev/zram0
1
okias

Zramを有効にすると、自動的に優先されます。

Ubuntu 16.04の場合:/usr/bin/init-zram-swapping

そのファイルを編集して(最初にバックアップを作成)、使用されている実際のRAMを下げることができます。mem行を次のように変更しました。

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