前回記事log2ramでzramという便利機能がありました。
興味が出てきたので、ユーザーが指定可能なパラメーターを調べてみます。
log2ramはこちら。
zramって?
compcacheというkernelモジュール後継でオンザフライ圧縮/展開機能付RAMディスクのこと。
今回は、/var/log/以下に何か書き込むとRAM上では圧縮された状態で保持するということですね。
逆も然りで、/var/log/以下からの読出データは自動的に展開された状態で読み出せます。
要は「/tmp/以下に実サイズ以上のデータを保存できるよ」ということですね!
まずはググってみた
zram kernel parameterでググってみました。
kernel.orgがヒットしましたので、ざっと見てみます。
a) using zram and zram_control sysfs attributes
zram: Compressed RAM based block devices
b) using zramctl utility, provided by util-linux (util-linux@vger.kernel.org).
sysfsもしくはutil-linuxを使って操作できるようですね。
util-linuxは本筋から外れるので、ここではsysfsのみ対象にします。
パラメーター一覧
時間がない方のために一覧でまとめておきます。
ほぼkernel.orgの書き写しですが、、、自分なりに噛み砕いてみました。
パラメーター名 | 属性 | 概要 |
---|---|---|
disksize | RW | ZRAMブロックデバイスのデータサイズを指定します。 |
initstate | RO | 初期化済かどうかを示します。 |
reset | WO | zramモジュールの再起動をkernelに指示します。 |
mem_used_max | WO | zramが圧縮データ保持のために使用しているRAMサイズを更新します。 |
mem_limit | WO | zramが圧縮データ保持のために使用可能なRAMサイズを指定します。 |
writeback_limit | WO | writeback機能で書き込める最大データサイズを指定します。 |
writeback_limit_enable | RW | writeback機能で書き込めるデータサイズ制限が有効かどうか指定します。 |
max_comp_streams | RW | 同時並行圧縮処理可能数を指定します。 |
comp_algorithm | RW | 圧縮アルゴリズムを指定します。 |
compact | WO | メモリ圧縮を指示します。 |
debug_stat | RO | デバッグ用途。 |
backing_dev | RW | writeback機能で使うブロックデバイスを指定します。 |
idle | WO | アイドル状態にします。 |
ここからは自分がkernel.orgを読んでいてわからなかった部分を調べました。
mem_used_maxについて
このパラメーターはkernel.orgの説明では以下のとおりです。
reset the `mem_used_max’ counter (see later)
(略)
the maximum amount of memory zram have consumed to
store the data
これだと何を言っているのかわからないので、kernelのソースコードを見ます。
https://github.com/torvalds/linux からダウンロード。
zram関係はdrivers/block/zram/zram_drv.cにだいたい載っています。
mem_used_maxの書込部分は以下。
static ssize_t mem_used_max_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t len) { int err; unsigned long val; struct zram *zram = dev_to_zram(dev); err = kstrtoul(buf, 10, &val); if (err || val != 0) return -EINVAL; down_read(&zram->init_lock); if (init_done(zram)) { atomic_long_set(&zram->stats.max_used_pages, zs_get_total_pages(zram->mem_pool)); } up_read(&zram->init_lock); return len; }
ざっくり読むと、
・値は0でないといけない
・初期化済ならzram->stats.max_used_pagesにzs_get_total_pages(zram->mem_pool)の値を代入
という感じですね。
てっきりユーザーが指定した値で更新するのかと思っていましたが、0が書き込まれたのをトリガーに、使用中ページサイズを読み直して代入するようです。
更新された値は /sys/block/zramX/mm_stat を読むことで確認できます。
File /sys/block/zram/mm_stat
https://www.malasuk.com/doc/kernel-doc-3.10.0/Documentation/blockdev/zram.txt
The stat file represents device’s mm statistics. It consists of a single
line of text and contains the following stats separated by whitespace:
orig_data_size
compr_data_size
mem_used_total
mem_limit
mem_used_max
zero_pages
num_migrated
writebackについて
zramはwriteback機能をサポートしているとのことですが、具体的にどんな機能なのか調べてみます。
kernel.orgでの説明は以下のとおりです。
= writeback
With CONFIG_ZRAM_WRITEBACK, zram can write idle/incompressible page to backing storage rather than keeping it in memory.
どうやらアイドル・圧縮不可なページを代替ブロックデバイスに書き込むことでZRAM自身のRAMを使わないようにする機能、と読めますね。
通常のRAMに対するスワップみたいなものでしょうか。
と思いましたが、スワップはメモリが満杯になったときに動作するのに対し、こちらは満杯かどうかは言及していません。
分けて考えたほうが良さそうです。
代替ブロックデバイスはbacking_devで指定可能です。
例: echo /dev/sda5 > /sys/block/zram0/backing_dev
writebackで書き込めるデータサイズに制限をかけることができます。
まずwriteback_limit_enableを1にして制限機能を有効化します。
例: echo 1 > /sys/block/zramX/writeback_limit_enable
次に最大データサイズをwriteback_limitで指定します。
例: echo 1024 > /sys/block/zram0/writeback_limit
こうすると、4MBまでに制限することができます。
writeback_limitはページ数を指定するようで4KB単位となります。
終わりに
いかがでしたか。
kernelモジュールを使うので、ある程度システム全体での調整が必要となりますが、tmpfsより高性能なRAMディスクとして使うことができそうに思います。
手元のRaspberry Piでも使うことができましたので、まずはその辺で使い方に慣れてみるのが良さそうです!
Comments