4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

オンデマンドにswap スペースを確保して利用する(固定サイズのswap 領域を事前に用意して使用しない方法)

Last updated at Posted at 2017-11-15

概要

現代ではPC に十分なメモリが搭載されるのが当たり前となり、swap 領域の必然性が無くなってくる傾向にあります。
また仮にswap 領域を取るにしてもswap 専用の固定サイズのパーティションを作る方式を採用した場合、使われるかもわからない(むしろ使われないようにするほうが望ましい)ものに対して、メモリと同等前後の領域をHDD やSSD に割り当てるのはディスク容量の有効活用の点において嬉しいことではありません。
ここではswapspace を使い、ディスク領域を効率よく使いながら、swap 領域が必要な時のみ必要な量だけオンデマンドにswap ファイルを作成してswap 領域を利用することができる環境の作成を行ってみます。

留意事項

色々と検証した結果、swap ファイルを作成する場所は任意ですが、ext4 でフォーマットされている必要があります。xfs ではだめでした。
また、今回はArch Linux を使いますが他のディストリビューションでもswapspace を使うことで同様のことが実現できるので、試してみてください。

swapspace モジュールのインストール

Arcu Linux ではswapspace はAUR で提供されているのでそちらからインストールします。

AURからswapspaceのインストール
# git clone https://aur.archlinux.org/swapspace.git
# cd swapspace
# makepkg -sri

インストール後はswapspace デーモンを起動して完了です。

swapspaceデーモンの起動
# systemctl restart swapspace
# systemctl enable swapspace

デフォルトではswap 領域が必要になれば/var/lib/swapspace ディレクトリ配下に1, 2, 3, ... とファイルが作成されていきます。

swapspace 設定

/etc/swapspace.conf ファイルを編集することで細かな設定を調整することができます。
基本的にデフォルト値で問題ないようになっているので、特に理由が無い限りは設定変更しなくて問題ありません。

  • パラメータ一覧
変数 説明 初期値
swappath swap ファイルが作成される場所。 /var/lib/swapspace
lower_freelimit メモリの残り領域がこのパーセンテージを下回った場合にswap 領域を作成する。例えばメモリ1000MB ある環境でこの値を20 に設定すると空きメモリ領域が200 MB を下回るとswap 領域が作成されます。 20
upper_freelimit メモリの残り領域がこのパーセンテージを上回った場合、swap 領域を開放しようとします。例えばメモリ1000MB ある環境でこの値を60 に設定すると空きメモリ領域が600 MB を上回るとswap 領域が解放されます。 60
freetarget swap 領域を追加する時のswap 領域の空き領域の目安のパーセンテージ。swap の残り領域がこのパーセンテージを下回った場合にswap 領域を追加します。lower_freelimit とupper_freelimit の間の値に設定する必要があります。 30
min_swapsize swap ファイル1 つあたりのサイズの下限値。 4m
max_swapsize swap ファイル1 つあたりのサイズの上限値。 2t
cooldown ディスクスペースが無くなった時に発生するswap ファイル割当の一時停止時間。もしくはswap ファイルが作成されてから解除されるまでの冷却時間。値は大雑把な秒単位で指定します。不要なswap ファイルはできるだけ早く削除してほしい場合はこの値を小さくします。 600

領域のテスト

下記のプログラムを実行してswap ファイルをテストしてみましょう。

memeater.c
# include <stdlib.h>
# include <stdio.h>
# include <string.h>

int main(int argc, char** argv) {
    int max = -1;
    int mb = 0;
    char* buffer;

    if(argc > 1)
        max = atoi(argv[1]);

    while((buffer=malloc(1024*1024)) != NULL && mb != max) {
        memset(buffer, 0, 1024*1024);
        mb++;
        printf("Allocated %d MB\n", mb);
        sleep(1);
    }
    return 0;
}

ファイルを作成したらコンパイルして実行します。

コンパイル
# gcc filename.c -o memeater

プログラムを実行します。

# ./memeater
-> free コマンドの結果、/var/lib/swapspace ディレクトリ配下を確認してswap されることを確認してください

xfs ファイルシステム上で動作しない件について

swap ファイルの作成場所がxfs ファイルシステム上では失敗する件ですが、xfs ファイルシステム上ではfallocate で作成したファイルをswap ファイルとして利用できない問題と関連しているようです。
以下のコマンドを実行するとext4 ファイルシステム上では成功しますが、xfs ファイルシステム上では失敗します。

fallocateで作成したファイルに対してswapon
# fallocate -l $((1024 * 1024 * 1024 * 4)) /swapfile
# chmod 600 /swapfile
# mkswap /swapfile
# swapon /swapfile
swapon: /swapfile: swapon failed: Invalid argument

上記コマンドでは4G のファイルを作成するコマンドですが、fallocate では事前予約する形でFILE IO を発生させないで4G の未初期化領域として4G を確保し、ファイルの内容をすべて0 埋めするような形式とは異なります。
これがxfs 上でswap ファイルを作成する上で何か問題となっているようです。
xfs では、現段階ではしっかりとファイルの中身を何かしらのデータで埋めてあげたうえでswap ファイルとして使用しないといけないようです。

ddで作成したファイルに対してswapon
# dd if=/dev/zero of=/swapfile bs=1G count=4
# chmod 600 /swapfile
# mkswap /swapfile
# swapon /swapfile

参考

4
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?