スワップ領域をまだディスク領域使って作成してます?メモリを使った zram の紹介
はじめに
界隈では AWS re:Invent 2024 でざわつき始めている中、少し Tips 的な内容も投稿していこうかなと思い始めた @___nix___ です。
背景
古くからサーバーを OOM Killer(Out Of Memory Killer) で停止させられないようスワップ領域を作成しておくことで、一時的なメモリ不足を補ってきました。
# スワップ領域作成
dd if=/dev/zero of=/swapfile bs=1M count=4096
chmod 0600 /swapfile
mkswap /swapfile
swapon /swapfile
# 起動時の設定
/etc/fstab
/swapfile none swap sw 0 0
※ちなみにスワップ領域の目安も示されたりしていました。
Red Hat Enterprise Linux
ディスクによるスワップはやはりパフォーマンスに激しく影響が出ることと、特にクラウド環境でスペックが変動できるような環境だと設定変更が面倒だったりもしました。
概要
そこで登場したのがzramです。(以前は compcache と呼ばれていたそうです)
zramは、RAM内に圧縮されたスワップ領域を作成し、ディスクI/Oを削減しながらメモリの使用効率を向上させる技術です。
zramは、従来のスワップファイルとは異なり、メモリ上に圧縮ブロックデバイスを作成します。これにより、高速なデータアクセスが可能となり、ディスクベースのスワップファイルによる遅延を回避できます。また、zramは動的にサイズを調整できるため、一時的なメモリ不足にも柔軟に対応できます。
導入
導入環境
zramは以下のOSとバージョンで利用可能です。
- Ubuntu: 22.04以降
- Amazon Linux: 2023以降
- ...
導入手順
今回は Ubuntu22.04 の手順を紹介します。
# インストール
sudo apt install systemd-zram-generator
# 設定
vi /etc/systemd/zram-generator.conf
## 設定内容
grep -v '#' /etc/systemd/zram-generator.conf
[zram0]
host-memory-limit = none
zram-fraction = 0.5
compression-algorithm = zstd
# デーモン設定
sudo systemctl daemon-reload
sudo systemctl start systemd-zram-setup@zram0.service
# 確認(以下のどれでも確認可能)
zramctl
swapon --show
free -m
設定
設定ファイル zram-generator.conf
zram-generator.confは、zramの設定を行うための主要なファイルです。このファイルでは、zramデバイスのサイズや使用する圧縮アルゴリズムなどを指定します。
Key | Value | Sample |
---|---|---|
host-memory-limit | ホストシステムが持つメモリの最大量を制限します。 | none |
zram-fraction | zramとして割り当てるメモリの割合を設定します。 | 0.5 |
compression-algorithm | 使用する圧縮アルゴリズムを指定します。(後述) | zstd |
圧縮アルゴリズム
zramでは複数の圧縮アルゴリズムが利用可能であり、それぞれに特徴があります。
アルゴリズム | 圧縮率 | 圧縮速度 | 解凍速度 | 特徴 |
---|---|---|---|---|
LZ4 | 低 | 非常に高速 | 非常に高速 | 高速性重視で一般的な用途に適している |
Zstandard (ZSTD) | 中〜高 | 高速 | 高速 | 圧縮率と速度のバランスが良く調整可能 |
ZLIB | 高 | 中 | 中 | 高い圧縮率で互換性が高い |
Snappy | 低 | 高速 | 高速 | Google開発、高速性重視 |
RLE (Run-length encoding) | 可変 | 高速 | 高速 | 連続した同じデータに効果的 |
DEFLATE | 中〜高 | 中 | 高速 | ZLIBの基盤で広く使用されている |
LZW | 中 | 高速 | 高速 | GIFやZIPで使用されており特許切れ |
これらのアルゴリズムから選択する際は、システムの特性や使用状況に応じて最適なものを選ぶことが重要です。例えば、高速性が求められる場合はLZ4やSnappyが適しており、高い圧縮率が必要な場合はZLIBやZstandardが有効です。 このように、zramはメモリ管理の新しいアプローチとして注目されており、その設定や使用する圧縮アルゴリズムによってシステムパフォーマンスを大きく改善することが可能です。
終わりに
マシンリソースを有効に使うというより、私の発想は背景にも書いた通り変更が面倒だから何とかならないかと思い、最近になってスワップについて調査したところ、zram に行き付きました。
やはりITエンジニアは「怠惰を求めて勤勉に行き着く」のだと改めて実感させられました。
一言
最近は kubernetes にもどっぷりなのですが、k8s クラスタではスワップメモリは設定しないことが奨励されているのでこの zram の出番はありませんでした。(残念)
この記事良かったと少しでも思って頂けたら是非 @___nix___ をフォローしてあげてください。或いは記事に対してリアクションをお願い致します。
Discussion