サーバー‎ > ‎Solaris‎ > ‎

Solaris: swap領域と/tmp(tmpfs)の関係

 
Solarisで「スワップ領域が食い尽くされているのではないか?」という現象に遭遇しました。
Solarisを触るのは久しぶり・・・思い出しながら、調べながら、調査したいと思います。

そもそも、swapサイズと/tmp(tmpfs)を個別に数値としてみることは出来ますが、関係を数値的にどのように見たらよいのかわかりませんでした。
そのswapとtmpfsの数値的な関係を調べたいと思います。

対象のSolarisバージョンは
# uname -a
SunOS <hostname> 5.9 Generic_122300-16 sun4u sparc SUNW,Sun-Fire-V215

SunOS 5.9 なのでSolaris 9ですね。


Swapを/tmp(tmpfs)の関係

Swapに対してはメモリのスワップ領域です。
物理メモリを使いすぎた時に、物理メモリ外に退避するための空間になります。
スワップ領域が少なくなると、当然のようにシステムは動作が鈍くなります。

/tmp に対しては、通常Solarisを標準インストールした場合、/tmpはtmpfsというファイルシステムで作成され、swap領域に作られます。
swap領域とは、仮想メモリ領域なので、メモリ上にファイルシステムが作られているイメージになります。
そのため、Solarisを再起動すると/tmp上にあったファイルが消えてしまいます(メモリは揮発性のため)

/tmpをtmpfsではなくディスク上に作成する方法もあります

つまり標準インストールでは、メモリのswapも/tmpもswap領域を使用しています。


Solarisスワップ領域(swap)の実態は?

swap領域の実態は何でしょうか?
ディスクになります。

# format
Searching for disks...done

AVAILABLE DISK SELECTIONS:
       0. c1t0d0 <LSILOGIC-LogicalVolume-3000 cyl 65533 alt 2 hd 16 sec 136>
          /pci@1e,600000/pci@0/pci@a/pci@0/pci@8/scsi@1/sd@0,0
Specify disk (enter its number): 0
selecting c1t0d0
[disk formatted]
Warning: Current Disk has mounted partitions.


FORMAT MENU:
        disk       - select a disk
        type       - select (define) a disk type
        partition  - select (define) a partition table
        current    - describe the current disk
        format     - format and analyze the disk
        repair     - repair a defective sector
        label      - write label to the disk
        analyze    - surface analysis
        defect     - defect list management
        backup     - search for backup labels
        verify     - read and display labels
        save       - save new disk/partition definitions
        inquiry    - show vendor, product and revision
        volname    - set 8-character volume name
        !<cmd>     - execute <cmd>, then return
        quit
format> verify

Primary label contents:

Volume name = <        >
ascii name  = <LSILOGIC-LogicalVolume-3000 cyl 65533 alt 2 hd 16 sec 136>
pcyl        = 65535
ncyl        = 65533
acyl        =    2
nhead       =   16
nsect       =  136
Part      Tag    Flag     Cylinders         Size            Blocks
  0       root    wm    1928 -  2891        1.00GB    (964/0/0)     2097664
  1       swap    wu       0 -  1927        2.00GB    (1928/0/0)    4195328
  2     backup    wm       0 - 65532       68.00GB    (65533/0/0) 142599808
  3 unassigned    wm       0                0         (0/0/0)             0
  4        var    wm    2892 - 31804       30.00GB    (28913/0/0)  62914688
  5 unassigned    wm   31805 - 51080       20.00GB    (19276/0/0)  41944576
  6        usr    wm   51081 - 60718       10.00GB    (9638/0/0)   20972288
  7       home    wm   60719 - 65532        4.99GB    (4814/0/0)   10475264

format> quit

swap は c1t0d0s1 というディスクスライスが使用されていることがわかります。
今回の場合、2GBです。
このSwap領域2GBを、メモリswapと/tmpが使用しています。


Solarisで/tmp (tmpfs)のディスクサイズ容量

/tmpのディスクサイズ容量を時間差で確認し比較してみよう。

# df -h
ファイルシステム     サイズ 使用済み 使用可能 容量      マウント先
/dev/dsk/c1t0d0s0      992M    95M   837M    11%    /
/dev/dsk/c1t0d0s6      9.8G   1.9G   7.9G    20%    /usr
/proc                    0K     0K     0K     0%    /proc
mnttab                   0K     0K     0K     0%    /etc/mnttab
fd                       0K     0K     0K     0%    /dev/fd
/dev/dsk/c1t0d0s4       30G   3.6G    26G    13%    /var
swap                   863M    16K   863M     1%    /var/run
swap                   938M    75M   863M     8%    /tmp
/dev/dsk/c1t0d0s5       20G   7.7G    12G    40%    /opt
/dev/dsk/c1t0d0s7      4.9G   2.7G   2.1G    57%    /export/home

# df -h
ファイルシステム     サイズ 使用済み 使用可能 容量      マウント先
/dev/dsk/c1t0d0s0      992M    95M   837M    11%    /
/dev/dsk/c1t0d0s6      9.8G   1.9G   7.9G    20%    /usr
/proc                    0K     0K     0K     0%    /proc
mnttab                   0K     0K     0K     0%    /etc/mnttab
fd                       0K     0K     0K     0%    /dev/fd
/dev/dsk/c1t0d0s4       30G   3.6G    26G    13%    /var
swap                   837M    16K   837M     1%    /var/run
swap                   912M    75M   837M     9%    /tmp
/dev/dsk/c1t0d0s5       20G   7.7G    12G    40%    /opt
/dev/dsk/c1t0d0s7      4.9G   2.7G   2.1G    57%    /export/home

swapを利用しているtmpfsの/tmpディスクサイズ容量は、変化することがわかる。
つまり、メモリのswapが関係しているといえる。

Solarisのメモリswapサイズ調査方法

Solarisでメモリスワップサイズの調査方法としては、2つのコマンドオプションがあります。

# swap -l
swap ファイル   デバイス  swaplo ブロック 空き容量
/dev/dsk/c1t0d0s1   32,17     16 4195312 1487392

# swap -s
合計: 1532448k バイト割り当て済み + 434104k 予約済み = 1966552k 使用済み, 886416k 使用可

swapコマンドの-l オプションと-sオプションはどのように違うのでしょうか?

まずは単位です。
swap -l コマンドでは、スワップ空間が 512 バイトのブロック数として表示されます。
swap -s コマンドでは、スワップ空間が 1024 バイトのブロック数として表示されます。

swap -s の「予約済み」+「使用可」の合計がシステム上の合計スワップ空間に等しくなります。
これには、物理メモリーの一部とスワップデバイス (またはファイル) が含まれます。
なので、
swap -l で表示されたブロック数を合計して K バイトに変換すると、結果は「used + available」(swap -s の出力) より小さくなります。
これは、swap -l では、スワップ空間の計算に物理メモリーが算入されないからです。

swap -sの出力は、文章のような計算式になっていますのでご注意ください。


swap -l のブロックサイズを見ますと、
4195312ブロック = $((4195312/2/1024)) = 2048MB = 2GB
c1t0d0s1 のサイズと一致します。


Solaris サイズ指定でテストファイルの作成方法


solaris でサイズを指定してテストファイルを作成するには、mkfile コマンドを利用します。

以下のテストを/tmp (tmpfs)に対してテストファイルを作成し行いました。

# pwd
/tmp

# df -h && swap -l
ファイルシステム     サイズ 使用済み 使用可能 容量      マウント先
/dev/dsk/c1t0d0s0      992M    95M   837M    11%    /
/dev/dsk/c1t0d0s6      9.8G   1.9G   7.9G    20%    /usr
/proc                    0K     0K     0K     0%    /proc
mnttab                   0K     0K     0K     0%    /etc/mnttab
fd                       0K     0K     0K     0%    /dev/fd
/dev/dsk/c1t0d0s4       30G   3.6G    26G    13%    /var
swap                   868M    16K   868M     1%    /var/run
swap                   943M    75M   868M     8%    /tmp
/dev/dsk/c1t0d0s5       20G   7.7G    12G    40%    /opt
/dev/dsk/c1t0d0s7      4.9G   2.7G   2.1G    57%    /export/home
swap ファイル   デバイス  swaplo ブロック 空き容量
/dev/dsk/c1t0d0s1   32,17     16 4195312 1487392


# mkfile 100m 100m.test

# ls -l 100m.test
-rw------T   1 root     other    104857600  6月 30日  16:22 100m.test

# df -h && swap -l
ファイルシステム     サイズ 使用済み 使用可能 容量      マウント先
/dev/dsk/c1t0d0s0      992M    95M   837M    11%    /
/dev/dsk/c1t0d0s6      9.8G   1.9G   7.9G    20%    /usr
/proc                    0K     0K     0K     0%    /proc
mnttab                   0K     0K     0K     0%    /etc/mnttab
fd                       0K     0K     0K     0%    /dev/fd
/dev/dsk/c1t0d0s4       30G   3.6G    26G    13%    /var
swap                   768M    16K   768M     1%    /var/run
swap                   943M   175M   768M    19%    /tmp
/dev/dsk/c1t0d0s5       20G   7.7G    12G    40%    /opt
/dev/dsk/c1t0d0s7      4.9G   2.7G   2.1G    57%    /export/home
swap ファイル   デバイス  swaplo ブロック 空き容量
/dev/dsk/c1t0d0s1   32,17     16 4195312 1487392


# swap -l
swap ファイル   デバイス  swaplo ブロック 空き容量
/dev/dsk/c1t0d0s1   32,17     16 4195312 1487392
# swap -s
合計: 1631400k バイト割り当て済み + 432504k 予約済み = 2063904k 使用済み, 788760k 使用可

# rm 100m.test
rm: 100m.test を消去しますか (yes/no)? y

# swap -s
合計: 1530312k バイト割り当て済み + 432952k 予約済み = 1963264k 使用済み, 889328k 使用可
# swap -l
swap ファイル   デバイス  swaplo ブロック 空き容量
/dev/dsk/c1t0d0s1   32,17     16 4195312 1487392

注目すべきを、赤文字としています。
swap -s では 使用可swapサイズは、/tmp(tmpfs)の使用量も計算に入れた結果で出力されているということです。

以下は、sysstatのsarコマンドを利用しswap領域を確認した例です
# sar -r 1 2

SunOS <hostname> 5.9 Generic_122300-16 sun4u    06/30/2010

16:30:31 freemem freeswap
16:30:32   10194  1755664
16:30:33   10194  1755664

Average    10194  1755664


# mkfile 100m 100m.test

# sar -r 1 2

SunOS <hostname> 5.9 Generic_122300-16 sun4u    06/30/2010

16:30:51 freemem freeswap
16:30:52    3877  1550832
16:30:53    3877  1550832

Average     3877  1550832

# rm 100m.test
rm: 100m.test を消去しますか (yes/no)? y

# sar -r 1 2

SunOS <hostname> 5.9 Generic_122300-16 sun4u    06/30/2010

16:31:03 freemem freeswap
16:31:04   16667  1755552
16:31:05   16667  1755552

Average    16667  1755552

sysstat のsar コマンドも、tmpfsの容量計算をした上での空き領域(freeswap)を示していることがわかります。
freeswapの単位、1ブロックサイズは512バイトとなっています。
1755552 = $((1755552/2/1024)) = 857MB


結論

swap -l 
sar -r
コマンドを使用すれば、メモリのswapとtmpfsの両方で消費された上での純粋空き容量がわかる。


サブページ リスト

作成日:2010/06/30
更新日:2011/08/19
Comments