Как я могу ускориться: 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
и проверка отметки времени для каждого действия.
Наконец, имейте в виду, что докер - это приложение клиент / сервер, и часть фактического времени может быть связана с сокетом / сетью между клиентом и сервером.