zRAMでLinuxのパフォーマンスを向上:メモリ圧縮ガイド

Linux tutorial - IT technology blog
Linux tutorial - IT technology blog

なぜ圧縮RAMが従来のスワップより優れているのか

誰もが経験したことがあるでしょう。1GBのクラウドVPSや古いノートPCでマルチタスクをしている最中、RAMが限界に達して突然動作が極端に重くなることを。数十年にわたり、標準的な解決策はディスク上のスワップファイルでした。しかし、高速なNVMeドライブとマルチコアCPUの時代において、より効率的なツールがあります。それが「zRAM」です。

従来のスワップはストレージドライブ上に配置されます。どれほど高速なSSDであっても、RAMと比べれば桁違いに低速です。SSDへのアクセスには約50〜100マイクロ秒かかりますが、RAMはナノ秒単位で応答します。

zRAMは、システムメモリ内に直接圧縮ブロックデバイスを作成することで、このギャップを埋めます。OSがデータを退避させる必要があるとき、そのデータを圧縮してこの仮想パーティションに保存します。最新のCPUは毎秒数ギガバイトのデータを圧縮できるため、メモリ使用率が95%に達してもシステムは軽快に動作し続けます。

zRAMを、よく似た「zSwap」と混同しないでください。zSwapは既存のディスクベースのスワップの圧縮キャッシュとして機能しますが、zRAMは独立したスワップデバイスです。本番環境での経験から言うと、ディスクI/Oを完全に排除し、SSDのNANDフラッシュを不要な摩耗から守りたい場合には、zRAMの方がクリーンな選択肢となります。

現実的な評価:パフォーマンスとCPUサイクルのトレードオフ

システムエンジニアリングにおいて、タダ飯(無料のランチ)というものはありません。zRAMはメモリをダウンロードして増やしているような感覚になりますが、実際にはメモリ容量のためにCPUパワーを少しトレードオフにしています。

メリット

  • 圧倒的なスピード: 圧縮RAMからの読み込みは、標準的なSATA SSDからの読み込みよりも約10倍から50倍高速です。
  • SSDの長寿命化: スワップ操作をメモリ内にとどめることで、フラッシュストレージの寿命を縮める原因となる無数の小さな書き込みサイクルを防ぐことができます。
  • 容量の拡大: zstdアルゴリズムを使用すると、通常2.5:1の圧縮率を達成できます。これにより、8GBの物理RAMを、一般的なアプリケーションで約12GB〜14GBの使用可能スペースに効率的に変換できます。
  • 安定性の向上: LinuxのOut-Of-Memory (OOM) キラーがデータベースやWebサーバーを突然クラッシュさせるのを防ぐ、重要なバッファを提供します。

デメリットと注意点

  • CPU使用率: プロセッサはデータをオンザフライで圧縮するために負荷がかかります。最新のRyzenやIntel Coreチップでは、その影響は1〜2%未満です。しかし、10年前のシングルコアAtomなどでは、ラグを感じるかもしれません。
  • 暗号化データの制限: zRAMは、ZIPファイル、ビデオストリーム、暗号化されたデータベースボリュームなど、すでに暗号化されているか高度に圧縮されているデータをさらに圧縮することはできません。このような場合、4GBのzRAMデバイスには4GBのデータしか保持できない可能性があります。

zRAMデバイスのサイズ設定方法

最もよくある間違いは、過剰な割り当てです。4GBのRAMに対して8GBของzRAMデバイスを作成すると、圧縮デバイスが満杯になる前に実際の物理スペースが不足する可能性があります。多くのLinuxノードを管理してきた結果、以下の比率が最も効果的であることがわかりました。

  • 小型ノード (512MB – 2GB RAM): zRAMを物理RAMの100%に設定します。これにより、小さなワークロードに対して最大の安全マージンを確保できます。
  • 中規模システム (4GB – 16GB RAM): 50%または60%に設定します。開発者やパワーユーザーにとって、これがスイートスポットです。
  • ハイエンドサーバー (32GB+ RAM): 大規模なビルドジョブやデータサイエンスのスクリプトを実行していない限り、おそらくzRAMは必要ありません。

UbuntuとDebianでの実装方法

zram-toolsパッケージを使用するのが、最も確実な方法です。カーネルモジュールのロードやサービスの管理を自動的に処理してくれます。

1. パッケージのインストール

sudo apt update
sudo apt install zram-tools

2. 設定の微調整

設定ファイルを開きます:

sudo nano /etc/default/zramswap

バランスの取れた8GBシステムの場合、以下の設定を推奨します:

# 圧縮率と速度のバランスが最適なzstdを使用
ALGO=zstd

# 物理RAMの60%を割り当て
PERCENT=60

# ディスクスワップよりも優先的にzRAMが使用されるように設定
PRIORITY=100

3. デプロイと確認

サービスを再起動して変更を適用します:

sudo systemctl restart zramswap

zramctlを実行して動作を確認します。以下のような出力が表示されるはずです:

NAME       ALGORITHM DISKSIZE  DATA  COMPR  TOTAL ST MOUNTPOINT
/dev/zram0 zstd            4.8G  2.1G   650M   710M [SWAP]

この例では、2.1GBのデータがわずか710MBのRAMに凝縮されました。システムリソースにとって大きな勝利です。

「プロ向け」の手動設定方法

Arch、Fedoraを使用している場合や、余計なパッケージをインストールしたくない場合は、いくつかのカーネルコマンドで手動でzRAMを起動できます。これはカスタムスクリプトに最適です。

#!/bin/bash
# zRAMモジュールをロード
modprobe zram
# 圧縮アルゴリズムをzstdに設定
echo zstd > /sys/block/zram0/comp_algorithm
# ディスクサイズを4Gに設定
echo 4G > /sys/block/zram0/disksize
# スワップ領域を作成
mkswap /dev/zram0
# 優先度100でスワップを有効化
swapon /dev/zram0 -p 100

通常、これを /etc/systemd/system/zram.servicesystemd ユニットとして組み込みます。再起動後も設定を永続化させる、最も軽量な方法です。

最終チューニング:Swappinessの秘密

標準的なLinuxのアドバイスでは、低速なディスクへのアクセスを避けるために vm.swappiness を低く保つように言われます。しかしzRAMの場合、その逆が理想的です。スワップが高速でメモリ内にあるため、カーネルができるだけ早くアイドル状態のバックグラウンドタスクを圧縮に回すようにしたいのです。これにより、アクティブなウィンドウやフォアグラウンドのプロセスに使用できる「未圧縮」のRAMがより多く確保されます。

# 積極的な圧縮を行うためにswappinessを100に設定
echo "vm.swappiness=100" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p

スワップを低速な緊急時の避難先ではなく、アクティブなメモリ圧縮として扱うことで、Linuxシステムが高負荷を処理する際の動作が即座に改善されることに気づくでしょう。わずか5分の作業で、非常に高い投資対効果(ROI)が得られるパフォーマンス調整の1つです。

Share: