나는 docker에 약간의 오버헤드가 있다는 것을 알고 있으며 로컬 저장소만큼 빠르기를 원하지 않지만 2초의 오버헤드가 있습니까? 너무한거 같네요... 일단 컨테이너가 실행되고 나면 실행 자체는 똑같은 것 같습니다.
$ time docker-compose run --rm php-cli php -i > /dev/null
docker-compose run --rm php-cli php -i > /dev/null 0,43s user 0,07s system 23% cpu 2,107 total
$ time php -i > /dev/null
php -i > /dev/null 0,04s user 0,01s system 98% cpu 0,050 total
간단한 docker hello-world조차도 적절하다고 생각하는 것보다 더 많은 시간이 걸립니다.
time docker run --rm hello-world > /dev/null
docker run --rm hello-world > /dev/null 0,07s user 0,02s system 9% cpu 0,869 total
명령 추적을 시도했는데 대부분의 시간 동안 wait4에서 멈춥니다(도커 데몬이 응답하기를 기다리는 것 같아요? 저는 전문가가 아니니 수정해 주세요). 도움이 된다면 출력의 일부입니다.https://pastebin.com/pdA63zBi.
이것이 예상된 동작입니까, 아니면 설정에 문제가 있습니까?
편집: 깨끗한 php-cli 이미지의 strace 요약은 다음과 같습니다.
strace -tt -c -f -S time docker run --rm php:7.2-cli php -i > /dev/null
strace: Process 30557 attached
strace: Process 30558 attached
strace: Process 30559 attached
strace: Process 30560 attached
strace: Process 30561 attached
strace: Process 30562 attached
strace: Process 30563 attached
strace: Process 30565 attached
strace: Process 30566 attached
strace: Process 30567 attached
% time seconds usecs/call calls errors syscall
------ ----------- ----------- --------- --------- ----------------
71.53 0.039424 43 919 163 futex
18.01 0.009927 47 211 pselect6
6.56 0.003617 50 73 mmap
1.27 0.000702 5 128 rt_sigaction
0.41 0.000227 2 138 rt_sigprocmask
0.34 0.000188 9 22 sigaltstack
0.34 0.000188 17 11 gettid
0.30 0.000165 14 12 munmap
0.25 0.000138 4 38 mprotect
0.22 0.000124 12 10 clone
0.14 0.000076 76 1 readlinkat
0.11 0.000062 1 87 sched_yield
0.10 0.000053 3 17 openat
0.09 0.000049 1 65 epoll_pwait
0.09 0.000048 4 11 set_robust_list
0.06 0.000032 3 10 epoll_ctl
0.04 0.000024 1 34 10 read
0.04 0.000020 3 6 fcntl
0.03 0.000018 1 20 close
0.02 0.000012 12 1 epoll_create1
0.01 0.000006 3 2 lseek
0.01 0.000004 0 13 fstat
0.01 0.000004 0 48 47 newfstatat
0.01 0.000003 0 7 write
0.00 0.000002 0 5 2 connect
0.00 0.000001 0 5 socket
0.00 0.000001 0 3 getpeername
0.00 0.000001 0 3 setsockopt
0.00 0.000000 0 3 brk
0.00 0.000000 0 2 1 ioctl
0.00 0.000000 0 10 10 access
0.00 0.000000 0 2 getpid
0.00 0.000000 0 1 shutdown
0.00 0.000000 0 3 getsockname
0.00 0.000000 0 1 execve
0.00 0.000000 0 1 getuid
0.00 0.000000 0 1 arch_prctl
0.00 0.000000 0 1 sched_getaffinity
0.00 0.000000 0 1 set_tid_address
0.00 0.000000 0 1 prlimit64
0.00 0.000000 0 1 getrandom
------ ----------- ----------- --------- --------- ----------------
100.00 0.055116 1928 233 total
bash를 실행하고 컨테이너 내부에서 동일한 작업을 수행하면 futex 시스템 호출이 거의 효과가 없습니다. 정상적으로 실행됩니다.
답변1
호스트에서 컨테이너로 명령을 실행하는 것은 docker 데몬에 의해 처리됩니다.
exec -it [image ID] bash
시간을 다시 테스트 하면 다음과 같습니다.
$ docker exec -it php bash
root@0fddab587d30:/# time php -i > /dev/null
real 0m0.029s
user 0m0.011s
sys 0m0.018s
strace
dockerd를 통해 컨테이너로 호스트에서 실행
$ strace -c -f -S name docker run -d --rm php:cli php -i > /dev/null
% time seconds usecs/call calls errors syscall
------ ----------- ----------- --------- --------- ----------------
0.04 0.000073 7 10 10 access
0.01 0.000025 25 1 arch_prctl
0.04 0.000064 21 3 brk
0.21 0.000359 45 8 clone
0.09 0.000158 9 17 close
0.02 0.000036 9 4 2 connect
0.02 0.000027 27 1 epoll_create1
0.04 0.000068 11 6 epoll_ctl
3.97 0.006676 56 120 epoll_wait
0.00 0.000000 0 1 execve
0.03 0.000056 14 4 fcntl
0.05 0.000082 6 13 fstat
72.92 0.122754 128 959 161 futex
0.00 0.000001 1 2 getpeername
0.00 0.000000 0 1 getpid
0.01 0.000022 22 1 getrandom
0.00 0.000000 0 2 getsockname
0.12 0.000199 22 9 gettid
0.00 0.000004 4 1 getuid
0.03 0.000044 22 2 1 ioctl
0.01 0.000011 6 2 lseek
0.78 0.001317 20 67 mmap
0.49 0.000821 24 34 mprotect
0.25 0.000427 39 11 munmap
0.01 0.000013 13 1 open
0.09 0.000154 11 14 openat
0.02 0.000027 27 1 prlimit64
17.57 0.029574 78 381 pselect6
0.10 0.000166 7 23 6 read
0.03 0.000046 46 1 readlinkat
1.50 0.002522 20 128 rt_sigaction
0.74 0.001241 9 132 rt_sigprocmask
0.02 0.000032 32 1 sched_getaffinity
0.30 0.000500 18 28 sched_yield
0.10 0.000175 19 9 set_robust_list
0.01 0.000025 25 1 set_tid_address
0.00 0.000000 0 2 setsockopt
0.19 0.000323 18 18 sigaltstack
0.03 0.000044 11 4 socket
0.13 0.000215 8 28 27 stat
0.03 0.000049 10 5 write
------ ----------- ----------- --------- --------- ----------------
100.00 0.168330 2056 207 total
컨테이너에서 strace를 실행하면 php:cli
더 많은 시스템 호출이 있어도 시간이 크게 줄어듭니다. futex
여기서 시스템 호출에 주목할 가치가 있는 것 같습니다.
$ docker run -it --security-opt seccomp:unconfined php:cli bash
root@3bd1a83a2586:/# apt update && apt install strace
root@3bd1a83a2586:/# strace -c -f -S name php -i > /dev/null
% time seconds usecs/call calls errors syscall
------ ----------- ----------- --------- --------- ----------------
4.38 0.000830 15 55 54 access
0.03 0.000006 6 1 arch_prctl
0.00 0.000000 0 15 brk
2.73 0.000518 8 61 close
0.00 0.000000 0 1 execve
3.74 0.000708 12 61 fstat
0.02 0.000003 0 18 futex
0.00 0.000000 0 1 getcwd
0.00 0.000000 0 2 getdents
0.00 0.000000 0 3 getrandom
0.00 0.000000 0 2 getrlimit
0.00 0.000000 0 1 1 ioctl
0.00 0.000000 0 2 lseek
0.00 0.000000 0 5 1 lstat
0.00 0.000000 0 1 madvise
10.42 0.001974 14 145 mmap
5.06 0.000959 9 108 mprotect
0.24 0.000046 4 13 munmap
10.34 0.001960 28 69 9 open
3.45 0.000654 10 63 read
0.00 0.000000 0 80 rt_sigaction
0.00 0.000000 0 2 rt_sigprocmask
0.00 0.000000 0 1 set_robust_list
0.00 0.000000 0 1 set_tid_address
0.00 0.000000 0 1 socket
0.23 0.000043 7 6 4 stat
0.00 0.000000 0 1 sysinfo
0.00 0.000000 0 1 uname
59.36 0.011250 4 3037 write
------ ----------- ----------- --------- --------- ----------------
100.00 0.018951 3757 69 total