ประสิทธิภาพการใช้งานจริงของคอนเทนเนอร์ Docker คืออะไร


512

ฉันต้องการเข้าใจค่าใช้จ่ายการปฏิบัติงานของคอนเทนเนอร์ Docker อย่างครอบคลุม ฉันได้พบการอ้างอิงไปยังเครือข่าย anecdotally เป็น ~ 100μsช้าลง

ฉันยังพบการอ้างอิงถึงค่าใช้จ่ายในการดำเนินการเป็น "เล็กน้อย" และ "ใกล้กับศูนย์" แต่ฉันต้องการทราบอย่างแม่นยำมากขึ้นว่าค่าใช้จ่ายเหล่านั้นคืออะไร โดยหลักการแล้วฉันต้องการทราบว่านักเทียบท่าคืออะไรที่เป็นนามธรรมด้วยต้นทุนด้านประสิทธิภาพและสิ่งที่เป็นนามธรรมโดยไม่มีต้นทุนด้านประสิทธิภาพ เครือข่าย, CPU, หน่วยความจำ ฯลฯ

นอกจากนี้หากมีค่าใช้จ่ายที่เป็นนามธรรมจะมีวิธีที่จะได้รับรอบค่าใช้จ่ายที่เป็นนามธรรม ตัวอย่างเช่นบางทีฉันสามารถเมานดิสก์ได้โดยตรงเทียบกับใน Docker



1
@GoloRoden คำถามนั้นคล้ายกัน แต่ไม่เหมือนกันหมด ฉันกำลังมองหาค่าใช้จ่ายในการตอบสนองด้วยเหตุผลเช่น "เครือข่ายกำลังถูกส่งผ่านเลเยอร์พิเศษ" ในขณะที่คำตอบที่ได้รับการยอมรับของคำถามนั้นเป็นเรื่องเพิ่มเติมเกี่ยวกับการวัดค่าใช้จ่ายของ container + app
Luke Hoersten

1
โอเคใช่แล้ว ฉันถอนการโหวตอย่างใกล้ชิดของฉันแล้ว
Golo Roden

8
ฉันดีใจที่คุณโพสต์ไว้ คำถามนั้นไม่ได้เกิดขึ้นในการค้นหาของฉัน บทความการวัด / การวัดมีประโยชน์มาก: blog.docker.io/2013/10/gathering-lxc-docker-containers-metrics
Luke Hoersten

1
นี่เป็นเซสชั่นที่ดีที่ชื่อว่า "ตู้คอนเทนเนอร์ Linux - NextGen Virtualization for Cloud" บอกการวัดประสิทธิภาพโดยเปรียบเทียบนักเทียบเคียง KVM VM และโลหะเปลือย: youtube.com/watch?v=a4oOAVhNLjU
Shawmzhu

คำตอบ:


449

บทความวิจัยของไอบีเอ็มที่ยอดเยี่ยมในปี 2014“ การเปรียบเทียบประสิทธิภาพที่ปรับปรุงของเครื่องเสมือนและภาชนะบรรจุ Linux ” โดย Felter และคณะ แสดงการเปรียบเทียบระหว่างโลหะเปลือย, KVM และคอนเทนเนอร์ Docker ผลลัพธ์โดยทั่วไปคือ: นักเทียบท่าเกือบจะเหมือนกับประสิทธิภาพดั้งเดิมและเร็วกว่า KVM ในทุกหมวดหมู่

ข้อยกเว้นสำหรับเรื่องนี้คือ NAT's Docker - หากคุณใช้การจับคู่พอร์ต (เช่นdocker run -p 8080:8080) จากนั้นคุณสามารถคาดว่าจะมีการเข้าชมเล็กน้อยในเวลาแฝงดังแสดงด้านล่าง อย่างไรก็ตามตอนนี้คุณสามารถใช้เครือข่ายโฮสต์สแต็ค (เช่นdocker run --net=host) เมื่อเรียกใช้งาน Docker container ซึ่งจะทำงานเหมือนกันกับคอลัมน์ Native (ดังที่แสดงในผลลัพธ์เวลาแฝงของ Redis)

ค่าใช้จ่ายของ Docker NAT

พวกเขายังทำการทดสอบเวลาแฝงในบริการบางอย่างเช่น Redis คุณจะเห็นได้ว่ามีไคลเอ็นต์เธรดมากกว่า 20 เธรดค่าใช้จ่ายในการตอบสนองต่อเวลาสูงสุดจะไปที่ Docker NAT แล้วตามด้วย KVM จากนั้นจะเป็นการรวมคร่าวๆระหว่างโฮสต์ / เนทีฟ

ค่าใช้จ่ายของนักเทียบท่า Redis Latency

เพียงเพราะมันเป็นกระดาษที่มีประโยชน์จริงๆนี่คือตัวเลขอื่น ๆ กรุณาดาวน์โหลดเพื่อการเข้าถึงแบบเต็ม

ดูที่ Disk I / O:

นักเทียบท่าเทียบกับ KVM กับประสิทธิภาพ I / O ดั้งเดิม

ตอนนี้ดูค่าใช้จ่ายของ CPU:

ค่าใช้จ่ายของ Docker CPU

ตอนนี้ตัวอย่างบางส่วนของหน่วยความจำ (อ่านกระดาษเพื่อดูรายละเอียดหน่วยความจำอาจเป็นเรื่องยากมาก):

การเปรียบเทียบหน่วยความจำนักเทียบท่า


20
สำหรับตัวเลข linpack ที่ให้ไว้ในกระดาษ ... ตรงไปตรงมาฉันพบว่าพวกเขายากที่จะเชื่อ (ไม่ใช่ว่าฉันไม่เชื่อว่าพวกเขาเป็นสิ่งที่ linpack ปล่อยออกมา แต่ฉันไม่เชื่อว่าการทดสอบนั้นวัดได้จริง ๆ ดำเนินการ) โอเวอร์เฮดที่สำคัญจาก KVM อยู่ในส่วนประกอบการจำลองฮาร์ดแวร์ userspace (ซึ่งใช้กับฮาร์ดแวร์ที่ไม่ใช่ CPUเท่านั้น); มีค่าใช้จ่ายที่มีนัยสำคัญรอบการแบ่งหน้าหน่วยความจำ ... แต่จุดลอยตัวดิบ? ฉันอยากจะดูว่าเกิดอะไรขึ้นที่นั่นจริง ๆ - อาจจะเปลี่ยนบริบทมากเกินไป
ชาร์ลส์ดัฟฟี่

2
การแก้ไขสำหรับไวยากรณ์ Docker CLI ปัจจุบัน: --net=host(สองขีดกลาง) และ-p 8080:8080(ตัวพิมพ์เล็ก 'p') สำหรับ NAT
bk0

6
เอกสาร IBM ที่อ้างถึงดูเหมือนว่าเน้นไปที่เครือข่าย IO มากเกินไป มันไม่ได้อยู่ที่สวิทช์บริบท เรามองไปที่ LXC และต้องละทิ้งมันอย่างรวดเร็วเนื่องจากการเพิ่มสวิทช์บริบทที่ไม่สมัครใจทำให้การประมวลผลแอปพลิเคชันลดลง
Eric

3
ฉันยังอยากรู้เกี่ยวกับการทำงานของระบบไฟล์เช่นการค้นหาไดเรกทอรีเป็นสถานที่ที่ฉันคาดว่าจะเห็นค่าใช้จ่าย ระดับบล็อกอ่านเขียนและพยายาม (ซึ่งชาร์ตได้รับเน้นหนักใน) ไม่ได้
Charles Duffy

12
ฉันชอบชาร์ตที่มีเฉดสีเดียวกัน มันง่ายมากที่จะแยกแยะ
Viktor Joras

104

นักเทียบเคียงไม่ใช่การจำลองเสมือนเช่นนั้น แต่มันเป็นนามธรรมที่อยู่เหนือการสนับสนุนของเคอร์เนลสำหรับเนมสเปซกระบวนการที่แตกต่างกันเนมสเปซอุปกรณ์ ฯลฯ เนมสเปซหนึ่งไม่ได้มีราคาแพงกว่าหรือไม่มีประสิทธิภาพโดยธรรมชาติอีกต่อไปดังนั้นสิ่งที่ทำให้นักเทียบท่ามีผลกระทบด้านประสิทธิภาพเป็นเรื่องของสิ่งที่เกิดขึ้นจริงในเนมสเปซเหล่านั้น


ตัวเลือกของนักเทียบท่าในแง่ของวิธีการกำหนดค่าเนมสเปซสำหรับตู้คอนเทนเนอร์มีค่าใช้จ่าย แต่ค่าใช้จ่ายเหล่านั้นเกี่ยวข้องโดยตรงกับผลประโยชน์ทั้งหมด - คุณสามารถเลิกใช้ได้ แต่ในการทำเช่นนั้น

  • ระบบไฟล์แบบเลเยอร์มีราคาแพง - ค่าใช้จ่ายจะแตกต่างกันไปในแต่ละคน (และนักเทียบท่าสนับสนุนแบ็กเอนด์หลาย ๆ หลัง) และด้วยรูปแบบการใช้งานของคุณ (การรวมหลายไดเรกทอรีขนาดใหญ่หรือการรวมระบบไฟล์ ไม่ฟรี ในทางกลับกันฟังก์ชั่นการใช้งานของ Docker จำนวนมาก - ความสามารถในการสร้างแขกจากแขกคนอื่น ๆ ในลักษณะการคัดลอก - เขียน - เขียนและการได้เปรียบในการจัดเก็บโดยปริยาย - จ่ายค่าใช้จ่ายนี้
  • DNAT มีราคาแพงมาก - แต่ให้ประโยชน์กับความสามารถในการกำหนดค่าเครือข่ายแขกของคุณโดยไม่ขึ้นอยู่กับโฮสต์ของคุณและมีอินเทอร์เฟซที่สะดวกสบายสำหรับการส่งต่อเฉพาะพอร์ตที่คุณต้องการระหว่างพวกเขา คุณสามารถแทนที่สิ่งนี้ด้วยบริดจ์เป็นอินเทอร์เฟซทางกายภาพได้ แต่เสียประโยชน์อีกครั้ง
  • ความสามารถในการรันซอฟต์แวร์แต่ละสแต็กด้วยการติดตั้งการพึ่งพาในวิธีที่สะดวกที่สุดซึ่งไม่ขึ้นอยู่กับรุ่นของ distro, libc และไลบรารี่อื่น ๆ ของโฮสต์นั้นเป็นข้อดีอย่างมาก แต่จำเป็นต้องโหลดไลบรารี่ที่แชร์มากกว่าหนึ่งครั้ง ต่างกัน) มีค่าใช้จ่ายที่คุณคาดหวัง

และอื่น ๆ ค่าใช้จ่ายเหล่านี้ส่งผลกระทบต่อคุณในสภาพแวดล้อมของคุณจริงเพียงใดด้วยรูปแบบการเข้าถึงเครือข่ายข้อ จำกัด หน่วยความจำของคุณ ฯลฯ เป็นรายการที่ยากที่จะให้คำตอบทั่วไป


2
นี่เป็นคำตอบที่ดี แต่ฉันกำลังมองหาตัวเลขและมาตรฐานที่เฉพาะเจาะจงมากขึ้น ฉันคุ้นเคยกับค่าใช้จ่ายของกลุ่ม cg แต่นักเทียบท่าเป็นมากกว่านั้นตามที่คุณได้ชี้ให้เห็น ขอบคุณมากสำหรับคำตอบ
Luke Hoersten

6
แน่ใจ ประเด็นของฉันคือการเปรียบเทียบมาตรฐานทั่วไปที่คุณพบว่ามีความเกี่ยวข้องกับแอปพลิเคชันเฉพาะอย่าง จำกัด - แต่นั่นไม่ได้หมายความว่าฉันไม่เห็นด้วยกับคนที่พยายามจัดหาพวกเขา แต่เพียงว่าพวกเขาควรได้รับเกลือ
Charles Duffy

1
ด้วยวิธีนี้คุณสามารถพูดได้ว่า KVM "ไม่ใช่เวอร์ชวลไลเซชันมันเป็นเพียงนามธรรมบน x86 สายเทคโนโลยีเสมือน"
Vad

10
@Vad มีข้อตกลงฉันทามติย้อนกลับไปหลายทศวรรษ (สำหรับการปรับใช้ฮาร์ดแวร์ที่ไม่ใช่ x86 รุ่นแรก ๆ ของไอบีเอ็ม!) ที่ให้สิ่งที่เป็นนามธรรมโดยตรงบนเลเยอร์ฮาร์ดแวร์คือการจำลองเสมือนอย่างไม่น่าสงสัย ฉันทามติสำหรับคำศัพท์รอบ ๆ การตั้งชื่อระดับเคอร์เนลมีการแยกส่วนมาก - เราสามารถชี้ไปยังแหล่งที่ชื่นชอบมุมมองของเราแต่ละคน - แต่ตรงไปตรงมามีความแตกต่างทางเทคนิคที่เป็นประโยชน์ (รอบความปลอดภัยและประสิทธิภาพการทำงาน) ดังนั้นฉันจึงดำรงตำแหน่งของฉันไว้จนกว่าจะถึงฉันทามติอุตสาหกรรมที่ตรงกันข้าม
Charles Duffy

@LukeHoersten, ... ใช่ไม่ใช่กลุ่ม cg ที่มีค่าใช้จ่ายมากเนื้อหาของเครือข่ายและระบบไฟล์เนมสเปซ แต่ค่าใช้จ่ายเหล่านั้นขึ้นอยู่กับว่านักเทียบท่าได้รับการกำหนดค่าอย่างไร - แบ็กเอนด์เฉพาะที่คุณใช้อยู่ Bridging นั้นมีราคาถูกกว่า NAT ของ Docker มากเช่นกัน (และในบางกรณีจำนวนของค่าใช้จ่ายขึ้นอยู่กับรูปแบบการใช้งานตัวแปร overlayfs อาจมีราคาแพงกว่ามากด้วยไดเรกทอรีขนาดใหญ่ที่แก้ไขผ่านหลายเลเยอร์ f / e)
ชาร์ลส์ดัฟฟี่

20

ต่อไปนี้เป็นเกณฑ์มาตรฐานเพิ่มเติมสำหรับการเปรียบเทียบDocker based memcached serverกับการhost native memcached serverใช้เครื่องมือเปรียบเทียบ Twemperf https://github.com/twitter/twemperfด้วยการเชื่อมต่อ 5,000 รายการและอัตราการเชื่อมต่อ 20k

เชื่อมต่อค่าใช้จ่ายเวลาสำหรับ 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

นี่คือbencmarks โดยใช้เครื่องมือมาตรฐาน 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
พวกเขาเปรียบเทียบ memcached สองแบบที่แตกต่างกันและหนึ่งในนั้นคือ Docker และอื่น ๆ นอก Docker ใช่มั้ย
san

4
ผลลัพธ์เหล่านี้มาพร้อมกับเครือข่ายโฮสต์หรือบริดจ์ระบบเครือข่ายในตัวเชื่อมต่อหรือไม่
akaHuman

13
ด้วย stddevs ขนาดใหญ่เช่นนี้การวัดเหล่านี้จะไม่แสดงข้อมูลใด ๆ ที่สามารถแทนได้avg 200.5 min 0.6 max 263.2 stddev 73.85
Sergey Zhukov
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.