Docker 컨테이너의 런타임 성능 비용을 포괄적으로 이해하고 싶습니다. 나는 네트워킹이 일관되게 ~ 100µs 더 느리다 는 것을 발견했다 .
또한 런타임 비용에 대한 언급이 “무시할 수 있고” “제로에 가깝다”는 것을 발견했지만 그 비용이 무엇인지 더 정확하게 알고 싶습니다. 이상적으로 Docker가 성능 비용으로 추상화하고 성능 비용없이 추상화되는 것을 알고 싶습니다. 네트워킹, CPU, 메모리 등
또한 추상화 비용이있는 경우 추상화 비용을 해결할 수있는 방법이 있습니다. 예를 들어, Docker에서 디스크를 직접 또는 실제로 마운트 할 수 있습니다.
답변
Felter et al.의 “2014 IBM 연구 논문“ 가상 머신 및 Linux 컨테이너의 업데이트 된 성능 비교 ”. 베어 메탈, KVM 및 Docker 컨테이너를 비교합니다. 일반적인 결과는 다음과 같습니다 도커는 기본 성능과 거의 동일하며 빠른 KVM에 비해 모든 카테고리한다.
이에 대한 예외는 Docker의 NAT입니다. 포트 매핑 (예 :)을 사용하는 경우 docker run -p 8080:8080
아래와 같이 약간의 대기 시간이 발생할 수 있습니다. 그러나 이제 docker run --net=host
Docker 컨테이너를 시작할 때 호스트 네트워크 스택 (예 :)을 사용할 수 있습니다.이 컨테이너는 기본 열과 동일하게 수행됩니다 (아래 Redis 대기 시간 결과에 표시됨).
또한 Redis와 같은 몇 가지 특정 서비스에서 대기 시간 테스트를 실행했습니다. 20 개가 넘는 클라이언트 스레드에서 대기 시간이 가장 높은 오버 헤드는 Docker NAT로, KVM은 Docker 호스트 / 네이티브 사이의 긴밀한 연결입니다.
정말 유용한 종이이기 때문에 다른 그림이 있습니다. 전체 액세스 권한을 얻으려면 다운로드하십시오.
디스크 I / O 살펴보기 :
이제 CPU 오버 헤드를보고 있습니다 :
이제 메모리의 몇 가지 예 (자세한 내용은 논문을 읽으십시오. 메모리는 매우 까다로울 수 있습니다) :
답변
Docker는 가상화가 아닙니다. 대신 다른 프로세스 네임 스페이스, 장치 네임 스페이스 등에 대한 커널 지원의 추상화입니다. 무슨 일이 실제로 부두 노동자가 성능에 미치는 영향이 실제로 무엇의 문제가 수 있도록 하나의 네임 스페이스는 본질적으로 더 비싸거나 다른 것보다 비효율적없는 에서 이 네임 스페이스.
컨테이너의 네임 스페이스를 구성하는 방법에 대한 Docker의 선택에는 비용이 있지만 이러한 비용은 모두 이점과 직접 관련이 있습니다.
- 계층화 된 파일 시스템은 비싸다-정확히 비용이 각각마다 다르고 (Docker는 여러 백엔드를 지원함) 사용 패턴 (여러 큰 디렉토리를 병합하거나 매우 깊은 파일 시스템을 병합하는 것이 특히 비쌉니다)에 따라 다릅니다. 무료가 아닙니다. 다른 한편으로, 다른 Docker의 기능 (기타 복사 방식으로 게스트를 구축하고 스토리지 이점을 암시 적으로 얻을 수 있음)은이 비용을 지불합니다.
- DNAT는 규모가 비싸지 만 호스트와 독립적으로 게스트의 네트워킹을 구성 할 수 있으며 원하는 포트 만 전달할 수있는 편리한 인터페이스를 제공합니다. 이것을 물리적 인터페이스에 대한 브리지로 대체 할 수 있지만 다시는 이점을 잃게됩니다.
- 호스트의 배포판, libc 및 기타 라이브러리 버전과 상관없이 가장 편리한 방식으로 종속성이 설치된 각 소프트웨어 스택을 실행할 수 있다는 것은 큰 이점이지만 공유 라이브러리를 두 번 이상로드해야합니다 (버전이 다) 예상 비용이 있습니다.
기타 등등. 네트워크 액세스 패턴, 메모리 제한 등 환경에서 이러한 비용이 실제로 사용자에게 미치는 영향은 일반적인 대답을 제공하기 어려운 항목입니다.
답변
다음은 Twemperf 벤치 마크 도구 https://github.com/twitter/twemperf 와 5000 개의 연결 및 20k의 연결 속도를 사용 하는 것과 비교 하여 더 많은 벤치 마크 입니다.Docker based memcached server
host native memcached server
도커 기반 memcached의 연결 시간 오버 헤드는 기본 속도의 약 두 배로 상기 백서와 일치하는 것으로 보입니다.
Twemperf Docker Memcached
Connection rate: 9817.9 conn/s
Connection time [ms]: avg 341.1 min 73.7 max 396.2 stddev 52.11
Connect time [ms]: avg 55.0 min 1.1 max 103.1 stddev 28.14
Request rate: 83942.7 req/s (0.0 ms/req)
Request size [B]: avg 129.0 min 129.0 max 129.0 stddev 0.00
Response rate: 83942.7 rsp/s (0.0 ms/rsp)
Response size [B]: avg 8.0 min 8.0 max 8.0 stddev 0.00
Response time [ms]: avg 28.6 min 1.2 max 65.0 stddev 0.01
Response time [ms]: p25 24.0 p50 27.0 p75 29.0
Response time [ms]: p95 58.0 p99 62.0 p999 65.0
Twemperf Centmin Mod Memcached
Connection rate: 11419.3 conn/s
Connection time [ms]: avg 200.5 min 0.6 max 263.2 stddev 73.85
Connect time [ms]: avg 26.2 min 0.0 max 53.5 stddev 14.59
Request rate: 114192.6 req/s (0.0 ms/req)
Request size [B]: avg 129.0 min 129.0 max 129.0 stddev 0.00
Response rate: 114192.6 rsp/s (0.0 ms/rsp)
Response size [B]: avg 8.0 min 8.0 max 8.0 stddev 0.00
Response time [ms]: avg 17.4 min 0.0 max 28.8 stddev 0.01
Response time [ms]: p25 12.0 p50 20.0 p75 23.0
Response time [ms]: p95 28.0 p99 28.0 p999 29.0
다음의 memtier 벤치 마크 도구를 사용하여 bencmarks
memtier_benchmark docker Memcached
4 Threads
50 Connections per thread
10000 Requests per thread
Type Ops/sec Hits/sec Misses/sec Latency KB/sec
------------------------------------------------------------------------
Sets 16821.99 --- --- 1.12600 2271.79
Gets 168035.07 159636.00 8399.07 1.12000 23884.00
Totals 184857.06 159636.00 8399.07 1.12100 26155.79
memtier_benchmark Centmin Mod Memcached
4 Threads
50 Connections per thread
10000 Requests per thread
Type Ops/sec Hits/sec Misses/sec Latency KB/sec
------------------------------------------------------------------------
Sets 28468.13 --- --- 0.62300 3844.59
Gets 284368.51 266547.14 17821.36 0.62200 39964.31
Totals 312836.64 266547.14 17821.36 0.62200 43808.90