テックブログ

技術ネタ

Swapファイルの作成

お久しぶりです。mnakamuraです。
ブログの担当になったので…今回はSwapについてお話する事にします。

Swap領域といえば、実メモリに空き領域を作る為に使用される、一時的なデータ書き込み場所。

最近のクラウドベンダではトラフィックの増加やディスク/メモリの枯渇に合わせて
サーバのサイズを作成後でも変更する事が容易になりましたが、
それでも一時的にサーバを再起動する必要が生じるケースも多く、
サービスを停止させたくない担当者の皆様からすると、
「本格的なサイズ変更は休日にでもやるとして、今一時的にSwap領域を増やせないかな??」
というシチュエーションもあるかと思います。

今回はパーティションを切らず、一時的なSwapファイルを作成する方法をご紹介。
mnakamuraの検証サーバを利用します。


[root@mnakamuraOS7 ~]# cat /etc/redhat-release
CentOS Linux release 7.3.1611 (Core)

[root@mnakamuraOS7 ~]# df -hT
ファイルシス タイプ サイズ 使用 残り 使用% マウント位置
/dev/mapper/centos-root xfs 18G 2.4G 16G 14% /
devtmpfs devtmpfs 487M 0 487M 0% /dev
tmpfs tmpfs 497M 0 497M 0% /dev/shm
tmpfs tmpfs 497M 51M 447M 11% /run
tmpfs tmpfs 497M 0 497M 0% /sys/fs/cgroup
/dev/sdb xfs 40G 33M 40G 1% /mounttestdir
/dev/sda1 xfs 497M 213M 285M 43% /boot
tmpfs tmpfs 100M 0 100M 0% /run/user/1002

現在のSwap領域はこんな感じです。現在は2047、2GBですね。


[root@mnakamuraOS7 ~]# free -mtl
total used free shared buff/cache available
Mem: 992 370 334 50 288 404
Low: 992 658 334
High: 0 0 0
Swap: 2047 10 2037
Total: 3040 380 2371

特に使用しているわけではありませんが、今回は検証という事でこれを増やしてみましょう。
まずはSwapファイルを置くための/swaptestという領域を作成します。


[root@mnakamuraOS7 ~]# mkdir /swaptest
[root@mnakamuraOS7 ~]# cd /swaptest
[root@mnakamuraOS7 swaptest]# pwd
/swaptest

この領域に1MBのSwapファイルを作成します。
ファイル名は分かりやすく”swap.1Mb”としましょう。
作成にはddコマンドを使用し、ifで入力元、ofで出力先を指定。
/dev/zero領域はUnix系のOSにおけるスペシャルファイルの一つで、
今回中身が空のファイルを作成する時に使用したり出来るのです。
因みにbsは1回に読み書きするブロックサイズ、
countはifからコピーする個数です。

ddコマンドはディスクに関わるコマンドですから、
使い方を誤るとデータが破損する危険性もあるので、くれぐれも慎重に。


[root@mnakamuraOS7 swaptest]# dd if=/dev/zero of=./swap.1Mb bs=64K count=16
16+0 レコード入力
16+0 レコード出力
1048576 バイト (1.0 MB) コピーされました、 0.00203294 秒、 516 MB/秒

[root@mnakamuraOS7 swaptest]# ll
合計 1024
-rw-r--r-- 1 root root 1048576 2月 5 02:40 swap.1Mb

無事にファイルが出来上がりました。
このファイルをmkswapコマンドでSwapファイルとして指定します。
mkswapコマンドはデバイスでもファイルでもSwapとして指定できるのです。


[root@mnakamuraOS7 swaptest]# mkswap ./swap.1Mb
スワップ空間バージョン1を設定します、サイズ = 1020 KiB
ラベルはありません, UUID=85b7aab6-ed81-4e9d-bcec-3522307a7c62

[root@mnakamuraOS7 swaptest]# free -mtl
total used free shared buff/cache available
Mem: 992 370 333 50 288 404
Low: 992 659 333
High: 0 0 0
Swap: 2047 10 2037
Total: 3040 380 2371

さて、Swap領域が出来ましたので、これを有効化します。
有効化にはswaponコマンドを実行します。


[root@mnakamuraOS7 swaptest]# swapon ./swap.1Mb
swapon: /swaptest/swap.1Mb: 安全でない権限 0644 を持ちます。 0600 がお勧めです。

Filename Type Size Used Priority
/dev/dm-1 partition 2097148 10888 -1
/swaptest/swap.1Mb file 1020 0 -2

すると…


[root@mnakamuraOS7 swaptest]# free -mtl
total used free shared buff/cache available
Mem: 992 370 333 50 288 404
Low: 992 659 333
High: 0 0 0
Swap: 2048 10 2038
Total: 3041 380 2372

ごらんの通り、2047から2048にSwapのtotalが増加しました…けれど、分かりづらいですね。
もうちょっと大きいサイズで試してみましょう。今作成したSwapファイルを削除します…


[root@mnakamuraOS7 swaptest]# rm -i swap.1Mb
rm: 通常ファイル `swap.1Mb' を削除しますか? y
rm: `swap.1Mb' を削除できません: 許可されていない操作です

…おや?出来ません。swaponされているので、一度swapoffする必要があるんですね。


[root@mnakamuraOS7 swaptest]# swapoff ./swap.1Mb

[root@mnakamuraOS7 swaptest]# free -mtl
total used free shared buff/cache available
Mem: 992 370 333 50 289 404
Low: 992 659 333
High: 0 0 0
Swap: 2047 10 2037
Total: 3040 380 2370

[root@mnakamuraOS7 swaptest]# rm -i swap.1Mb
rm: 通常ファイル `swap.1Mb' を削除しますか? y

swapoff状態であれば、このように削除可能です。次は100MBでやってみましょう。
bsを100倍にして作成します。


[root@mnakamuraOS7 swaptest]# dd if=/dev/zero of=./swap.100Mb bs=6400K count=16
16+0 レコード入力
16+0 レコード出力
104857600 バイト (105 MB) コピーされました、 0.654169 秒、 160 MB/秒

[root@mnakamuraOS7 swaptest]# ll
合計 102400
-rw-r--r-- 1 root root 104857600 2月 5 02:56 swap.100Mb

因みに、ちゃんとmkswapしてSwapファイルにしないと、
swaponは下記のように読み込み失敗してしまいます。

権限も変更推奨メッセージが出ているので、その通りにしましょう。


[root@mnakamuraOS7 swaptest]# swapon ./swap.100Mb
swapon: /swaptest/swap.100Mb: 安全でない権限 0644 を持ちます。 0600 がお勧めです。
swapon: /swaptest/swap.100Mb: スワップヘッダの読み込みに失敗しました: 無効な引数です

[root@mnakamuraOS7 swaptest]# chmod 600 ./swap.100Mb
[root@mnakamuraOS7 swaptest]# ll
合計 102400
-rw------- 1 root root 104857600 2月 5 02:57 swap.100Mb

では改めて…


[root@mnakamuraOS7 swaptest]# mkswap ./swap.100Mb
スワップ空間バージョン1を設定します、サイズ = 102396 KiB
ラベルはありません, UUID=881d9d52-aec9-4b72-9557-b3f36c434fbf

[root@mnakamuraOS7 swaptest]# swapon ./swap.100Mb

[root@mnakamuraOS7 swaptest]# free -mtl
total used free shared buff/cache available
Mem: 992 370 230 50 391 404
Low: 992 762 230
High: 0 0 0
Swap: 2147 10 2137
Total: 3140 380 2368

Swap領域、増えていますね。
一時的に増やしたいだけならこれだけで問題ありませんが、
サーバが再起動されるとこの作成したSwapファイルは外れてしまいます。
サーバ再起動しても自動的に付いたままにしたければ、/etc/fstabに書き込みましょう。


[root@mnakamuraOS7 swaptest]# cp -ip /etc/fstab{,.$(date +%Y%m%d)}
[root@mnakamuraOS7 swaptest]# ll -A /etc/fstab{,.$(date +%Y%m%d)}
-rw-r--r-- 1 root root 538 6月 8 2017 /etc/fstab
-rw-r--r-- 1 root root 538 6月 8 2017 /etc/fstab.20190205

[root@mnakamuraOS7 swaptest]# echo "/swaptest/swap.100Mb none swap sw 0 0" >> /etc/fstab
[root@mnakamuraOS7 swaptest]# diff /etc/fstab{,.$(date +%Y%m%d)}
13d12
< /swaptest/swap.100Mb none swap sw 0 0

コピーを取った上で、作ったSwapファイルについての設定を追記しました。 サーバを再起動してみましょう。


[root@mnakamuraOS7 swaptest]# reboot

[root@mnakamuraOS7 ~]# uptime
02:17:37 up 1 min, 1 user, load average: 2.01, 0.62, 0.22

[root@mnakamuraOS7 ~]# free -mtl
total used free shared buff/cache available
Mem: 992 191 600 6 201 643
Low: 992 392 600
High: 0 0 0
Swap: 2147 0 2147
Total: 3140 191 2748

再起動後もSwapファイルが有効になっており、領域が増えていますね。 因みに、freeコマンド以外でも、下記のようにSwap領域の状況を確認する事が出来ます。


[root@mnakamuraOS7 ~]# cat /proc/swaps
Filename Type Size Used Priority
/swaptest/swap.100Mb file 102396 0 -1
/dev/dm-1 partition 2097148 0 -2

[root@mnakamuraOS7 ~]# swapon -s
Filename Type Size Used Priority
/swaptest/swap.100Mb file 102396 0 -1
/dev/dm-1 partition 2097148 0 -2

更に、Swapの頻度も調節したい…という時はswappinessの値を調整しましょう。


[root@mnakamuraOS7 ~]# cat /proc/sys/vm/swappiness
60

この値は0~100の間で設定可能です。こちらのパラメータが大きい程、Swapの頻度と量が上がります。 デフォルトでは60ですが、0にしておけば実メモリを使い切るまではSwapしません。

…ディスクやメモリの適切な設定は中々難しいものですが、 運用しながら何とか丁度良い落としどころを見つけられると良いですよね。

さて、長文になってしまいましたので、今回はこのくらいで…また次の記事でお会いしましょう。

実績数30,000件!
サーバーやネットワークなど
ITインフラのことならネットアシストへ、
お気軽にご相談ください