Назад | Перейти на главную страницу

Время запуска Docker

Как я могу ускориться: docker run и docker exec команды?

Выполнение команды занимает 0,02 с пользовательского времени, 0,02 с системного времени (в моем случае это было бы нормально), но около 0,5 с в реальном времени каждое (неприемлемо).

Например:

$ time sudo docker run --cap-add SYS_ADMIN -i -t --memory=100000k --memory-swap=100000k -d -w /tmp -v /home/asd:/tmp my_image
187d****5037
sudo docker run --cap-add SYS_ADMIN -i -t --memory=100000k  -d -w /tmp -v    0,02s user 0,02s system 6% cpu 0,496 total

Можно как-то ускорить процесс запуска контейнера или хотя бы понять, почему это время потрачено зря?

my_image создан из ubuntu а созданный образ занимает около 800 МБ. Но из того, что я проверил, это не имеет большого значения - уменьшение размера изображения до 200 МБ не влияет на время выполнения указанной выше команды.

Накладные расходы, скорее всего, тратятся на создание и удаление пространств имен. Чтобы выяснить, на что тратится время, вы можете запустить свой контейнер по-разному.

Сначала удалите команду sudo. Войдите как root, sudo -s, и запускать команды оттуда.

Затем попробуйте разделить запуск на отдельные этапы создания и запуска. Это позволит вам узнать, потрачено ли время на создание контейнера или его запуск:

$ time docker create --cap-add SYS_ADMIN -itd \
  --memory=100000k --memory-swap=100000k \
  -w /tmp -v /home/asd:/tmp my_image

$ time docker start -ai $(docker ps -ql)

Поскольку вы запускаете свой контейнер отдельно, подумайте, можете ли вы удалить выделение tty, и, если вам нужно настроить stdin, удалив -it:

$ time sudo docker run --cap-add SYS_ADMIN -d \
  --memory=100000k --memory-swap=100000k \
  -w /tmp -v /home/asd:/tmp my_image

После этого вы можете начать смотреть, сколько времени добавлено для создания каждого из пространств имен для таких вещей, как сеть и pid, отключив их, установив их в существующее пространство имен хоста:

$ time sudo docker run --cap-add SYS_ADMIN -itd \
  --net=host --pid=host --uts=host \
  --memory=100000k --memory-swap=100000k \
  -w /tmp -v /home/asd:/tmp my_image

Из докера вы можете просматривать действия, выполняемые с помощью docker events и проверка отметки времени для каждого действия.

Наконец, имейте в виду, что докер - это приложение клиент / сервер, и часть фактического времени может быть связана с сокетом / сетью между клиентом и сервером.