Como posso acelerar: docker run
e docker exec
comandos?
O comando em execução leva 0,02 s de tempo do Usuário ,0,02 s de tempo do sistema (isso seria OK no meu caso), mas cerca de 0,5 S em tempo real cada (Não aceitável).
Por exemplo:
$ time sudo docker run --cap-add SYS_ADMIN -i -t --memory=100000k --memory-swap=100000k -d -w /tmp -v /home/asd:/tmp my_image187d****5037sudo 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
Posso de alguma forma acelerar o processo de execução do contêiner ou pelo menos entender por que esse tempo é desperdiçado?
my_image
é criado a partir de ubuntu
e a imagem construída leva cerca de 800 MB. Mas pelo que verifiquei, não importa muito - reduzir a imagem de tamanho para 200 MB não altera o tempo de execução do comando acima.
O tempo de sobrecarga provavelmente está sendo gasto criando e removendo namespaces. Para descobrir onde o tempo é gasto, você pode executar seu contêiner de maneiras diferentes.
Primeiro, elimine o comando sudo. Login como root, sudo -s
, e executar comandos a partir daí.
Em seguida, tente dividir a execução em etapas de criação e início separadas. Isso permitirá que você saiba se o tempo é gasto criando o contêiner ou executando-o:
$ 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)
Desde que você executa seu recipiente destacado, considere se você pode remover a alocação do tty, e se você precisa o stdin configurado, removendo o -it
:
$ time sudo docker run --cap-add SYS_ADMIN -d \ --memory=100000k --memory-swap=100000k \ -w /tmp -v /home/asd:/tmp my_image
Depois disso, você pode começar a ver quanto tempo é adicionado para criar cada um dos namespaces para coisas como a rede e o pid, desativando-os configurando-os para o namespace do host existente:
$ 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
Do docker, você pode ver as ações que estão sendo executadas com docker events
e verificar o carimbo de data / hora em cada uma das ações.
Por último, tenha em mente que o docker é um aplicativo cliente / servidor, e parte do tempo real pode ser a comunicação de Soquete/rede entre o cliente e o servidor.
Seguindo a resposta de @ BMitch, eu diria que ’ Docker exec` não é lento. É principalmente configuração e limpeza de um contêiner.