💾

スワップ領域をまだディスク領域使って作成してます?メモリを使った zram の紹介

2024/11/27に公開

はじめに

界隈では 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