Оптимизло диска
Как посмотреть сколько места осталось?
df
Эта команда показывает сколько места осталось на машинке:
df -h
Filesystem Size Used Avail Use% Mounted on
udev 2.0G 0 2.0G 0% /dev
tmpfs 395M 8.4M 387M 3% /run
/dev/vda2 13G 8.5G 3.8G 70% /
tmpfs 2.0G 0 2.0G 0% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs 2.0G 0 2.0G 0% /sys/fs/cgroup
tmpfs 395M 0 395M 0% /run/user/1000
Видим, что корневая директория (/
) занимает больше всего места. Глянем что там внутри
du
Эта команда показывает сколько места занимает каждая директория внутри директории:
sudo du -h / --max-depth=1
36K /root
4.0K /mnt
1.8G /home
6.2G /var
12M /bin
26M /tmp
8.0K /media
107M /boot
837M /lib
0 /sys
31M /opt
4.0K /lib64
1.6G /usr
16K /lost+found
4.0K /srv
8.5M /run
4.8M /etc
0 /dev
0 /proc
8.5M /sbin
11G /
Видим, что больше всего места занимает директория /var
, заглянем туда:
sudo du -h /var --max-depth=1
1.4M /var/backups
4.0K /var/local
20K /var/tmp
4.0K /var/mail
5.8G /var/lib
180K /var/opt
16K /var/spool
210M /var/cache
137M /var/log
6.2G /var
Видим, что /var/lib
много занимает, залезем еще глубже:
sudo du -h /var/lib --max-depth=1
24K /var/lib/emacsen-common
12K /var/lib/private
288K /var/lib/cloud
5.6G /var/lib/docker
4.0K /var/lib/dhcp
31M /var/lib/dpkg
300K /var/lib/containerd
8.0K /var/lib/ispell
12M /var/lib/mlocate
196M /var/lib/apt
12K /var/lib/AccountsService
12K /var/lib/initramfs-tools
28K /var/lib/pam
544K /var/lib/usbutils
12K /var/lib/locales
96K /var/lib/ucf
296K /var/lib/systemd
16K /var/lib/dictionaries-common
16K /var/lib/polkit-1
12K /var/lib/grub
12K /var/lib/update-manager
5.8G /var/lib
Видим, что Docker много места занимает, ща перейдем к нему, но сначала еще пару слов о частых жирных директориях
/var/log/journal
Я не сохранил лог про эту директорию, но, траст ми, она была жирной. И на стеке есть даже вопрос че эта директория такая жирная, ну и лечется это так:
journalctl --vacuum-size=100M
Так что есть смысл чекнуть эту директорию и почистить ее.
Все, возвращаемся к Докеру
Docker
docker system df
Для Докера есть свой аналог команды, показывающей занятое место:
docker system df -v
Images space usage:
REPOSITORY TAG IMAGE ID CREATED SIZE SHARED SIZE UNIQUE SIZE CONTAINERS
rbcn_legals_server latest 54a550fee267 19 hours ago 1.704GB 0B 1.704GB 1
rbcn_legals_stunnel latest 77785c6d80cd 19 hours ago 158.5MB 0B 158.5MB 1
rbcn_legals_front latest 33938bf871fe 19 hours ago 132.3MB 0B 132.3MB 1
traefik latest 77d3b9e70c48 2 months ago 92.04MB 0B 92.04MB 1
Containers space usage:
CONTAINER ID IMAGE COMMAND LOCAL VOLUMES SIZE CREATED STATUS NAMES
00fc0f3d1fe1 rbcn_legals_front "nginx -g 'daemon of…" 0 2B 19 hours ago Up 19 hours rbcn_legals_front_1
133f5d847aa2 rbcn_legals_server "/bin/sh -c 'poetry …" 0 1.67MB 19 hours ago Up 19 hours rbcn_legals_server_1
f69f214f4961 rbcn_legals_stunnel "/bin/sh -c '/opt/cp…" 0 899B 19 hours ago Up 19 hours rbcn_legals_stunnel_1
355556a13591 traefik "/entrypoint.sh --pr…" 1 0B 2 months ago Up 2 months rbcn_legals_traefik_1
Local Volumes space usage:
VOLUME NAME LINKS SIZE
rbcn_legals_traefik-public-certificates 1 15.96kB
Build cache usage: 0B
CACHE ID CACHE TYPE SIZE CREATED LAST USED USAGE SHARED
У меня здесь все чистенько (хотя серверный имедж жирноват), а у вас может быть нет.
Имеется в виду, то, что у меня всего 4 имеджа и все используются.
А может так, что много имеджей лежит без дела, и они просто занимают место:
docker system df -v
Images space usage:
REPOSITORY TAG IMAGE ID CREATED SIZE SHARED SIZE UNIQUE SIZE CONTAINERS
<none> <none> 797da5dbd450 2 months ago 158.6MB 72.78MB 85.81MB 0
<none> <none> 3b60b43d10d4 2 months ago 158.6MB 72.78MB 85.82MB 0
<none> <none> 2f1e6d19b586 2 months ago 158.6MB 72.78MB 85.81MB 0
<none> <none> ed05c8257097 2 months ago 158.6MB 72.78MB 85.81MB 0
<none> <none> da322046ebd4 3 months ago 1.653GB 1.224GB 428.9MB 0
<none> <none> 446ffe4e6819 3 months ago 1.653GB 1.224GB 428.9MB 0
<none> <none> e54c6911174c 3 months ago 158.6MB 158.6MB 8.502kB 0
<none> <none> 725e316bbe89 3 months ago 1.602GB 1.224GB 377.7MB 0
<none> <none> 96614d543534 3 months ago 158.6MB 158.6MB 8.502kB 0
<none> <none> 0305eeb39a68 3 months ago 1.602GB 1.224GB 377.7MB 0
...
docker system prune
Такое дело тоже нужно подчищать:
docker system prune -a
Эта команда удаляет все неиспользуемые контейнеры и имеджи.
Я прогнал эту команду у себя на ноуте, получил простыню, типа такой:
Deleted Containers:
c9804dc9ae2efff752ce11d9f5399a6c2036cf468e95a5d1f10a88e7355af7bf
bff1fa272c698ebd1cc70d579efc47dd12ae8c67e8c9be5ebd82be69809b8ab6
cdfc012534bb1db0ac67d5a931af308006af852626f49cbf8547835ef08c1035
249d90e26a92138f3db9c946dfcff239fd6225e44ed6ad6591d3ba4c99331074
cd5e984e38e70a4af94a467cce5b473c929f3f7c72125891ae2d662e86d75742
eb81a37a7ca0688faf623b6c8f26f9caf4f3311edf240f2049ce81bea17685c3
4ab0491a9de79c0d9fc7cdc6e38e43c073c983e7dc2a53839e0aa8d63c281c2e
Deleted Images:
deleted: sha256:85813dd6c0a75afb36af44354f6140eb622b6f7ff5f92e116eda147e5ed97226
deleted: sha256:b8086aad339e150fa5e9240ac815677875fc65fb8a3ee5ca7deb8f603e33036d
deleted: sha256:740049f94794d34f88b0fc1c4937be2e8b4a8d6dc1ae8aa3f14aa850fd9f9423
А также приятное сообщение в конце:
Total reclaimed space: 20.05GB
Ну и, соответственно, при каждом деплое такую команду стоит прогонять (с опцией -f
для запуска без запроса
подтверждения)
Оптимизация образов
- Анализировать слои с помощью pycharm
- Анализировать слои с помощью dive
- dive и pycharm отображают вложенные слои, так что стоит начать смотреть на слои после команды FROM из dockerfile
-
dive и pycharm по функционалу одинаковы, однако в dive есть метрика Image efficiency score - если она 99%, то очевидно нечего оптимайзить
-
Если нечего оптимайзить, то стоит обратить внимание на базовые имеджи
- Напр. образ python:3.8 весит почти гиг
- Существуют slim и alpine версии базовых имеджей, которые весят порой на порядок меньше, но с ними нужно аккуратно, тк каких-то зависимостей, которые используются неявно, может не хватать
Еще пара рекомендаций
Юзать CDN
Если в приложении есть функционал загрузки файлов, то лучше хранить файлы в CDN.
CDN - content delivery network - что-то типа хранилище статики (картинок, документов и тд).
Если заливать файлы на CDN, то они не будут занимать место на машинке + не надо будет морочиться с сервом статики. CDN будет эффективно предоставлять доступ к файлам + для любого файла можно сгенерить ссылку на скачивание.
Примеры CDN: Amazon S3 , Yandex Object Storage , Google Cloud Storage
Юзать Docker Registry
- Аналогично тому, что хранить файлы на вмке - не оч - собирать и хранить образы на вмке - тоже идея не оч
- Для хранение Docker образов лучше использовать Docker Registry
- Примеры: Docker Hub , Yandex Container Registry