Chi phí hiệu năng thời gian chạy của một container Docker là gì?


512

Tôi muốn hiểu một cách toàn diện về chi phí hiệu năng thời gian chạy của một container Docker. Tôi đã tìm thấy các tài liệu tham khảo về việc kết nối mạng chậm hơn ~ 100 .

Tôi cũng đã tìm thấy các tài liệu tham khảo về chi phí thời gian chạy là "không đáng kể" và "gần bằng không" nhưng tôi muốn biết chính xác hơn những chi phí đó là gì. Lý tưởng nhất là tôi muốn biết Docker là gì trừu tượng hóa với chi phí hiệu năng và những thứ được trừu tượng hóa mà không có chi phí hiệu suất. Mạng, CPU, bộ nhớ, v.v.

Hơn nữa, nếu có chi phí trừu tượng, có nhiều cách để khắc phục chi phí trừu tượng. Ví dụ, có lẽ tôi có thể gắn đĩa trực tiếp so với hầu như trong Docker.



1
@GoloRoden câu hỏi đó tương tự nhưng không hoàn toàn giống nhau. Tôi đang tìm kiếm chi phí độ trễ với các lý do như "mạng đang được chuyển qua một lớp bổ sung" trong khi câu trả lời được chấp nhận của câu hỏi đó là về việc đo lường chi phí của ứng dụng container +.
Luke Hoersten

1
Được rồi, đúng vậy. Tôi rút lại phiếu bầu gần của mình.
Golo Roden

8
Tôi rất vui vì bạn đã đăng nó mặc dù. Câu hỏi đó đã không xuất hiện trong tìm kiếm của tôi. Bài viết về đo lường / số liệu là siêu hữu ích: blog.docker.io/2013/10/gathering-lxc-docker-containers-metrics
Luke Hoersten

1
Đây là một phiên hay có tiêu đề "Các bộ chứa Linux - Ảo hóa NextGen cho đám mây" cho biết các số liệu hiệu suất bằng cách so sánh docker, KVM VM và kim loại trần: youtube.com/watch?v=a4oOAVhNLjU
Shawmzhu

Câu trả lời:


449

Một bài báo nghiên cứu xuất sắc năm 2014 của IBM Một bản so sánh hiệu năng được cập nhật của các máy ảo và các bộ chứa Linux, bởi Felter et al. cung cấp một so sánh giữa các thùng chứa kim loại trần, KVM và Docker. Kết quả chung là: Docker gần giống với hiệu suất gốc và nhanh hơn KVM trong mọi danh mục.

Ngoại lệ cho điều này là NAT của Docker - nếu bạn sử dụng ánh xạ cổng (ví dụ docker run -p 8080:8080:), thì bạn có thể mong đợi một cú đánh nhỏ trong độ trễ, như hiển thị bên dưới. Tuy nhiên, bây giờ bạn có thể sử dụng ngăn xếp mạng máy chủ (ví dụ docker run --net=host:) khi khởi chạy bộ chứa Docker, sẽ thực hiện giống hệt với cột Bản địa (như được hiển thị trong kết quả độ trễ Redis xuống thấp hơn).

Docker NAT trên cao

Họ cũng đã chạy thử nghiệm độ trễ trên một vài dịch vụ cụ thể, chẳng hạn như Redis. Bạn có thể thấy rằng trên 20 luồng khách hàng, chi phí có độ trễ cao nhất là Docker NAT, sau đó là KVM, sau đó là một ràng buộc thô giữa máy chủ / máy chủ Docker.

Docker Redis Độ trễ quá cao

Chỉ vì nó là một bài báo thực sự hữu ích, đây là một số số liệu khác. Vui lòng tải về để truy cập đầy đủ.

Hãy xem qua Đĩa I / O:

Docker so với KVM so với hiệu suất I / O bản địa

Bây giờ nhìn vào chi phí CPU:

Docker CPU trên cao

Bây giờ một số ví dụ về bộ nhớ (đọc bài viết để biết chi tiết, bộ nhớ có thể khó khăn hơn):

So sánh bộ nhớ Docker


20
Đối với các số linpack được đưa ra trong bài báo ... thật lòng mà nói, tôi thấy chúng thật khó tin (không phải tôi không tin rằng đó là những gì linpack phát ra, nhưng tôi không tin rằng bài kiểm tra thực sự không đo được gì ngoài hiệu suất của dấu phẩy động như thực hiện). Chi phí chính từ KVM là trong các thành phần mô phỏng phần cứng không gian người dùng (chỉ áp dụng cho phần cứng không phải CPU ); có chi phí đáng kể xung quanh phân trang bộ nhớ ... nhưng dấu phẩy động thô? Tôi muốn xem xét những gì đang thực sự diễn ra ở đó - có lẽ là chuyển đổi bối cảnh quá mức.
Charles Duffy

2
Sửa lỗi cú pháp Docker CLI hiện tại: --net=host(hai dấu gạch ngang) và -p 8080:8080(chữ thường 'p') cho NAT.
bk0

6
Bài báo được trích dẫn của IBM dường như quá tập trung vào IO mạng. Nó không bao giờ giải quyết các chuyển đổi bối cảnh. Chúng tôi đã xem xét LXC và phải nhanh chóng từ bỏ nó do các chuyển đổi bối cảnh không tự nguyện tăng lên dẫn đến việc xử lý ứng dụng xuống cấp.
Eric

3
Tôi cũng tò mò về các hoạt động của hệ thống tập tin - ví dụ, tra cứu thư mục, là một nơi mà tôi mong đợi để xem chi phí; đọc, viết và tìm kiếm ở cấp độ khối (mà các biểu đồ đã cho tập trung nhiều vào) không .
Charles Duffy

12
Tôi yêu các biểu đồ với cùng màu bóng. Thật dễ dàng để phân biệt
Viktor Joras

104

Docker không ảo hóa, như vậy - thay vào đó, nó là một sự trừu tượng hóa trên đầu hỗ trợ của kernel cho các không gian tên quy trình khác nhau, không gian tên thiết bị, v.v.; một không gian tên vốn dĩ không đắt hơn hoặc kém hiệu quả hơn một không gian khác, vì vậy điều thực sự khiến Docker có tác động đến hiệu suất là vấn đề thực sự trong những không gian tên đó.


Các lựa chọn của Docker về cách cấu hình không gian tên cho các thùng chứa của nó có chi phí, nhưng các chi phí đó đều liên quan trực tiếp đến lợi ích - bạn có thể từ bỏ chúng, nhưng khi làm như vậy bạn cũng từ bỏ lợi ích liên quan:

  • Các hệ thống tệp được xếp lớp rất tốn kém - chính xác là chi phí thay đổi theo từng loại (và Docker hỗ trợ nhiều phụ trợ) và với các mẫu sử dụng của bạn (hợp nhất nhiều thư mục lớn hoặc hợp nhất một bộ hệ thống tệp rất sâu sẽ đặc biệt đắt tiền), nhưng chúng Không miễn phí. Mặt khác, rất nhiều chức năng của Docker - có thể xây dựng khách khỏi các khách khác theo cách sao chép trên văn bản và có được các lợi thế lưu trữ tiềm ẩn tương tự - đi bằng cách trả chi phí này.
  • DNAT trở nên đắt đỏ ở quy mô - nhưng mang lại cho bạn lợi ích của việc có thể định cấu hình mạng khách của bạn độc lập với máy chủ của bạn và có giao diện thuận tiện để chỉ chuyển tiếp các cổng bạn muốn giữa chúng. Bạn có thể thay thế điều này bằng một cầu nối đến một giao diện vật lý, nhưng một lần nữa, mất lợi ích.
  • Có thể chạy từng ngăn xếp phần mềm với các phần phụ thuộc được cài đặt theo cách thuận tiện nhất - độc lập với bản phân phối, libc và các phiên bản thư viện khác của máy chủ - là một lợi ích lớn, nhưng cần tải thư viện chia sẻ nhiều lần (khi các phiên bản của chúng khác nhau) có chi phí bạn mong đợi.

Và kể từ đó trở đi. Bao nhiêu chi phí này thực sự ảnh hưởng đến bạn trong môi trường của bạn - với các mẫu truy cập mạng, các hạn chế về bộ nhớ, v.v. - là một mục mà rất khó để đưa ra câu trả lời chung chung.


2
Đây là một câu trả lời tốt nhưng tôi đang tìm kiếm các con số và điểm chuẩn cụ thể hơn. Tôi quen thuộc với chi phí của các nhóm nhưng Docker còn hơn thế như bạn đã chỉ ra. Cảm ơn rất nhiều cho câu trả lời.
Luke Hoersten

6
Chắc chắn rồi. Quan điểm của tôi là bất kỳ điểm chuẩn tổng quát nào bạn tìm thấy sẽ có khả năng áp dụng rất hạn chế đối với bất kỳ ứng dụng cụ thể nào - nhưng điều đó không có nghĩa là tôi không đồng ý với những người đang cố gắng cung cấp chúng, mà chỉ nên uống chúng với một muỗng muối.
Charles Duffy

1
Theo cách đó, bạn có thể nói rằng KVM "không phải là ảo hóa, nó chỉ đơn giản là một sự trừu tượng hóa trong các cuộc gọi công nghệ ảo x86".
Vad

10
@Vad, có thỏa thuận đồng thuận, trở lại nhiều thập kỷ (với các triển khai phần cứng không phải x86 sớm của IBM!), Việc cung cấp sự trừu tượng trực tiếp trên lớp phần cứng là ảo hóa rõ ràng. Sự đồng thuận về thuật ngữ xung quanh việc đặt tên ở cấp độ hạt nhân bị phân mảnh đáng kể hơn - mỗi điểm chúng ta có thể đưa ra các nguồn có lợi cho quan điểm cá nhân của mình - nhưng thật lòng mà nói, có những khác biệt kỹ thuật hữu ích (xung quanh cả đặc điểm bảo mật và hiệu suất) mà việc chuyển sang một thuật ngữ duy nhất sẽ che khuất , vì vậy tôi đang giữ vị trí của mình cho đến khi và trừ khi đạt được sự đồng thuận trong ngành.
Charles Duffy

@LukeHoersten, ... đúng, đó không phải là các nhóm có chi phí đáng kể, đó là nhiều nội dung của các không gian tên hệ thống tập tin và mạng. Nhưng những chi phí đó phụ thuộc gần như hoàn toàn vào cách Docker được cấu hình - những phụ trợ cụ thể mà bạn đang sử dụng. Bridging là nhiều, nhiều rẻ hơn so với NAT mặc định Docker của, ví dụ; và chi phí hoạt động của các phụ trợ hệ thống tập tin khác nhau cũng rất khác nhau (và trong một số trường hợp, số lượng chi phí phụ thuộc vào kiểu sử dụng; các biến thể lớp phủ có thể đắt hơn nhiều với các thư mục lớn được sửa đổi qua nhiều lớp f / e).
Charles Duffy

20

Dưới đây là một số điểm chuẩn khác để Docker based memcached serverso sánh với host native memcached serverviệc sử dụng công cụ điểm chuẩn Twemperf https://github.com/twitter/twemperf với 5000 kết nối và tốc độ kết nối 20k

Kết nối chi phí thời gian cho memcached dựa trên docker dường như đồng ý với whitepaper ở trên với tốc độ gấp khoảng hai lần.

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

Đây là bencmark sử dụng công cụ điểm chuẩn memtier

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
Họ so sánh hai bản dựng khác nhau của memcached, và một trong số chúng trong docker, bên ngoài docker, phải không?
san

4
Là những kết quả với mạng máy chủ hoặc mạng cầu trong docker?
akaHuman

13
Với số lượng lớn như vậy, các phép đo này không hiển thị bất kỳ dữ liệu có thể biểu thị nàoavg 200.5 min 0.6 max 263.2 stddev 73.85
Sergey Zhukov
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.