Ubunut の mktemp で tmpfs を使う

Ubunut の mktemp で tmpfs を使う

運用している Ubuntu サーバで一時ファイルの作成、書き込みに非常に時間がかかることが問題になりました。

環境によるとは思いますが、わたしが使っていた Ubuntu では mktemp で使用される領域がストレージでした。使用する領域をメモリに変えることで高速化し、問題が解消されたのでメモです。

調査1:mktemp で使用されるディレクトリの確認 #

mktemp は一時ファイルを、mktemp -d は一時ディレクトリを作成するコマンドです。

このファイルやディレクトリが作られる場所は、環境変数 $TMPDIR が設定されていればそこに。設定されていなければ /tmp ディレクトリに作られます。

use $TMPDIR if set, else /tmp.

https://manpages.ubuntu.com/manpages/questing/en/man1/mktemp.1.html

確認したところ、わたしの Ubuntu 環境では $TMPDIR は設定されていませんでした。

echo $TMPDIR
> (空)

そのため、mktemp 実行時は /tmp に作成されます。

# 一時ファイルを作成
mktemp
> /tmp/tmp.dlkafz34xQ

# 一時ディレクトリを作成
mktemp -d
> /tmp/tmp.weJydXuspG

# 念のため確認
ls -l /tmp/
> -rw------- 1 root  root     0 Feb 24 00:00  tmp.dlkafz34xQ
> drwx------ 2 root  root  4096 Feb 24 00:00  tmp.weJydXuspG/

/tmp に作成されていることがわかります。

調査2:/tmp ディレクトリが使用する領域 #

df -h を実行した結果が以下でした。

df -h
> Filesystem  Size  Used  Avail  Use%  Mounted on
> /dev/root    29G  3.7G    25G   14%  /
> tmpfs        16G     0    16G    0%  /dev/shm
> tmpfs       6.2G  1.1M   6.2G    1%  /run
(省略)

環境によっては /tmp が個別にマウントされていたりするのですが(以下のような結果が表示されない)、わたしの場合は存在しませんでした。

> tmpfs       *     *     *      *     /tmp

わたしの環境の場合 /tmpMounted on: / に含まれているということなります。そのため /tmp の Filesystem は /dev/root ということです。

これはどこかのストレージ上に領域が確保されていることを意味しています。

また /dev/shm などが使っている Filesystem である tmpfs とはメモリ上の領域を意味しています。

tmpfs は、意外と知られていないのですが、コンピュータのメモリに作成できるファイルシステムです。

(中略)

メモリ上に作成するファイルシステムですから、「アクセス速度が非常に速い」というメリットを享受することができます。ストレージにかける負担を減らすこともできますから、一時ファイルなどを置くのに適しています。 一方で、コンピュータの電源を落とすとファイルが消えてしまいますので、その点は十分な注意が必要です。

tmpfs は、ファイルシステムの一種として位置付けられていますので、mount コマンドを利用してマウントすることができます。たとえば、

# mount -t tmpfs -o size=64m /dev/shm /tmp

のようにすると、/tmp ディレクトリが tmpfs を利用してメモリ上に置かれることになります(/dev/shm は tmpfs 専用のマウントポイント、size は最大容量を指定)。

意外と影の薄い tmpfs ですが、使いこなすことができれば非常に便利です。

https://linuc.org/study/knowledge/441/

メモリ上の領域のため、ストレージ上の領域と比較してアクセスが非常に早く行えます。

対応:mktemp で tmpfs 領域にファイルやディレクトリを作成するように変える #

export TMPDIR=/dev/shm で環境変数 $TMPDIR/dev/shm ディレクトリに変えました。ちなみに shm は shared memory の略です。

/dev/shm は tmpfs ですのでメモリ上の領域です。これにより mktemp はメモリ上の領域を使うようになりますので、作成、書き込みが高速になります。