Berapa biaya kinerja runtime dari wadah Docker?

512

Saya ingin memahami secara komprehensif biaya kinerja run-time dari wadah Docker. Saya telah menemukan referensi untuk jaringan secara anekdot menjadi ~ 100μs lebih lambat .

Saya juga menemukan referensi untuk biaya run-time menjadi "diabaikan" dan "mendekati nol" tetapi saya ingin tahu lebih tepat berapa biaya-biaya itu. Idealnya saya ingin tahu apa yang Docker abstraksi dengan biaya kinerja dan hal-hal yang diabstraksi tanpa biaya kinerja. Jaringan, CPU, memori, dll.

Selanjutnya, jika ada biaya abstraksi, apakah ada cara untuk menyiasati biaya abstraksi. Sebagai contoh, mungkin saya dapat memasang disk secara langsung vs. secara virtual di Docker.

Luke Hoersten
sumber
1
@ GoloRoden pertanyaan itu mirip tetapi tidak persis sama. Saya mencari biaya latensi dengan alasan seperti "jaringan sedang melewati lapisan tambahan" sedangkan jawaban yang diterima pertanyaan itu lebih lanjut tentang mengukur biaya aplikasi kontainer +.
Luke Hoersten
1
Oke, benar juga. Saya menarik kembali suara dekat saya.
Golo Roden
8
Saya senang Anda mempostingnya. Pertanyaan itu tidak muncul dalam pencarian saya. Artikel pengukuran / metrik sangat berguna: blog.docker.io/2013/10/gathering-lxc-docker-containers-metrics
Luke Hoersten
1
Ini adalah sesi yang baik berjudul "Linux Containers - NextGen Virtualization for Cloud" yang menceritakan metrik kinerja dengan membandingkan buruh pelabuhan, KVM VM dan bare metal: youtube.com/watch?v=a4oOAVhNLjU
shawmzhu

Jawaban:

449

Makalah penelitian IBM 2014 yang sangat baik " Perbandingan Kinerja yang Diperbarui dari Mesin Virtual dan Wadah Linux " oleh Felter et al. memberikan perbandingan antara wadah logam kosong, KVM, dan Docker. Hasil umum adalah: Docker hampir identik dengan kinerja asli dan lebih cepat dari KVM di setiap kategori.

Pengecualian untuk ini adalah Docker's NAT - jika Anda menggunakan pemetaan port (misalnya, docker run -p 8080:8080), maka Anda dapat mengharapkan hit kecil dalam latensi, seperti yang ditunjukkan di bawah ini. Namun, Anda sekarang dapat menggunakan tumpukan jaringan host (mis., docker run --net=host) Ketika meluncurkan wadah Docker, yang akan melakukan secara identik ke kolom Asli (seperti yang ditunjukkan dalam hasil latensi Redis bawah ke bawah).

Docker NAT overhead

Mereka juga menjalankan tes latensi pada beberapa layanan tertentu, seperti Redis. Anda dapat melihat bahwa di atas 20 utas klien, overhead latensi tertinggi adalah Docker NAT, lalu KVM, lalu ikatan kasar antara host Docker / asli.

Docker Redis Latency Overhead

Hanya karena itu kertas yang sangat berguna, berikut adalah beberapa tokoh lainnya. Silakan unduh untuk akses penuh.

Melihat pada Disk I / O:

Docker vs. KVM vs. Kinerja I / O Asli

Sekarang melihat overhead CPU:

Overhead CPU Docker

Sekarang beberapa contoh memori (baca kertas untuk detailnya, memori bisa sangat rumit):

Perbandingan Memori Docker

Hamy
sumber
20
Adapun nomor linpack yang diberikan di koran ... terus terang, saya merasa sulit untuk percaya (bukan karena saya tidak percaya bahwa itu adalah apa yang dikeluarkan linpack, tetapi saya tidak percaya bahwa tes ini benar-benar mengukur apa-apa selain kinerja titik-mengambang sebagai dilakukan). Overhead utama dari KVM adalah komponen emulasi perangkat keras userspace (yang hanya berlaku untuk perangkat keras non-CPU ); ada overhead yang signifikan di sekitar paging memori ... tapi floating-point mentah? Saya ingin melihat apa yang sebenarnya terjadi di sana - mungkin konteks yang berlebihan berubah.
Charles Duffy
2
Koreksi untuk sintaksis Docker CLI saat ini: --net=host(dua tanda hubung) dan -p 8080:8080(huruf kecil 'p') untuk NAT.
bk0
6
Makalah IBM yang dikutip tampaknya terlalu fokus pada IO jaringan. Itu tidak pernah membahas switch konteks. Kami melihat LXC dan harus segera meninggalkannya karena peningkatan sakelar konteks non-sukarela yang mengakibatkan pemrosesan aplikasi terdegradasi.
Eric
3
Saya juga ingin tahu tentang operasi sistem file - pencarian direktori, misalnya, adalah tempat di mana saya berharap untuk melihat overhead; blok-tingkat membaca, menulis dan mencari (yang grafik yang diberikan fokus berat pada) tidak .
Charles Duffy
12
Saya suka grafik dengan warna naungan yang sama. Sangat mudah untuk dibedakan
Viktor Joras
104

Docker bukan virtualisasi, sebagai gantinya - itu adalah abstraksi di atas dukungan kernel untuk ruang proses proses yang berbeda, ruang nama perangkat, dll .; satu namespace pada dasarnya tidak lebih mahal atau tidak efisien daripada yang lain, jadi apa yang sebenarnya membuat Docker memiliki dampak kinerja adalah masalah apa yang sebenarnya ada di namespace tersebut.


Pilihan Docker dalam hal cara mengkonfigurasi ruang nama untuk wadahnya memiliki biaya, tetapi biaya itu semua terkait langsung dengan manfaat - Anda dapat menyerah, tetapi dengan melakukannya Anda juga melepaskan manfaat terkait:

  • Filesystem berlapis mahal - persis berapa biayanya berbeda-beda dengan masing-masingnya (dan Docker mendukung banyak backend), dan dengan pola penggunaan Anda (menggabungkan beberapa direktori besar, atau menggabungkan sekumpulan filesystem yang sangat dalam akan sangat mahal), tetapi mereka tidak gratis Di sisi lain, banyak fungsi Docker - mampu membangun tamu dari tamu lain dengan cara copy-on-write, dan mendapatkan keuntungan penyimpanan yang tersirat sama - naik membayar biaya ini.
  • DNAT menjadi mahal pada skala - tetapi memberi Anda manfaat untuk dapat mengkonfigurasi jaringan tamu Anda secara independen dari host Anda dan memiliki antarmuka yang nyaman untuk meneruskan hanya port yang Anda inginkan di antara mereka. Anda dapat mengganti ini dengan jembatan ke antarmuka fisik, tetapi sekali lagi, kehilangan manfaatnya.
  • Mampu menjalankan setiap tumpukan perangkat lunak dengan dependensinya yang diinstal dengan cara yang paling nyaman - terlepas dari distro host, libc, dan versi pustaka lainnya - adalah manfaat yang besar, tetapi perlu memuat pustaka bersama lebih dari satu kali (ketika versi mereka berbeda) memiliki biaya yang Anda harapkan.

Dan seterusnya. Seberapa besar biaya ini benar-benar memengaruhi Anda di lingkungan Anda - dengan pola akses jaringan Anda, kendala memori Anda, dll - adalah hal yang sulit untuk dijawab secara umum.

Charles Duffy
sumber
2
Ini jawaban yang bagus tapi saya mencari angka dan tolok ukur yang lebih spesifik. Saya akrab dengan biaya cgroup tetapi Docker lebih dari itu seperti yang telah Anda tunjukkan. Terima kasih banyak atas jawabannya.
Luke Hoersten
6
Tentu. Maksud saya adalah bahwa setiap tolok ukur umum yang Anda temukan akan memiliki penerapan yang sangat terbatas untuk aplikasi tertentu - tetapi itu tidak berarti saya tidak setuju dengan orang-orang yang mencoba menyediakannya, tetapi hanya bahwa mereka harus diambil dengan satu sendok makan garam.
Charles Duffy
1
Dengan cara itu Anda bisa mengatakan bahwa KVM "bukan virtualisasi tetapi hanya sebuah abstraksi di atas panggilan teknologi virtual x86".
Vad
10
@Vad, ada perjanjian konsensus, akan kembali puluhan tahun (ke implementasi perangkat keras non-x86 awal IBM!), Yang menyediakan abstraksi langsung pada lapisan perangkat keras adalah virtualisasi yang jelas. Konsensus untuk terminologi seputar penamaan namespace-kernel jauh lebih terfragmentasi - kita masing-masing dapat menunjuk ke sumber yang mendukung pandangan individu kita - tetapi terus terang, ada perbedaan teknis yang berguna (sekitar karakteristik keamanan dan kinerja) yang pindah ke satu istilah akan mengaburkan , jadi saya memegang posisi saya sampai dan kecuali konsensus industri yang berlawanan tercapai.
Charles Duffy
@LukeHoersten, ... benar, bukan cgroup yang memiliki biaya yang signifikan, tetapi lebih banyak isi ruang jaringan dan ruang sistem file. Tetapi berapa banyak biaya tersebut tergantung hampir sepenuhnya pada bagaimana Docker dikonfigurasi - backend spesifik yang Anda gunakan. Menjembatani jauh, jauh lebih murah daripada NAT default Docker, misalnya; dan overhead kinerja berbagai sistem file backends 'juga bervariasi sangat liar (dan dalam beberapa kasus, jumlah overhead tergantung pada pola penggunaan; varian overlay bisa jauh lebih mahal dengan direktori besar dimodifikasi melalui beberapa lapisan f / e).
Charles Duffy
20

Berikut ini beberapa tolok ukur untuk Docker based memcached serverdibandingkan host native memcached serverdengan menggunakan alat benchmark Twemperf https://github.com/twitter/twemperf dengan 5000 koneksi dan 20k tingkat koneksi

Menghubungkan waktu overhead untuk memcached berbasis buruh pelabuhan tampaknya setuju dengan whitepaper di atas pada kira-kira dua kali kecepatan asli.

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

Berikut patokan menggunakan alat benchmark 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
p4guru
sumber
1
Mereka membandingkan dua bangunan memcached yang berbeda, dan juga salah satunya di buruh pelabuhan, yang lain di luar buruh pelabuhan, bukan?
san
4
Apakah hasil ini dengan jaringan host atau menjembatani jaringan di buruh pelabuhan?
alias Manusia
13
Dengan stddev besar seperti pengukuran ini tidak menunjukkan data yang dapat diwakiliavg 200.5 min 0.6 max 263.2 stddev 73.85
Sergey Zhukov