ZRAMスワップで何が変わるか
ZRAMは、メモリの一部を圧縮してスワップ領域として使うLinuxカーネルの機能です。スワップとは、メモリが足りないときにデータを一時的に退避させる場所のことです。普通のスワップはSSDやHDDに書き出すため、メモリ不足になると読み書きを待つ時間が増え、操作が止まったように感じます。ZRAMはメモリ内で圧縮して保存するので、ディスクより速く退避と復帰ができます。
zram-generatorは、このZRAMデバイスを起動時に自動で作るツールです。systemdのジェネレーター(起動時に設定ファイルからユニットを生成する仕組み)として動きます。設定ファイルを1つ置けば、あとは毎回の起動で自動的にZRAMスワップが有効になります。
前提とつまずきやすい箇所
この手順はsystemdを使うディストリビューションが前提です。作業には管理者権限(sudo)が必要です。カーネルにzramモジュールが含まれている必要がありますが、主要ディストリビューションの標準カーネルなら通常は含まれています。
つまずきやすい箇所は3つあります。1つ目は、FedoraのようにすでにZRAMが有効な環境で、二重に設定してしまうことです。2つ目は、既存のスワップファイルとの優先度を決めずに使い、ZRAMより先にディスクのスワップが使われてしまうことです。3つ目は、zswapという似た機能が有効なままになっていることです。それぞれ該当する手順で説明します。
手順1:現在のスワップ状況を確認する
まず今の状態を記録します。設定後に比較するためと、問題が起きたときに元の状態を把握するためです。
swapon --show
free -h
zramctlswapon --show は有効なスワップ領域の一覧を表示します。NAME がデバイスやファイルの名前、PRIO が優先度です。何も表示されなければスワップはありません。free -h はメモリとスワップの総量と使用量を読みやすい単位で表示します。zramctl はZRAMデバイスの一覧を表示します。何も出なければZRAMは使われていません。
ここで /dev/zram0 がすでに表示される場合、ZRAMは既定で有効です。次の節を読んでから進めてください。
既定でZRAMが有効なディストリビューションとの違い
Fedoraはバージョン33以降、既定でZRAMスワップを有効にしています。zram-generatorと、既定の設定を入れる zram-generator-defaults パッケージが最初から入っており、設定は /usr/lib/systemd/zram-generator.conf にあります。この環境では新たに導入する必要はありません。サイズなどを変えたいときは、後述の /etc/systemd/zram-generator.conf を作ります。/etc 側のファイルは /usr/lib 側より優先されます。
Ubuntuの一部フレーバーなど、zram-generatorではなく zram-config や zram-tools といった別のパッケージでZRAMを有効にしている環境もあります。この場合にzram-generatorを追加すると、同じデバイスを2つの仕組みが扱おうとして衝突します。zramctl でZRAMが見えたのに設定ファイルが見つからないときは、先に既存のパッケージを確認し、どちらか一方だけを使ってください。
手順2:zram-generatorを導入する
パッケージ名はディストリビューションによって異なります。以下は執筆時点の名前です。
| ディストリビューション | コマンド |
|---|---|
| Debian 12以降・Ubuntu | sudo apt install systemd-zram-generator |
| Fedora(通常は導入済み) | sudo dnf install zram-generator |
| Arch Linux | sudo pacman -S zram-generator |
インストールしただけではZRAMデバイスは作られません。Fedora以外では既定の設定ファイルが入らないためです。次の手順で設定ファイルを作ると初めて動きます。
手順3:設定ファイルを作る
エディターで /etc/systemd/zram-generator.conf を作成し、次の内容を書きます。
[zram0]
zram-size = min(ram / 2, 8192)
compression-algorithm = zstd
swap-priority = 100[zram0] は作るデバイス名です。zram-size はZRAMデバイスのサイズで、単位はMiBです。この例では搭載メモリの半分、ただし最大8GiBにしています。このサイズは圧縮前のデータ量の上限です。メモリをこの量だけ先に確保するわけではありません。compression-algorithm は圧縮方式で、zstd は圧縮率と速度のバランスがよい方式です。使える方式は cat /sys/block/zram0/comp_algorithm で確認できます(ZRAMデバイスがある状態で実行します)。swap-priority はスワップの優先度で、既定値も100です。
手順4:設定を有効にする
再起動せずに有効にするには、次の2つのコマンドを実行します。
sudo systemctl daemon-reload
sudo systemctl start [email protected]daemon-reload を実行すると、systemdがジェネレーターを再実行し、設定ファイルからユニットを生成します。2つ目のコマンドで、そのユニットが実際にZRAMデバイスを作り、スワップとして有効にします。次回以降の起動では自動で有効になります。
エラーが出た場合は journalctl -u [email protected] でログを確認します。設定ファイルの書き間違いは、ここに理由が表示されます。
手順5:動作を確認する
zramctl
swapon --showzramctl に /dev/zram0 が表示され、ALGORITHM と DISKSIZE が設定どおりなら成功です。DATA は格納された元のデータ量、COMPR は圧縮後の量を示します。メモリに余裕があるうちは0に近い値でも問題ありません。swapon --show に /dev/zram0 が優先度100で並んでいれば、スワップとして使われています。
既存のスワップファイルとの優先度を決める
Linuxは優先度の数値が大きいスワップから先に使います。ZRAMを先に使い、それが埋まったらディスクのスワップを使う構成が一般的です。/etc/fstab で優先度を指定していないスワップは、負の値(-2など)が自動で割り当てられます。この場合はZRAMの100の方が高いので、何もしなくてもZRAMが先に使われます。
明示しておきたいときは、/etc/fstab のスワップの行に pri= を加えます。
/swapfile none swap defaults,pri=10 0 0ZRAMの値(100)より小さい数値にしてください。編集前には sudo cp /etc/fstab /etc/fstab.bak で控えを取ります。反映は再起動で行い、swapon --show で優先度を確かめます。ディスクのスワップをなくすと、休止状態(ハイバネーション)が使えなくなる場合があります。ZRAMはハイバネーションの保存先にならないためです。
zswapが有効な場合の扱い
zswapは、ディスクのスワップに書き出す前にメモリ上で圧縮して溜めるカーネル機能です。ZRAMと併用すると二重に圧縮処理が走り、効果が薄れます。cat /sys/module/zswap/parameters/enabled が Y なら有効です。ZRAMを主に使うなら、カーネルの起動オプションに zswap.enabled=0 を加えて無効にする方法があります。起動オプションの編集方法はブートローダーとディストリビューションによって異なります。
起動に問題が出たときの戻し方
ZRAMの設定ミスで起動が止まることはまれですが、起動が遅い、途中で止まる、といった症状が出たら、まずzram-generatorを一時的に止めます。GRUBのメニューで起動項目を選んで e キーを押し、linux で始まる行の末尾に systemd.zram=0 を加えます。Ctrl+X または F10 で起動すると、その回だけZRAMは作られません。この変更は保存されないので、次の起動では元に戻ります。
起動できたら設定ファイルを直すか、削除します。
sudo rm /etc/systemd/zram-generator.conf
sudo systemctl daemon-reloadFedoraで既定のZRAMを止めたい場合は、削除ではなく中身が空の /etc/systemd/zram-generator.conf を作ります。空のファイルが /usr/lib 側の既定設定を上書きし、デバイスが作られなくなります。
/etc/fstab の編集で別の行を壊し、緊急モード(emergency mode)で止まった場合は、rootのパスワードでログインします。mount -o remount,rw / でルートを書き込み可能にし、cp /etc/fstab.bak /etc/fstab で控えから戻して再起動します。
設定後に見直す基準
設定が終わったら、普段どおりの作業で数日使い、メモリが逼迫した時点で zramctl を確認します。DATA が DISKSIZE の上限近くまで達しているなら、zram-size を増やす候補です。COMPR が DATA の半分を大きく超える場合は、データが圧縮しにくい種類です。この場合はZRAMを増やしても効果が限られるので、ディスクのスワップを残すか、メモリの増設を検討します。それでも重さが改善しないなら、スワップの設定より、メモリを多く使うプロセスを top などで特定するほうが先です。