運用している Ubuntu サーバで一時ファイルの作成、書き込みに非常に時間がかかることが問題になりました。
環境によるとは思いますが、わたしが使っていた Ubuntu では mktemp で使用される領域がストレージでした。使用する領域をメモリに変えることで高速化し、問題が解消されたのでメモです。
調査1:mktemp で使用されるディレクトリの確認
#
mktemp は一時ファイルを、mktemp -d は一時ディレクトリを作成するコマンドです。
このファイルやディレクトリが作られる場所は、環境変数 $TMPDIR が設定されていればそこに。設定されていなければ /tmp ディレクトリに作られます。
use
$TMPDIRif 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
わたしの環境の場合 /tmp は Mounted 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 ですが、使いこなすことができれば非常に便利です。
メモリ上の領域のため、ストレージ上の領域と比較してアクセスが非常に早く行えます。
対応:mktemp で tmpfs 領域にファイルやディレクトリを作成するように変える
#
export TMPDIR=/dev/shm で環境変数 $TMPDIR を /dev/shm ディレクトリに変えました。ちなみに shm は shared memory の略です。
/dev/shm は tmpfs ですのでメモリ上の領域です。これにより mktemp はメモリ上の領域を使うようになりますので、作成、書き込みが高速になります。