ハードディスクの使用率が100%になってしまった

 /export/homeにマウントしたハードディスクが100%の使用率になったというアラートを受けた。

なぜだろう...と調べることに。 

 

色々と調べたあげく、意外な結末が待っていた...。 

 

■ファイル容量の大きいディレクトリを探す 

# cd /export/home

# df -kl .
Filesystem kbytes used avail capacity Mounted on
/dev/md/dsk/d5 141161620 139750004 0 100% /export/home

# du -sk * | sort -rn
66112935 towns4
55445415 u01
8426673 etasftp
6600467 towns14
2363772 u02
...

towns4は、SiteTrackerが稼働しているので確かに巨大になってしまう。

Oracleが入っているu01は、50GBは大きすぎるので調べてみる。

 

■1日以内に更新されたファイルを調べる

急激にハードディスクを圧迫したので、以下の対象のファイルを探す。

・1日以内に更新された。 -mtime -1

・ファイルのみ対象で、ディレクトリは表示しない。 -type f

・まずは、u01ディレクトリのみを対象に探す。 u01

# find u01 -type f -mtime -1 | more
u01/app/oraiwd2/product/10.2.0/dbs/orcl_database_info.txt
u01/app/oraiwd2/product/10.2.0/network/log/listener.log
u01/app/oraiwd2/product/10.2.0/oc4j/j2ee/OC4J_DBConsole_ ...(省略) 

 

更にファイル容量を表示する。

・別のコマンドに引数として渡す。 xargsコマンド 

・ファイル容量を表示する。 ls -lコマンド

# find u01 -type f -mtime -1 | xargs -i ls -l {} | more
-rw-r--r-- 1 oraiwd2 bdjdba 8828 Oct 10 19:26 u01/app/oraiwd2/product/省略
-rw-r----- 1 oraiwd2 bdjdba 4564306 Oct 11 07:07 u01/app/oraiwd2/product/省略
-rw-r----- 1 oraiwd2 bdjdba 18546688 Oct 11 05:04 u01/app/oraiwd2/product/省略

 

ファイル容量の大きい順に表示する。

・5番目のフィールドを対象にソートする。 +4

・大きい順にソートする。 -r (reverse)

・数字として取り扱う。 -n (numeric)

# find u01 -type f -mtime -1 | xargs -i ls -l {} | sort +4 -rn | more 
-rw-r----- 1 oraiwd2 bdjdba 52429312 Oct 11 07:15 u01/oradata/orcl/redo01.log
-rw-r----- 1 oraiwd2 bdjdba 20000197 Oct 10 11:21 u01/app/oraiwd2/省略
-rw-r----- 1 oraiwd2 bdjdba 18546688 Oct 11 05:04 u01/app/oraiwd2/省略

 redo01.logが50MBを使っていた。

 あまりたいした大きさでないので、とにかく容量が大きいものを探すアプローチを次に実行してみた。

 

■ファイル容量が大きいものを調べる

とにかくファイルサイズが大きいものを探す。

今回はファイルサイズが50MBよりも大きいものを検索する。

・ファイルのみを対象にする。 -type f

・50MB以上。 -size +50000k

・対象ディレクトリは、u01とする。 

# find u01 -type f -size +50000k | more
u01/app/oraiwd2/product/10.2.0/assistants/dbca/templates/Seed_Database.dfb
u01/app/oraiwd2/product/10.2.0/bin/oracle
u01/app/oraiwd2/product/10.2.0/instantclient32/libociei.so

 

更にファイル容量を表示する。

・別のコマンドに引数として渡す。 xargsコマンド 

・ファイル容量を表示する。 ls -lコマンド

# find u01 -type f -size +50000k | xargs -i ls -l {} | more 
-rw-r--r-- 1 oraiwd2 bdjdba 94642176 Aug 9 2007 u01/app/oraiwd2/product/略
se.dfb
-rwsr-s--x 1 oraiwd2 bdjdba 135250384 Sep 30 03:30 u01/app/oraiwd2/略
-rw-r----- 1 oraiwd2 bdjdba 70130468 Mar 21 2006 u01/app/oraiwd2/product/略

 

ファイル容量の大きい順に表示する。

・5番目のフィールドを対象にソートする。 +4

・大きい順にソートする。 -r (reverse)

・数字として取り扱う。 -n (numeric)

# find u01 -type f -size +50000k | xargs -i ls -l {} | sort +4 -rn | more
-rwsr-s--x 1 oraiwd2 bdjdba 135250384 Sep 30 03:30 u01/app/oraiwd2/product/略
-rw-r--r-- 1 oraiwd2 bdjdba 133574036 Aug 7 2007 u01/app/oraiwd2/product/略
-rw-r--r-- 1 oraiwd2 bdjdba 94642176 Aug 9 2007 u01/app/oraiwd2/product/略

135MBのOracleそのものと、ライブラリ、Oracleデータ等のファイルで、これといって大きすぎるものが無かった。

ってことは、たいしたサイズではないファイルがたくさん集まって、53GBも容量を使っているということか...。

念のためにもう一度確認してみた。 

 # du -sh u01
53G u01

 

恐るべしOracleの容量。

 

そんなにたくさんのファイルがあるのか?

 

調べてみた。

# find u01 -type f | wc -l
46891

4万6千ファイルか...。

1つのファイルが1MBだったら、46GB。

そんなもんかな...。

 

でも気になるので、全く同じマシンで、同様にインストールしたOracleを調べてみた。

# du -sh u01
13G u01

# find u01 -type f | wc -l
24836

容量が13GBってことは、3〜4倍程度の違い。

ファイル数が2万4千ってことは、2倍程度の違い。 

 

またも違うアプローチをとってみた。

 

■ファイルの数を調べる

大きいファイルが見つからなかったら、ファイルの数がものを言う。

小さいサイズのファイルでもたくさん集まれば、容量を食ってしまう。

 

100%使用率のマシンを調べた。 

# find u01 -type f | wc -l
46891
# find u01 -type f -size +50000k | wc -l
20
# find u01 -type f -size +10000k | wc -l
83
# find u01 -type f -size +1000k | wc -l
26004 

50MB x 20 = 1GB

10MB x 83 = 830MB

1MB x 26004 = 26GB (なんと26GB!) 

 

 

同じ仕様のSolarisで、バックアップ用のマシンを調べた。

# find u01 -type f -size +50000k | wc -l
13
narc01iwd01# find u01 -type f -size +10000k | wc -l
76
narc01iwd01# find u01 -type f -size +1000k | wc -l
5751

50MB x 13 = 650MB (問題マシンと350MBの差)

10MB x 76 = 760MB (問題マシンと70MBの差)

1MB x 5751 = 5GB (なんと21GBの差!)

 

検索した結果が全て同じ容量の50MBだったら、、、

検索した結果が全て同じ容量の10MBだったら、、、

検索した結果が全て同じ容量の1MBだったら、、、

というかなりいい加減な計算だけど、1MB〜10MBのファイルがかなり多く存在していて、それがハードディスクを圧迫しているということが分かった。

 

つまり、Oracleにcoreとか余計なファイルがある訳ではなく、データの追加等によって容量が使われている正常使用と考えた方がよさそう。

 

Oracleは、余計なファイルを消すことが難しいので、ログ解析SiteTrackerで利用しているログファイル等を圧縮してしのぐという結末になった。

 

追加ハードディスクが欲しい。。。

 

なんて考えいた後にメールを見たら、Oracleのエラーがたくさん出てるので見てみろということで調べてみた。

 

■Oracleのエラーファイルを調べる

$ ls $ORACLE_HOME/ホスト名_SID名/system/recv/errors/
A0000000001.err_2008_10_01_06_02_29
A0000000001.err_2008_10_01_08_18_35
A0000000001.err_2008_10_01_09_04_50
(延々と続くので省略)

なんと、25,000以上のエラーファイルが...。

しかも1ファイル2MBなので、合計すると50GB!

 

こいつが原因だったのか...。

 

OracleのSYSMAN processによるものらしい。ウチの会社ではOEM (Oracle Enterprise Manager) によるモニタリングを使わないらしいので、データベースの再作成時に「管理オプション - Enterprise Managerを使用してデータベースを構成」のチェックを外すことにした。