Docker застрял на клонировании zfs

Вопрос или проблема

У меня есть /var/lib/docker на наборе данных zfs, и docker создает много устаревших наборов данных.
Теперь, когда я пытаюсь запустить любое приложение в docker, оно застревает на создании клонов zfs.
На iostat диск не имеет нагрузки (другие наборы данных на том же диске работают идеально).
Я использую последнюю версию zfs на ubuntu-server 24.04

Процессы:

root      523546  0.0  0.0  12864  5760 ?        S    05:31   0:00 zfs clone -p -o mountpoint=legacy docker/56ce854c8077f1b78bc27a72301c351a3377ef93b26c272b8729ade53c2ad9e3@571988438 docker/f42fd5e6ca61cf0021d93de60d18c6048145a22807a7136254336ce58487f3e0-init
root      523653  0.0  0.0  12864  5760 ?        S    05:31   0:00 zfs clone -p -o mountpoint=legacy docker/fafbcb1906102218b051c28d9ab9bcb4979673b50c7c26c2586eb1cfa3b1b6af@658347981 docker/c3c033bd2555c37f6f365b2c9068fda4a113a1edd2a228642ce9185c485dd935
root      524165  0.0  0.0  12864  5760 ?        S    05:32   0:00 zfs clone -p -o mountpoint=legacy docker/0ca7a7988df48f81c04a96c2e763f61257ad7d6903fb448f1645e7ad4e235a91@698585 docker/d684a83efe44309321e389f8621724e800befbbe4c5d53f703ae6982883afee8
root      530363  0.0  0.0  12864  5760 ?        S    05:36   0:00 zfs clone -p -o mountpoint=legacy docker/y2z2uh4qyplkoe6sxadwoe831@843581816 docker/f4f4f2bd9ffdd4cc5dc945ed7ab90f72309fef614a922087ca25393e130f97a4-init

На наборе данных docker у меня их много (около 1700 после docker system prune -a):

docker/0e17e764543d4e6550f73800f2b25f3fa8aa9e8bcbb08d07d9486997ca916a58        381K   115G   229M  legacy
docker/0e450f6ad01e0bebd1d0ecb8a065dd76ebf37bdf389daa834b496a3babf66c4c       60.5K   115G  43.7M  legacy
docker/0e807120a17af013fdfbdf88a1d28219076ae598b7fd056b6edf5cd8df46dab0         34K   115G  5.96M  legacy
docker/0ea5b851be8e8cfca8d42086d8cf23ef643c1ee000553d2cee9861f2754b66cd-init    42K   115G  18.0M  legacy
docker/0eb9c4b47bc2f522f889ebcd25a073958ffda0ee9219f2163823be7235d54529        152K   115G   992K  legacy
docker/0f69d8c78c76a17910efa648d93d59c431b9d59d9231247ecfa2cf61e5bc02e3         88K   115G   244M  legacy
docker/0f8ec22be3b285eddfdc0f772ab9e13e8fbe7c2c478e4b6c2b6d0c28b39db3c6         64K   115G   147M  legacy
docker/0fb7867f6d678525aae455263388a3af4a433638628edd68bee83816c7253a5c       35.8M   115G  67.9M  legacy
docker/0fbb32a8713abead800a2934b136ee6a3bbe22f9ec41e0d0381bd6215df816fd       28.5K   115G  11.3M  legacy
docker/0fdfe17ef326fa3c580c8ca0afa855961d2b0f437afcccb4a1944188df6ef310       92.5K   115G   516M  legacy
docker/0m2m58tuu9kp0kc30y4cxnmli                                                78K   115G  70.3M  legacy
docker/1016063724ddd47f666941b9692a499f3e69e7348aad2d3bde9669f7c010a70b       34.2M   115G  38.7M  legacy
docker/104ab2c068c0d0e18f1b7fce8e0a415fb0f95ee193a0a2bdd7f0f78701786205-init    74K   115G   658M  legacy
docker/1053dff916ce902c1aed35c3903fdcbebcd25919608303ab4ee51f85221068e3       11.8M   115G   145M  legacy
docker/10ace538d545e152cf5bdcef21ec9fc1e6bdd72028395fbaa7a3be2e6845b064-init    77K   115G   360M  legacy
docker/10c989bf001a2e64f2fed522d4bef7ccfbf29254e91b19e68547340afcf478ee       32.8M   115G  32.8M  legacy
docker/11041c719f63c0bf9bb309e189b471892e0accd550aea1b169adbf5f429e857b-init    56K   115G  42.4M  legacy
docker/113xgujmvfenlx64f5np7xbst                                              16.6M   115G  70.3M  legacy
docker/11405fa928d1834df75d35ac31dac8ce4141ce9447c575783627e520d97ba573       55.5K   115G  69.8M  legacy
docker/1143eb99a3c1de5b07fd134f6678f43467800b11d735472f04b3e06fa10f5d88        107M   115G   153M  legacy
docker/114a0edcfdabec21ae0430a58859e9deabd54f2a62a90bce78aa64421e0655f8-init    72K   115G   658M  legacy
docker/118cdcebf5c2076be9b0ed71524a4e711c19fb2bc226e51fd0b064298d496902         94K   115G   347M  legacy
docker/11a84d6e76f3bf2b227396630bc894bbb3e299acb1be97433ce368d5cd099091       54.5K   115G   110M  legacy
docker/11b54b5f71d55af8d356228d3eceefacd9c8b8eaff8885ae9204810ef00a2a17       10.6M   115G   262M  legacy
docker/11c5caca25660dac18e2999b4fd8b1677b912a4bc6a1943eeac5d6eb882b9aae        550M   115G   582M  legacy
docker/11f589c1af241fbb5ed62d1a4c0abab0d412100431e13048a47e43402e712266       75.5K   115G   155M  legacy
docker/11fb2d38e33340679e98cbbabf0931c04c92a91bca3e129f590ac1b709fa0b6b-init   137K   115G   954M  legacy
docker/121a4ec3dbd6fb2c229aa30bc19f33b13949e3ec650d3836cb4e8a3c2bf87c93       30.8M   115G   197M  legacy
docker/12369ec72dc466014b519fa4b01e189f12081103c9ab95783ab0c75c4474f427         32K   115G  20.8M  legacy
docker/12a70f4dd42f6b284a033f4c6b49b702d55168bd3eed81ae9c407fa3f2e37813-init    42K   115G  18.0M  legacy
docker/12dd5e6e8876605a0034d55e9456c2b5a2bcff7594f36587f915f02033775dc1       2.84M   115G  2.84M  legacy
docker/12m8jw958owy0ryhhsfxpbppo                                               122K   115G   546M  legacy
docker/13037315f9620c064ef2c37eaa3596fb5fc7162048d93733f136400412f11e84        216M   115G   329M  legacy
docker/131f6a656c912654b88203d2b6d628a4e29226cba41eea18fb5f8da34f585b26-init    56K   115G  56.7M  legacy
docker/1322c1d20b0213a03748f421df89a444accbd5745aa205fd88d94b406bb009f8       49.7M   115G  79.7M  legacy
docker/136f8d8134e9e8805dd6fb3ea5970d531ab7ad2e97d0663e8426cede071780ef       88.6M   115G   849M  legacy

Ответ или решение

Причина, по которой Docker сталкивается с проблемой "zfs clone", связана с тем, как Docker интегрируется с файловой системой ZFS, и как это взаимодействие может приводить к затруднениям в работе, особенно при большом количестве данных. Давайте рассмотрим это подробнее, чтобы понять корень проблемы и как ее можно решить.

Теория

Файловая система ZFS известна своими мощными возможностями управления объемами данных, такими как снапшоты и клоны. Использование Docker вместе с ZFS обычно обеспечивает высокую производительность и эффективность за счет возможностей ZFS по управлению контейнерами как клонов снапшотов. Однако, если системы не настроены правильно или объем данных становится чрезмерно большим, могут возникать задержки или зависания, как в вашем случае.

ZFS создает клоны объектов данных, используя базовую архитекуру ведения истории снапшотов. Каждый раз, когда вы запускаете контейнер (создаете новый или запускаете существующий), Docker может создавать клон из своего базового образа, реальзующегося в виде файла ZFS. Если в вашей системе накапливается значительное количество таких клонов (как вы упомянули, около 1700), это может стать причиной задержек из-за высоких требований к ресурсу процессора и памяти для обработки такой нагрузки.

Кроме того, как указано в вашей конфигурации, команда zfs clone -p -o mountpoint=legacy используется для создания клонов. Если процессы создания клонов долго выполняются или тормозят из-за внутреннего конфликта ресурсов или состояния взаимоблокировки, то это может быть той самой причиной проблемы.

Пример

На практике, если /var/lib/docker размещено на ZFS, и используются образы и контейнеры в больших количествах без периодической очистки и оптимизации, накопление лишних снапшотов и клонов может запрашивать значительные ресурсы для управления этими объектами данных. Это может быть аналогично ситуации, когда на вашем сотоянии наблюдается блокировка "zfs clone".

Вот пример возможной организации данных и действий, которые могли бы привести к такой ситуации:

  1. Установка Docker с использованием ZFS для контейнеров.
  2. Запуск и остановка множества контейнеров без очистки и должного управления.
  3. Накопление большого количества ненужных или старых снапшотов.

Применение

Для решения и обхода этой проблемы существует несколько подходов:

  1. Очистка ненужных данных. Хотя уже был использован docker system prune -a, возможно, необходимо более глубокое удаление или управление образами и контейнерами через удаление старых клонов и снапшотов.

  2. Проверка зависимостей ZFS. Убедитесь, что ваша версия ZFS совместима с вашей версией Docker и Ubuntu. В вашем случае вы работаете на Ubuntu Server 24.04, что является довольно новой сборкой, и может потребоваться убедиться, что все обновления ZFS и Docker применены правильно.

  3. Оптимизация ZFS. Обратите внимание на следующие настройки, которые могут быть полезны:

    • Проверьте настройки ZFS, такие как zfs_arc_max, чтобы оценить потребление памяти ZFS.
    • Оптимизируйте периодическое удаление снапшотов, чтобы избежать переполнения и перегрузки системы.
    • Возможное использование другой файловой системы для /var/lib/docker, если на текущей системе ZFS проблема остается нерешенной.
  4. Мониторинг и диагностика. Используйте инструменты мониторинга, такие как zpool status, для получения информации о состоянии ZFS пула, и убеждение в отсутствии аппаратных или программных ошибок.

  5. Альтернативные решения. В случае если проблема сохраняется, стоит рассмотреть возможность использования другой системы COW (Copy-On-Write), чтобы обеспечить более стабильную работу. Например, перейти на overlay2, особенно если ZFS в вашем окружении показывает признаки нестабильности.

Применяя эти стратегии, вы сможете улучшить производительность Docker на ZFS и минимизировать риск остановов или замедлений. Однако, важно также помнить, что каждая ситуация уникальна, и часто эффективное решение заключается в сочетании нескольких методик подхода к оптимизации системных ресурсов и структуры данных.

Оцените материал
Добавить комментарий

Капча загружается...