みなさん、お部屋の掃除していますか
システムエンジニアになると「ハウスキープ」って用語が良く出てきます
新しいシステム開発をする場合、マスタやトランザクションの初期件数と増加傾向見込みから
必要とされるリソースの見積をすることが多かったりしますよね。
まずはシステムは動かすのが最優先、ひとまず何かしら動けばいいとか思っていませんか。
それは駄目。
世の中スピード命。そう。時間と戦いましょう。最後の日まで残り時間はあと少しです。
時間の経過とともに成長して太る(表現
マスタデータやトランザクションはDBやらs3やらに格納することは多いと思います。
日に日にデータ量が増加すると売り上げ拡大に繋がることが実感して嬉しいものの
画面の描画がやけに遅くなったりして不平不満が増える時期かも。
postgreSQLなら顕著に問題が出るので vacuum full とか実行したくなったり
pg_repack とか実行したくなったりしますよね。
Oracle なら想定外の性能劣化を避けたいので統計情報固定化したくなったり
統計情報によらず性能維持したいからヒント句を書いたりしたいかも
mySQL はあまり何もしないかと思ったら、やっぱり Oracle みたいなヒント句だらけ。
とはいえ。 DB は他に譲るとして今日はデータファイル自体が一杯になったお話です。
某システムのディスク容量が突然 90%を超過。夜中に電話でたたき起こされる罠。
ディスクの空き具合とは。
ひとまず端末に接続はできたので容量を確認。
yamada% df -u
Filesystem Size Used Avail Use% Mounted on
/dev/xvdf 250G 225G 25G 91% /data
うむむ。残り10%を切ってはいるけど25GBもあるなら 急がなくていいんじゃね。
たぶん監視レベル間違い。アラートの前に警告とかないのか、とか気になりつつ。
ひとまず容量を占有するホルダを探すことに。適当に awk とか。
yamada% du -h | awk '{if($1 ~ /G/){print $0}}' | sort -n -r | head -n 5
180G /data/path/to/campaigns
20G /data/path/to/work
6.8G /data/path/to/logs
1.3G /data/path/to/customers
1.2G /data/path/to/shell
どうしたキャンペーンホルダ。何故 180G。何をキャンペーンしている。
yamada% cd /data/path/to/campaigns
yamada% ls -lt | wc -l
bash: /bin/ls: Argument list too long
yamada% find . -name '*' -type f -ls | wc -l
bash: /bin/find: Argument list too long
ひとまず数を調べようとしたらエラー吐いて落ちるw
too long ってなんだ。
yamada% ls -lt | tail -5
-rw-rw-rw- 1 root root 10485763 Apr 9 2017 テストプロモーションキャンペーン(第一弾).log.1
drwxr-xr-x 2 root root 6 Mar 31 2017 log
-rw-rw-rw- 1 root root 1515 Mar 31 2017 テストプロモーションキャンペーン(第二弾).log
-rw-rw-rw- 1 root root 3933 Mar 29 2017 suzuki.zip
-rw-rw-rw- 1 root root 5548 Mar 28 2017 22898.stack
それはそれとして 2017年から古いファイルが沢山残っていること確認。
ていうかファイル名が日本語。なんだこれ。
ファイル名にかっことかつけた奴でてこい。
鈴木さん zip とかいらないし。自分の名前でなくてよかった。
もしや(略
ハウスキープのコツは「そのファイルを手につかんで、ときめくか」。
ときめかない(断言)
ひとまず日付を指定して圧縮。
「削除していいかどうか分からない」と鈴木さんがあなたの心に語り掛ける。
# 件数の確認
yamada% find . -name '*' -newermt '2017/01/01' ! -newermt '2018/01/01' -type f | wc -l
1212
# 圧縮を実行
yamada% find . -name '*' -newermt '2017/01/01' ! -newermt '2018/01/01' -type f | xargs gzip
gzip: ./鈴木-1948-01-31: No such file or directory
gzip: プロモーション.txt: No such file or directory
;
(大量に同件が発生)
むむ。エラーが出た。ファイルを探してみると
yamada% ls -lt 鈴木-1948-01-31*
total 1515
-rw-rw-rw- 1 root root 1515 Mar 31 2017 鈴木-1948-01-31 プロモーション.txt
何故ファイル名に空白をいれるのだ、鈴木さん。
find の結果が2個のファイルと勘違いされた模様。
ただし諦めない。
こんな対策をすれば解決。
# ファイル名に特殊記号を含む場合は -print0 を指定。xargs には -0 を指定。
yamada% find . -name '*' -newermt '2017/01/01' ! -newermt '2018/01/01' -type f -print0 | xargs -0 gzip
# 同じホルダにまとめて移動したい場合は mv に -t を指定
yamada% find . '*.gz' -type f -print0 | xargs -0 mv -t /data/work/backup/
いつも心に太陽を。
夏休みなのにハウスキープをして少し大人になったからOK。
※ただし二度と電話してくるなw