Solarisのtmpfsとスワップ領域について
【解説】
一般的に、スワップ領域はプロセスの確保したデータ、ヒープ、およびスタックセグメントの退避領域として使用されます。また、多くのSolaris解説書にtmpfsの表現がありますが、「一時ファイルシステム」と呼ばれるこの領域が、ほかならぬスワップ領域であることはあまり知られていません。この結果、Solarisでは、スワップ領域は/tmpと同じ領域であり、/tmpをむやみに使用すると、スワップ領域が侵食されてしまいます。プロセスのテキスト領域は、プログラムファイルから読み込むため、スワップ領域は使用されません。
【/tmp領域を大量に使用するとどうなるのか?】
/tmp(tmpfs)を他のUNIXシステムと同じ感覚で使用した場合、往々にして巨大なファイルを割り当ててしまうことがあります。すると、「スワップ空間を拡張することができません」のメッセージが一般ユーザに報告されることになります。【付録】にその現象を再現したログを示します。この結果、一般ユーザのプロセスは全く起動できなくなります。
【対策】
viエディタの一時ファイルは省略時/var/tmpが用いられます。sortコマンドも同様に/var/tmpが省略時の一時ディレクトリになります。一般のコンパイラも、省略時の一時ディレクトリは/var/tmpですので、通常の使用者もこの例に従うべきです。
/tmpは作業領域として使用しない!!
この対策によって、サーバのスワップ問題の一つは確実にクリアされ、安定した動作を得ることが出来ます。
【付録】 巨大ファイルを/tmpに作成した場合に発生する問題
# df -k <CR>
Filesystem | kbytes | used | avail | capacity | Mounted on | |
/dev/dsk/c1t1d0s0 | 6198606 | 2436559 | 3700061 | 40% | / | |
/proc | 0 | 0 | 0 | 0% | /proc | |
fd | 0 | 0 | 0 | 0% | /dev/fd | |
mnttab | 0 | 0 | 0 | 0% | /etc/mnttab | |
swap | 1318328 | 16 | 1318312 | 1% | /var/run | ←空き領域が約1.3ギガバイトあります。 |
swap | 1318368 | 56 | 1318312 | 1% | /tmp | |
/dev/dsk/c1t1d0s3 | 63867324 | 13917241 | 49311410 | 23% | /opt |
# swap -s <CR>
total: 34032k bytes allocated + 6752k reserved = 40784k used, 1320320k available ←df -kとほぼ同じ値です。
# sar -r 1 1 <CR>
SunOS act061 5.8 Generic_108528-14 sun4u 07/12/03
13:50:03 freemem freeswap
13:50:04 111571 2640000 ←sarコマンドの-rオプションで表示されるfreeswapの値は512バイト1ブロックです。
#
ここで巨大ファイル(約850メガバイト)を作成します。
# df -k <CR>
Filesystem | kbytes | used | avail | capacity | Mounted on | |
/dev/dsk/c1t1d0s0 | 6198606 | 2436559 | 3700061 | 40% | / | |
/proc | 0 | 0 | 0 | 0% | /proc | |
fd | 0 | 0 | 0 | 0% | /dev/fd | |
mnttab | 0 | 0 | 0 | 0% | /etc/mnttab | |
swap | 512376 | 16 | 512360 | 1% | /var/run | ←/var/run、/tmp両方とも、空きが減少します。 |
swap | 1311832 | 799472 | 512360 | 61% | /tmp | 空き領域が約512メガバイトになりました。 |
/dev/dsk/c1t1d0s3 | 63867324 | 13917241 | 49311410 | 23% | /opt |
# swap -s <CR>
total: 833472k bytes allocated + 6728k reserved = 840200k used, 514368k available ←df -kとほぼ同じ値です。
# sar -r 1 1 <CR>
SunOS act061 5.8 Generic_108528-14 sun4u 07/12/03
13:52:12 freemem freeswap
13:52:13 10233 1028096 ←sarコマンドの-rオプションで表示されるfreeswapの値は512バイト1ブロックです。
#
巨大ファイルに約250メガバイトを追加します。
# df -k <CR>
Filesystem | kbytes | used | avail | capacity | Mounted on | |
/dev/dsk/c1t1d0s0 | 6198606 | 2436559 | 3700061 | 40% | / | |
/proc | 0 | 0 | 0 | 0% | /proc | |
fd | 0 | 0 | 0 | 0% | /dev/fd | |
mnttab | 0 | 0 | 0 | 0% | /etc/mnttab | |
swap | 65928 | 16 | 65912 | 1% | /var/run | ←/var/run、/tmp両方とも、空きが減少します。 |
swap | 1309504 | 1243592 | 65912 | 95% | /tmp | 空き領域が約66メガバイトになりました。 |
/dev/dsk/c1t1d0s3 | 63867324 | 13917241 | 49311410 | 23% | /opt |
# swap -s <CR>
total: 1277632k bytes allocated + 6688k reserved = 1284320k used, 67920k available ←df -kとほぼ同じ値です。
# sar -r 1 1 <CR>
SunOS act061 5.8 Generic_108528-14 sun4u 07/12/03
13:53:53 freemem freeswap
13:53:54 2915 135184 ←sarコマンドの-rオプションで表示されるfreeswapの値は512バイト1ブロックです。
#
ふたたび別のファイルを追加します。空き領域が無くなったことがメッセージで確認できます。
# cat largefile >> /tmp/bigfile <CR>
cat: write error: No space left on device
# df -k <CR>
Filesystem | kbytes | used | avail | capacity | Mounted on | |
/dev/dsk/c1t1d0s0 | 6198606 | 2436559 | 3700061 | 40% | / | |
/proc | 0 | 0 | 0 | 0% | /proc | |
fd | 0 | 0 | 0 | 0% | /dev/fd | |
mnttab | 0 | 0 | 0 | 0% | /etc/mnttab | |
swap | 16 | 16 | 0 | 100% | /var/run | ←空き領域が0になりました。 |
swap | 1308984 | 1308984 | 0 | 100% | /tmp | |
/dev/dsk/c1t1d0s3 | 63867324 | 13917241 | 49311410 | 23% | /opt |
# swap -s <CR>
total: 1343024k bytes allocated + 6688k reserved = 1349712k used, 1984k available ←swapfs_minfree、またはswapfs_reserveと考えられます。
# sar -r 1 1 <CR>
SunOS act061 5.8 Generic_108528-14 sun4u 07/12/03
13:54:35 freemem freeswap
13:54:36 4776 3328 ←sarコマンドの-rオプションで表示されるfreeswapの値は512バイト1ブロックです。
# sh <CR> ←rootユーザは実行出来ます。
# who <CR>
oracle pts/2 Jul 12 13:31 (---.---.0.7)
oracle pts/3 Jul 12 13:31 (---.---.0.7)
oracle pts/4 Jul 12 13:32 (---.---.0.7)
oracle pts/5 Jul 12 13:32 (---.---.0.7)
# df -k <CR>
Filesystem | kbytes | used | avail | capacity | Mounted on | |
/dev/dsk/c1t1d0s0 | 6198606 | 2436559 | 3700061 | 40% | / | |
/proc | 0 | 0 | 0 | 0% | /proc | |
fd | 0 | 0 | 0 | 0% | /dev/fd | |
mnttab | 0 | 0 | 0 | 0% | /etc/mnttab | |
swap | 16 | 16 | 0 | 100% | /var/run | |
swap | 1308984 | 1308984 | 0 | 100% | /tmp | |
/dev/dsk/c1t1d0s3 | 63867324 | 13917241 | 49311410 | 23% | /opt |
# swap -s <CR>
total: 1343552k bytes allocated + 6848k reserved = 1350400k used, 1152k available
# sar -r 1 1 <CR>
SunOS act061 5.8 Generic_108528-14 sun4u 07/12/03
13:58:42 freemem freeswap
13:58:43 4371 1664 ←sarコマンドの-rオプションで表示されるfreeswapの値は512バイト1ブロックです。
#
この時、プロセスは実行できずエラーになります。/var/adm/messagesに記録されたメッセージは次の通りです。
# tail -5 /var/adm/messages <CR>
Jul 12 13:29:24 act061 genunix: [ID 936769 kern.info] laner0 is /pseudo/laner@0
Jul 12 13:54:13 act061 tmpfs: [ID 518458 kern.warning] WARNING: /tmp: File system full, swap space limit exceeded
Jul 12 13:54:13 act061 last message repeated 1 time
Jul 12 13:54:47 act061 genunix: [ID 470503 kern.warning] WARNING: Sorry, no swap space to grow stack for pid 517 (csh)
Jul 12 13:54:53 act061 genunix: [ID 470503 kern.warning] WARNING: Sorry, no swap space to grow stack for pid 518 (csh)
# cd /tmp <CR>
# ls -l <CR>
total 2617936
-rw-r--r-- | 1 | root | other | 1340342272 | Jul | 12 | 13:54 | bigfile |
srwxrwxrwx | 1 | root | root | 0 | Jul | 12 | 13:28 | jd_sockV6 |
-rw-rw-r-- | 1 | root | sys | 29632 | Jul | 12 | 13:28 | ps_data |
drwx------ | 2 | root | root | 82 | Jul | 12 | 13:28 | smc898 |
# rm bigfile <CR> ←巨大ファイルを削除します。
# df -k <CR>
Filesystem | kbytes | used | avail | capacity | Mounted on | |
/dev/dsk/c1t1d0s0 | 6198606 | 2436559 | 3700061 | 40% | / | |
/proc | 0 | 0 | 0 | 0% | /proc | |
fd | 0 | 0 | 0 | 0% | /dev/fd | |
mnttab | 0 | 0 | 0 | 0% | /etc/mnttab | |
swap | 1306744 | 16 | 1306728 | 1% | /var/run | ←元の空き領域サイズ、約1.3ギガバイトあります。 |
swap | 1306784 | 56 | 1306728 | 1% | /tmp | メデタシ、メデタシ!! |
/dev/dsk/c1t1d0s3 | 63867324 | 13917241 | 49311410 | 23% | /opt |
# swap -s <CR>
total: 34544k bytes allocated + 6928k reserved = 41472k used, 1308736k available ←df -kとほぼ同じ値です。
# sar -r 1 1 <CR>
SunOS act061 5.8 Generic_108528-14 sun4u 07/12/03
13:59:35 freemem freeswap
13:59:36 112275 2590923 ←sarコマンドの-rオプションで表示されるfreeswapの値は512バイト1ブロックです。
# ps <CR>
PID TTY TIME CMD
494 pts/6 0:00 sh
534 pts/6 0:00 ps
#
Copyright (C) 2004 by The Art of Computer Technologies, Corp. All rights reserved.