じゃあ、おうちで学べる

思考を呼び覚ます このコードに、君は抗えるか。

Docker で運用している Concourse でDisk 肥大化に向き合う

概要

concourse(コンコース)は「人々が集まる場所」を意味する語である。が、今回はGoで書かれたパイプラインベースのCI/CDツールである Concourse CI - Docs をDocker で 運用していくとDBの領域でもなくDocker が利用している確認して

concourse/concourse: Concourse CI

結論

ちゃんと、ログローテートを確認設定しろ

Concourse CI の特徴

今回の調査と全く関係ないが紹介しておきます。オンプレミスでCI/CD をしなくてはいけない場合には選択肢に入れて欲しい。

  • Configration As Code
  • Fancy Visualization
  • CI Under Source Control
  • Reproducible, Debuggable Builds
  • Rapid Local Iteration
  • Bring Your Own Integrations

詳細はConcourse CI - Docs をご覧ください。。

順を追って調査

df

ディスク容量を調査する際にディスク容量を確認するコマンドがdf コマンドです。

## もしくは -h
# df -h
Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        7.9G     0  7.9G   0% /dev
tmpfs           7.9G     0  7.9G   0% /dev/shm
tmpfs           7.9G  825M  7.1G  11% /run
tmpfs           7.9G     0  7.9G   0% /sys/fs/cgroup
/dev/vda2       493G  349G  124G  74% /
<docker がマウントしている諸情報について>
tmpfs            1639920         0   1639920   0% /run/user/0

docker system df -v

Docker で運用しているので Dockerのディスク使用量を表示するためのコマンドを実行して確認していきますが ディスク容量が大きければ大きいほど遅くなりますね… 500G にもなるとすごく待ちます。この間に自宅で筋トレをするのも良しです。 -v, --verboseフラグを使用して、より詳細な情報を確認できるので確認します

# docker system df -v
Images space usage:
## 各リポジトリ毎に
REPOSITORY            TAG                 IMAGE ID            CREATED             SIZE                SHARED SIZE         UNIQUE SIZE         CONTAINERS
postgres              latest              0f10374e5170        5 weeks ago         313.7MB             0B                  313.7MB             1
concourse/concourse   latest              9782e15793ee        2 months ago        1.106GB             0B                  1.106GB             6
<none>                <none>              73119b8892f9        2 months ago        313.6MB             0B                  313.6MB             0
<none>                <none>              cbcfaf166ff0        4 months ago        1.328GB             0B                  1.328GB             0
hello-world           latest              bf756fb1ae65        5 months ago        13.34kB             0B                  13.34kB             0
<none>                <none>              fce289e99eb9        17 months ago       1.84kB              0B                  1.84kB              1

Containers space usage:

CONTAINER ID        IMAGE                 COMMAND                  LOCAL VOLUMES       SIZE                CREATED             STATUS                    NAMES
f1458d798e41        concourse/concourse   "dumb-init /usr/loca…"   1                   50.5MB              5 weeks ago         Up 5 weeks                concourse-webcl_concourse-worker_1
bafb918fa767        concourse/concourse   "dumb-init /usr/loca…"   1                   0B                  5 weeks ago         Up 5 weeks                concourse-webcl_concourse-web_1
48c81a651930        postgres              "docker-entrypoint.s…"   1                   1.02GB              5 weeks ago         Up 5 weeks                concourse-webcl_concourse-db_1
24cb33d0a09e        fce289e99eb9          "/hello"                 0                   0B                  2 months ago        Exited (0) 2 months ago   condescending_easley

Local Volumes space usage:
## ローカルボリュームの値を確認したが大量に利用しているっぽい
VOLUME NAME                                                        LINKS               SIZE
e324cd339d4e5c3d748fed778cfcca38d7d9269c9789f55ebe0d126e9b42a128   0                   0B
9e793b865f3ff1e1db89bb1ba8cc684bb730568a05e464405b556badfb7e81fa   0                   0B
d691d4f1fe689e829fda14c216c6e3c95121f4b7ed6bed67e81f09ac1eae0476   0                   5.94GB
8429692daf11086edc82453c89b81058a9718d92f5b20333120cf8e4a811d361   0                   0B
3616f3edef4c052f092bf7bd330886de210923bdf2f29fffafa502e230760664   0                   0B
1617996662c81857571c9008da98585b8e0708c4dbee3e90a254a605b5a317dc   0                   21.27GB
efd6d88bdae50083b417b45b992fbbb2aa1d1d7c1ccbca245df24cdb1c77e25e   0                   15.6GB
d2dc3ca0e55084d6c933f91469b4301b92797ed6c31093af7d65042b2e739016   0                   20.76GB
820fbc33c83b33b60c887ce35e6f3a2bcba0e813964db581061a0d3a44586d05   1                   22.82GB
b6b46f33ae5ed7e6711d05dac306a205ceacb48a0175389fdc79fae7a3873606   0                   0B
bc793b26a4b57c3af224c0feaf35b46ba23f5d5eeca8b046087e431e14fc4002   0                   0B
ef6f67921230229a3e9537618458bd2ba1172e4469b14f07808d9e9e95b3d695   0                   0B
d725ca867543018061bfc1ef74aa4e8aa093dd29e85f5ca7c830b3d085815860   1                   0B
1a0da8b3b7079abc3787a80ecc2fc7605373a83d1888015b5f8001df8ea798ee   0                   1.251GB
3dfe43116bcb707314fc130dfff880071fa312c6519594f7d8491cfaedebb599   1                   15.89GB
9616012387a007fb4afe0548ae73bed41b305ed4b9baee1e6f27fbb2791d8701   0                   0B
182ec724a73e5ca07f831e305e26866a0b26f91524c883166bd4c98efd6bf962   1                   19.5GB
c49c716af3d4e268c3c5423eb818488bee54b49c6e0c6b4fa9e12811edd9b877   0                   19.28GB
da7c07c528c373d6cf8eeca9286c51c6987fdff77a11cff91cd0258b8043ab5b   0                   14.98GB
bc40f5e669a61c1e14ecbc1b5a329d6f4123e8ddf8600a418433a03a7b2cbe99   0                   0B
922755e2f81cbf2286c9260ab62b14fe484aaa02da3c2071fefbbe054c8dbe11   0                   0B
12e802ab10c8cc699bed312b43d1940207844feee8d4c07750f010726219731c   0                   0B
673e0726ffcaa62438e01a82caf5c1f2eb9214ed1a3e6227ed466b2d86804b65   1                   18.72GB
7d060345b46b188610504eac2ea0daa5f276173c725e59ad8b75e5d42c113163   0                   5.002GB
b9e5bff774e07586c2e37767ebda1864a9bc3e65b16410b43e19a35b95c5fc9c   0                   0B
c8df02b8b040c58945d6f0501865d870da15d2e133b4815e85801b66113b8457   0                   16.75GB
8e98b00e0c5c53377b242bdab41c23b1167484b72e305eaa82081ff7cc71240d   0                   15.17GB
1edac345b0ab470c61baa83cac9312070822dc376183f9763252325e7963ba22   0                   24.27GB
e77832d02eda5b46dc2157d7aa129507ecadc24517a757633b784b85638f3629   0                   0B
310926e70e69e2287ada3662dd06d19c0226fe41c9214adf0916afd277d17055   0                   2.063GB
42cef833e280cede8f06b025a9cff78fa5dabcb1c3af26cb65fb6376cb6af15c   0                   3.182GB
b9a356a3819ea4111e772b5cb254ed3d9f34d55a4b7d1d239f9746adc0ed7f8f   0                   0B
fdfe034dff841c0f87d485115d387605e09e64f979fc9b4d27e2423947db668f   0                   0B
4e8ccdccbe7275fb1a947e6ad7d56de12df4051c3a5500674787be14d2285516   1                   20.29GB
4ac6c7e566ee3db5e4e27c83db47a7453b3366d50a6ce038b989acd09d9396d5   1                   0B
c121b924db25c699ef749317ac4119a47955e21d1e18e4dcc08558ffc0af3880   0                   20.94GB
9a59ed6a9492d75267546325eaa7903fdf6e315cb84be063fd88a425c9c7d06f   0                   5.859GB
2daa60ac279966ff75941482978060bd8825abd09b277b871d2ba306de9d902f   0                   5.553GB
681663db74130ff8ded59899838e215dbb6f9a82812e8bbf1b36b788aff0ce56   0                   2.763GB
f4caee6a9c9a1ac88970f3067d1f60c607502a43df156dd87ea76b2792edcfb4   0                   0B
<ローカルボリュームの情報>
## $ grep GB v.txt | awk '{s += $3} END {print s}'
### 297.853GB

およそ、297.853GB 使っているがこれの調査は一旦重そうなので午後やる。 他にも30GB を何が容量食ってるんだ?

du -h --max-depth=1 /var/lib/docker/containers//log | sort -n

あ、ログローテートの設定入れるの忘れてるわ 急に思い出した。ディスク容量を調査する際にディレクトリやファイル容量を確認するコマンドがdu コマンドです。

### docker inspect <CONTAINER ID> | grep -i log で行儀よく確認する方法もあると思うが面倒なので一気に表示させる
# du -h --max-depth=1 /var/lib/docker/containers/*/*log | sort -n
4.0K    /var/lib/docker/containers/24cb33d0a09e0cbfc172a0338dbe824157610635d7aff08a917aca9afcaa4c91/24cb33d0a09e0cbfc172a0338dbe824157610635d7aff08a917aca9afcaa4c91-json.log
4.3G    /var/lib/docker/containers/bafb918fa767e291900f0fe8e6d377c45843731c86690112fd0b999a39439682/bafb918fa767e291900f0fe8e6d377c45843731c86690112fd0b999a39439682-json.log
7.2G    /var/lib/docker/containers/9d1d57006f5ec6a197016eedd1f0dbae1dbb927d9ff2073b4678f420e735ccae/9d1d57006f5ec6a197016eedd1f0dbae1dbb927d9ff2073b4678f420e735ccae-json.log
7.2G    /var/lib/docker/containers/a83ad7a3c290f8515869e66db68830a7588bfe7f33a58db4b6cc89db5c6d9be8/a83ad7a3c290f8515869e66db68830a7588bfe7f33a58db4b6cc89db5c6d9be8-json.log
7.2G    /var/lib/docker/containers/b2b93c2943d2f8d1b6caf4f0c7bee64fab027135f6f85aaf73359ac763d13cd9/b2b93c2943d2f8d1b6caf4f0c7bee64fab027135f6f85aaf73359ac763d13cd9-json.log
7.2G    /var/lib/docker/containers/c426d0d17f20ee570cdfe3d77f72b52906114b68b122f0546dae436d40b9ab07/c426d0d17f20ee570cdfe3d77f72b52906114b68b122f0546dae436d40b9ab07-json.log
7.2G    /var/lib/docker/containers/f1458d798e415b2e080288aac07e7390a39b5aba324930f0a5adfbeaa2f7fe80/f1458d798e415b2e080288aac07e7390a39b5aba324930f0a5adfbeaa2f7fe80-json.log
744K    /var/lib/docker/containers/48c81a65193097609550b7ec26685beaf490eeb9a1b0787367edcb5a0b6b9845/48c81a65193097609550b7ec26685beaf490eeb9a1b0787367edcb5a0b6b9845-json.log

Webのアクセスログは必要になることもあるのでとりあえず、concourse-worker のログを削除していきます

# echo '' >  /var/lib/docker/containers/9d1d57006f5ec6a197016eedd1f0dbae1dbb927d9ff2073b4678f420e735ccae/9d1d57006f5ec6a197016eedd1f0dbae1dbb927d9ff2073b4678f420e735ccae-json.log

ディスク確認をしたら、想像以上に減っていて困る。

# df -h
Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        7.9G     0  7.9G   0% /dev
tmpfs           7.9G     0  7.9G   0% /dev/shm
tmpfs           7.9G  825M  7.1G  11% /run
tmpfs           7.9G     0  7.9G   0% /sys/fs/cgroup
/dev/vda2       493G  221G  252G  47% /

ログローテート

デーモン設定ファイル起動時に指定することが出来るが今回は Docker compose docker-compose に下記を追加する

   logging:
     driver: "json-file" # defaults if not specified
     options:
       max-size: "10m"
       max-file: "3"

蛇足

Linuxサーバーで問題が発生した時に繰り出すコマンドはある程度決まっておりこれらで得られる情報から多くの推論を導くことができる。 Linux Performance Analysis in 60,000 Milliseconds では

uptime
dmesg | tail
vmstat 1
mpstat -P ALL 1
pidstat 1
iostat -xz 1
free -m
sar -n DEV 1
sar -n TCP,ETCP 1
top

などを入力することが推奨されておりますがインターネットの猛者は自身のこれらを紹介してくれている。これらのコマンドに対して成熟することは何もデメリットがないので勉強しておいてください。ブログのエントリーで物足りない場合は詳解 システム・パフォーマンス を読むことをおススメします。インフラチームであれば輪読会をしてもいいと思います。