Docker 컨테이너의 런타임 성능 비용은 얼마입니까?


512

Docker 컨테이너의 런타임 성능 비용을 포괄적으로 이해하고 싶습니다. 나는 네트워킹이 일관되게 ~ 100µs 더 느리다 는 것을 발견했다 .

또한 런타임 비용에 대한 언급이 "무시할 수 있고" "제로에 가깝다"는 것을 발견했지만 그 비용이 무엇인지 더 정확하게 알고 싶습니다. 이상적으로 Docker가 성능 비용으로 추상화하고 성능 비용없이 추상화되는 것을 알고 싶습니다. 네트워킹, CPU, 메모리 등

또한 추상화 비용이있는 경우 추상화 비용을 해결할 수있는 방법이 있습니다. 예를 들어, Docker에서 디스크를 직접 또는 실제로 마운트 할 수 있습니다.



1
@ GoloRoden 그 질문은 비슷하지만 정확히 동일하지는 않습니다. "네트워킹이 추가 계층을 통과하고 있습니다"와 같은 이유로 대기 시간 비용을 찾고 있는데 그 대답은 컨테이너 + 앱의 비용을 측정하는 것에 관한 것입니다.
Luke Hoersten

1
알았어 나는 가까운 투표를 철회했다.
Golo Roden

8
그래도 게시하게되어 기쁩니다. 그 질문은 내 검색에 나타나지 않았다. 측정 / 메트릭스 기사는 매우 유용합니다. blog.docker.io/2013/10/gathering-lxc-docker-containers-metrics
Luke Hoersten

1
도커, KVM VM 및 베어 메탈을 비교하여 성능 지표를 알려주는 "Linux 컨테이너-클라우드 용 NextGen 가상화"세션입니다. youtube.com/watch?v=a4oOAVhNLjU
shawmzhu

답변:


449

Felter et al.의 “2014 IBM 연구 논문“ 가상 머신 및 Linux 컨테이너의 업데이트 된 성능 비교 ”. 베어 메탈, KVM 및 Docker 컨테이너를 비교합니다. 일반적인 결과는 다음과 같습니다 도커는 기본 성능과 거의 동일하며 빠른 KVM에 비해 모든 카테고리한다.

이에 대한 예외는 Docker의 NAT입니다. 포트 매핑 (예 :)을 사용하는 경우 docker run -p 8080:8080아래와 같이 약간의 대기 시간이 발생할 수 있습니다. 그러나 이제 docker run --net=hostDocker 컨테이너를 시작할 때 호스트 네트워크 스택 (예 :)을 사용할 수 있습니다.이 컨테이너는 기본 열과 동일하게 수행됩니다 (아래 Redis 대기 시간 결과에 표시됨).

도커 NAT 오버 헤드

또한 Redis와 같은 몇 가지 특정 서비스에서 대기 시간 테스트를 실행했습니다. 20 개가 넘는 클라이언트 스레드에서 대기 시간이 가장 높은 오버 헤드는 Docker NAT로, KVM은 Docker 호스트 / 네이티브 사이의 긴밀한 연결입니다.

도커 Redis 대기 시간 오버 헤드

정말 유용한 종이이기 때문에 다른 그림이 있습니다. 전체 액세스 권한을 얻으려면 다운로드하십시오.

디스크 I / O 살펴보기 :

도커 vs. KVM vs. 네이티브 I / O 성능

이제 CPU 오버 헤드를보고 있습니다 :

도커 CPU 오버 헤드

이제 메모리의 몇 가지 예 (자세한 내용은 논문을 읽으십시오. 메모리는 매우 까다로울 수 있습니다) :

도커 메모리 비교


20
논문에 주어진 linpack 번호는 솔직히 믿기 어렵습니다. (linpack이 방출 한 것임을 믿지 않는 것이 아니라 테스트가 실제로 부동 소수점 성능 만 측정한다는 것은 믿지 않습니다. 수행). KVM의 주요 오버 헤드는 사용자 공간 하드웨어 에뮬레이션 구성 요소 ( CPU 이외의 하드웨어 에만 적용됨 )에 있습니다. 메모리 페이징에 상당한 오버 헤드가 있지만 원시 부동 소수점? 실제로 상황이 어떻게 진행되고 있는지 살펴보고 싶습니다. 아마도 과도한 컨텍스트 전환입니다.
찰스 더피

2
현재 Docker CLI 구문의 수정 : NAT의 경우 --net=host(두 개의 대시) 및 -p 8080:8080(소문자 'p').
bk0

6
인용 된 IBM 문서는 네트워크 IO에 너무 초점이 맞춰져 있습니다. 컨텍스트 스위치는 다루지 않습니다. 우리는 LXC를 살펴 보았고 자발적인 컨텍스트 스위치의 증가로 인해 애플리케이션 처리 성능이 저하되어 빠르게 포기해야했습니다.
Eric

3
또한 파일 시스템 작업에 대해 궁금합니다. 예를 들어 디렉토리 조회는 오버 헤드가 예상되는 곳입니다. 블록 수준의 읽기, 쓰기 및 탐색 (주어진 차트에 중점을 두는) 은 그렇지 않습니다 .
Charles Duffy

12
나는 같은 색조의 차트를 좋아합니다. 너무 쉽게 구별 할 수 있습니다
Viktor Joras

104

Docker는 가상화가 아닙니다. 대신 다른 프로세스 네임 스페이스, 장치 네임 스페이스 등에 대한 커널 지원의 추상화입니다. 무슨 일이 실제로 부두 노동자가 성능에 미치는 영향이 실제로 무엇의 문제가 수 있도록 하나의 네임 스페이스는 본질적으로 더 비싸거나 다른 것보다 비효율적없는 에서 이 네임 스페이스.


컨테이너의 네임 스페이스를 구성하는 방법에 대한 Docker의 선택에는 비용이 있지만 이러한 비용은 모두 이점과 직접 관련이 있습니다.

  • 계층화 된 파일 시스템은 비싸다-정확히 비용이 각각마다 다르고 (Docker는 여러 백엔드를 지원함) 사용 패턴 (여러 큰 디렉토리를 병합하거나 매우 깊은 파일 시스템을 병합하는 것이 특히 비쌉니다)에 따라 다릅니다. 무료가 아닙니다. 다른 한편으로, 다른 Docker의 기능 (기타 복사 방식으로 게스트를 구축하고 스토리지 이점을 암시 적으로 얻을 수 있음)은이 비용을 지불합니다.
  • DNAT는 규모가 비싸지 만 호스트와 독립적으로 게스트의 네트워킹을 구성 할 수 있으며 원하는 포트 만 전달할 수있는 편리한 인터페이스를 제공합니다. 이것을 물리적 인터페이스에 대한 브리지로 대체 할 수 있지만 다시는 이점을 잃게됩니다.
  • 호스트의 배포판, libc 및 기타 라이브러리 버전과 상관없이 가장 편리한 방식으로 종속성이 설치된 각 소프트웨어 스택을 실행할 수 있다는 것은 큰 이점이지만 공유 라이브러리를 두 번 이상로드해야합니다 (버전이 다) 예상 비용이 있습니다.

기타 등등. 네트워크 액세스 패턴, 메모리 제한 등 환경에서 이러한 비용이 실제로 사용자에게 미치는 영향은 일반적인 대답을 제공하기 어려운 항목입니다.


2
이것은 좋은 대답이지만 더 구체적인 숫자와 벤치 마크를 찾고 있습니다. 나는 cgroups의 비용에 익숙하지만 Docker는 당신이 지적한 것 이상입니다. 답변 주셔서 감사합니다.
Luke Hoersten

6
확실한. 내 요점은 당신이 발견 한 일반화 된 벤치 마크는 특정 응용 프로그램에 적용하기가 매우 제한적이라고 생각합니다.
Charles Duffy

1
이런 식으로 KVM은 "가상화가 아니라 x86 가상 기술 호출 위에 추상화 된 것"이라고 말할 수 있습니다.
Vad

10
@Vad는 하드웨어 계층에서 직접 추상화를 제공하는 것이 명백한 가상화라는 수십 년 전 (IBM의 초기 비 x86 하드웨어 구현으로) 합의 된 합의가 있습니다. 커널 수준의 네임 스페이스 관련 용어에 대한 합의는 훨씬 더 세분화되어 있습니다. 각각의 관점을 선호하는 소스를 가리킬 수는 있지만 솔직히 말해서 단일 용어로 이동하면 유용한 기술적 차이점 (보안 및 성능 특성을 둘러싼)이 있습니다. 따라서 업계의 합의에 도달 할 때까지는 제 입장을 유지하고 있습니다.
Charles Duffy

@LukeHoersten, ... 맞습니다. 비용이 많이 드는 cgroup은 아니며, 네트워크 및 파일 시스템 네임 스페이스의 내용보다 훨씬 더 많습니다. 그러나 이러한 비용은 거의 전적으로 Docker가 구성된 방식, 즉 사용중인 특정 백엔드에 달려 있습니다. 예를 들어 브리징은 Docker의 기본 NAT보다 훨씬 저렴합니다. 또한 다양한 파일 시스템 백엔드의 성능 오버 헤드도 크게 다릅니다 (일부 경우 오버 헤드의 양은 사용 패턴에 따라 다릅니다.
Charles Duffy

20

다음은 Twemperf 벤치 마크 도구 https://github.com/twitter/twemperf 와 5000 개의 연결 및 20k의 연결 속도를 사용 하는 것과 비교 하여 더 많은 벤치 마크 입니다.Docker based memcached serverhost 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

1
그들은 두 개의 서로 다른 memcached 빌드를 비교하고 도커 외부의 도커에있는 하나도 그렇지 않습니까?
san

4
이 결과는 docker의 호스트 네트워킹 또는 브리지 네트워킹에서 발생합니까?
akaHuman

13
같은 큰 stddevs으로 이러한 측정은 표현 가능한 데이터를 표시하지 않습니다avg 200.5 min 0.6 max 263.2 stddev 73.85
세르게이 주코프
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.