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.