zramパラメーター一覧作ってみました

Linux Kernel

前回記事log2ramでzramという便利機能がありました。
興味が出てきたので、ユーザーが指定可能なパラメーターを調べてみます。
log2ramはこちら。

zramって?

compcacheというkernelモジュール後継でオンザフライ圧縮/展開機能付RAMディスクのこと。
今回は、/var/log/以下に何か書き込むとRAM上では圧縮された状態で保持するということですね。
逆も然りで、/var/log/以下からの読出データは自動的に展開された状態で読み出せます。

要は「/tmp/以下に実サイズ以上のデータを保存できるよ」ということですね!

まずはググってみた

zram kernel parameterでググってみました。
kernel.orgがヒットしましたので、ざっと見てみます。

https://www.kernel.org/doc/Documentation/blockdev/zram.txt

a) using zram and zram_control sysfs attributes
b) using zramctl utility, provided by util-linux (util-linux@vger.kernel.org).

zram: Compressed RAM based block devices

sysfsもしくはutil-linuxを使って操作できるようですね。
util-linuxは本筋から外れるので、ここではsysfsのみ対象にします。

パラメーター一覧

時間がない方のために一覧でまとめておきます。
ほぼkernel.orgの書き写しですが、、、自分なりに噛み砕いてみました。

パラメーター名属性概要
disksizeRWZRAMブロックデバイスのデータサイズを指定します。
initstateRO初期化済かどうかを示します。
resetWOzramモジュールの再起動をkernelに指示します。
mem_used_maxWOzramが圧縮データ保持のために使用しているRAMサイズを更新します。
mem_limitWOzramが圧縮データ保持のために使用可能なRAMサイズを指定します。
writeback_limitWOwriteback機能で書き込める最大データサイズを指定します。
writeback_limit_enableRWwriteback機能で書き込めるデータサイズ制限が有効かどうか指定します。
max_comp_streamsRW同時並行圧縮処理可能数を指定します。
comp_algorithmRW圧縮アルゴリズムを指定します。
compactWOメモリ圧縮を指示します。
debug_statROデバッグ用途。
backing_devRWwriteback機能で使うブロックデバイスを指定します。
idleWOアイドル状態にします。

ここからは自分が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
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

https://www.malasuk.com/doc/kernel-doc-3.10.0/Documentation/blockdev/zram.txt

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でも使うことができましたので、まずはその辺で使い方に慣れてみるのが良さそうです!

この記事を書いた人

組込ソフト歴15年の外資系エンジニア。
前職で組込Linuxを使った商品設計/品質確保の業務に従事。
Raspberry Piが好き。
株式投資で年50万円を稼ぐ。
妻は香港人(国際結婚)。

Please follow me
Linux Kernelzram
Please follow me

Comments

タイトルとURLをコピーしました