นักเทียบท่าเขียน — ขีด จำกัด หน่วยความจำ

Docker Compose Memory Limits



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

เราสร้างคอนเทนเนอร์ที่แตกต่างกันเพื่อจัดการกับปริมาณงานที่แตกต่างกันของแอปพลิเคชัน และเราใช้ Docker Compose เพื่อทำสิ่งนี้ได้อย่างง่ายดาย ปริมาณงานที่แตกต่างกันทางตรรกะแต่ละรายการจะแสดงเป็นรายการที่แตกต่างกัน บริการ . ตัวอย่างเช่น เซิร์ฟเวอร์ http ฟรอนท์เอนด์ของคุณจะแสดงเป็นบริการฟรอนต์เอนด์ที่เรียกใช้ Apache หรืออิมเมจ Nginx เป็นคอนเทนเนอร์







บริการทั้งหมด ความต้องการเครือข่าย ข้อกำหนดในการจัดเก็บข้อมูล ฯลฯ สามารถระบุได้ในไฟล์ docker-compose.yml เราจะเน้นที่การระบุการใช้หน่วยความจำที่นี่



คุณต้องมีเครื่องมือต่อไปนี้ในคลังแสงของคุณเพื่อปฏิบัติตาม:



  1. ความเข้าใจพื้นฐานของ Docker
  2. Docker สำหรับ Windows หรือ Mac หรือถ้าคุณใช้ลินุกซ์ DockerCE สำหรับ Linux
  3. นักเทียบท่าเขียนไบนารี y (ผู้ใช้ Windows และ Mac จะติดตั้งสิ่งนี้แล้ว)

เราจะยังคงใช้เวอร์ชัน 2.4 สำหรับไฟล์ docker-compose.yml ของเรา เนื่องจากรองรับเวอร์ชัน 17.12 และสูงกว่าของ Docker Engine และสูงกว่า เราอาจใช้เวอร์ชัน 3 ซึ่งใหม่กว่า แต่ไม่รองรับไวยากรณ์การจำกัดหน่วยความจำแบบเก่า หากคุณพยายามใช้รูปแบบที่ใหม่กว่า โปรแกรมจะยืนยันการใช้ Docker ในโหมด Swarm แทน ดังนั้นเพื่อให้เรื่องง่ายสำหรับผู้ใช้ Docker ทั่วไป ฉันจะใช้เวอร์ชัน 2.4





โค้ดส่วนใหญ่จะใช้งานได้เหมือนกันสำหรับเวอร์ชัน 3 และในกรณีที่มีความแตกต่าง ฉันจะพูดถึงไวยากรณ์ที่ใหม่กว่าสำหรับผู้ใช้ Docker Swarm

ตัวอย่างการสมัคร

มาลองเรียกใช้บริการ Nginx อย่างง่ายบนพอร์ต 80 โดยใช้ CLI ก่อน จากนั้นจึงใช้ docker-compose.yml ในส่วนถัดไป เราจะสำรวจข้อจำกัดและการใช้งานหน่วยความจำและแก้ไข docker-compose.yml เพื่อดูว่ามีการกำหนดข้อจำกัดแบบกำหนดเองอย่างไร



มาเริ่มเซิร์ฟเวอร์ nginx อย่างง่ายโดยใช้ Docker-CLI :

$ docker run -d --name my-nginx -p80:80nginx:ล่าสุด

คุณสามารถดูเซิร์ฟเวอร์ nginx ทำงานได้โดยไปที่ http://localhost หรือแทนที่ lcoalhost

ด้วยที่อยู่ IP ของโฮสต์ Docker ของคุณ คอนเทนเนอร์นี้อาจใช้หน่วยความจำที่มีอยู่ทั้งหมดบนโฮสต์ Docker ของคุณ (ในกรณีของเราคือประมาณ 2GB) ในการตรวจสอบการใช้หน่วยความจำ เหนือสิ่งอื่นใด เราสามารถใช้คำสั่ง:

$ docker stats my-nginx

CONTAINER ID NAME CPU % MEM การใช้งาน / LIMIT MEM % NET I/O BLOCK I/O PIDS
6eb0091c0cf2 my-nginx0.00% 2.133MiB / 1.934GiB0.11% 3.14kB / 2.13kB 0B / 0B2

MEM USAGE/LIMIT อยู่ที่ 2.133MiB จากทั้งหมด 1.934GiB มาลบคอนเทนเนอร์นี้และเริ่มเขียนสคริปต์นักเทียบท่า

$ นักเทียบท่าหยุด my-nginx
$ นักเทียบท่า rm my-nginx

ไฟล์ ym เทียบเท่า

คอนเทนเนอร์ที่แน่นอนข้างต้นสามารถสร้างขึ้นได้หากเราทำตามขั้นตอนเหล่านี้:

$ mkdir my-compose
$ cd my-compose
$ vim docker-compose.yml

เราสร้างไดเร็กทอรีว่างใหม่และสร้างไฟล์ docker-compose.yml ในนั้น เมื่อเราจะเรียกใช้ docker-compose จากไดเร็กทอรีนี้ มันจะค้นหาไฟล์เฉพาะนี้ (ละเว้นอย่างอื่น) และสร้างการปรับใช้ของเราตามนั้น เพิ่มเนื้อหาต่อไปนี้ในไฟล์ .yml นี้

รุ่น:'3'
บริการ:
my-nginx:
ภาพ: nginx:ล่าสุด
พอร์ต:
-'80: 80'

$ นักเทียบท่าเขียนขึ้น -d

เพิ่มแฟล็ก -d เพื่อให้คอนเทนเนอร์ที่สร้างขึ้นใหม่ทำงานในพื้นหลัง มิฉะนั้น เทอร์มินัลจะแนบตัวเองกับคอนเทนเนอร์และเริ่มพิมพ์รายงานจากคอนเทนเนอร์ ตอนนี้ เราสามารถเห็นสถิติของคอนเทนเนอร์ที่สร้างขึ้นใหม่:

$ docker stats -all

CONTAINER ID NAME CPU% MEM การใช้งาน/จำกัด MEM% NET I/O BLOCK I/O PIDS
5f8a1e2c08ac my-compose_my-nginx_10.00% 2.25MiB/1.934GiB0.11% 1.65kB/0B 7.35MB/0B2

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

$นักเทียบท่า-เขียนลง

การดำเนินการนี้จะทำให้นักเทียบท่ากลับสู่สถานะสะอาด ยกเว้นโวลุ่มใดๆ ที่สร้างขึ้น (เราไม่ได้สร้างสิ่งใดขึ้น ดังนั้นจึงไม่เป็นปัญหา)

ขีดจำกัดหน่วยความจำและการสำรองหน่วยความจำ

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

โดยทั่วไป Memory Limit กำหนดขีดจำกัดสูงสุดของจำนวนหน่วยความจำที่คอนเทนเนอร์ Docker สามารถใช้ได้ ตามค่าเริ่มต้น คอนเทนเนอร์ Docker ก็เหมือนกับกระบวนการอื่นๆ ของระบบ สามารถใช้หน่วยความจำที่มีอยู่ทั้งหมดของโฮสต์ Docker ซึ่งอาจทำให้ Out-of-Memory-Exception และระบบของคุณอาจขัดข้องได้เป็นอย่างดี แม้ว่าจะไม่เคยเกิดขึ้นมาก่อน แต่ก็ยังสามารถทำให้กระบวนการอื่น ๆ (รวมถึงคอนเทนเนอร์อื่น ๆ ) อดอยากจากทรัพยากรอันมีค่า ซึ่งส่งผลเสียต่อประสิทธิภาพการทำงานอีกครั้ง ขีดจำกัดหน่วยความจำช่วยให้มั่นใจได้ว่าคอนเทนเนอร์ที่หิวโหยทรัพยากรไม่เกินขีดจำกัดที่กำหนด ซึ่งจะจำกัดรัศมีการระเบิดของแอปพลิเคชันที่เขียนไม่ดีให้เหลือเพียงไม่กี่คอนเทนเนอร์ ไม่ใช่ทั้งโฮสต์

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

เพื่อสรุป:

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

หากการสำรองหน่วยความจำมากกว่าขีดจำกัดหน่วยความจำ ขีดจำกัดหน่วยความจำจะมีความสำคัญเหนือกว่า

การระบุขีดจำกัดหน่วยความจำและการสำรอง

รุ่น2

กลับไปที่ docker-compose.yml ที่เราเขียนไว้ก่อนหน้านี้และเพิ่มขีด จำกัด หน่วยความจำลงไป เปลี่ยนเวอร์ชันเป็น 2.4 ด้วยเหตุผลที่กล่าวถึงในส่วนข้อกำหนดเบื้องต้น

รุ่น:'2.4'
บริการ:
my-nginx:
ภาพ: nginx:ล่าสุด
พอร์ต:
-'80: 80'
mem_limit: 300m

บรรทัดสุดท้ายกำหนดขีด จำกัด สำหรับบริการ my-nginx เป็น 300MiB คุณสามารถใช้ k สำหรับ KiB และ g สำหรับ GiB และ b สำหรับไบต์เท่านั้น อย่างไรก็ตาม จำนวนก่อนหน้านั้นต้องเป็นจำนวนเต็ม คุณไม่สามารถใช้ค่าเช่น 2.4m คุณจะต้องใช้ 2400k แทน ตอนนี้ถ้าคุณเรียกใช้:

$ docker stat --all

CONTAINER ID NAME CPU% MEM การใช้งาน/จำกัด MEM % NET I/O BLOCK I/O PIDS
44114d785d0a my-compose_my-nginx_10.00% 2.141MiB/300MiB0.71% 1.16kB/0B 0B/0B2

คุณจะสังเกตเห็นว่าขีด จำกัด หน่วยความจำตั้งไว้ที่ 300 MiB การตั้งค่าการสำรองหน่วยความจำทำได้ง่ายพอๆ กัน เพียงเพิ่มบรรทัด mem_reservation: xxx ต่อท้าย

รุ่น:'2.4'
บริการ:
my-nginx:
ภาพ: nginx:ล่าสุด
พอร์ต:
-'80: 80'
mem_limit: 300m
mem_reservation: 100m

เวอร์ชัน 3 (ไม่บังคับ)

ในการใช้เวอร์ชัน 3 คุณต้องใช้งาน Docker ในโหมด Swarm สำหรับ Windows และ Mac คุณสามารถเปิดใช้งานได้โดยใช้เมนูการตั้งค่า Docker ผู้ใช้ Linux จะต้องเรียกใช้ docker swarm init ข้อมูลเพิ่มเติมเกี่ยวกับที่สามารถพบได้ ที่นี่ . แม้จะไม่ใช่ขั้นตอนที่จำเป็น และหากคุณไม่ได้เปิดใช้งาน ก็ถือว่าใช้ได้เช่นกัน ส่วนนี้สำหรับคนทั่วไป แล้ว ทำงานในโหมด swarm และสามารถใช้เวอร์ชันที่ใหม่กว่าได้

รุ่น:'3'
บริการ:
my-nginx:
ภาพ: nginx:ล่าสุด
พอร์ต:
-'80: 80'
ปรับใช้:
ทรัพยากร:
ขีดจำกัด:
หน่วยความจำ: 300m
การจอง:
หน่วยความจำ: 100m

เรากำหนดทั้งหมดนี้ภายใต้ตัวเลือกทรัพยากร ข้อจำกัดและการจองกลายเป็นคีย์หลักของมันเอง และหน่วยความจำก็เป็นหนึ่งในทรัพยากรจำนวนมากที่ได้รับการจัดการที่นี่ CPU เป็นอีกหนึ่งพารามิเตอร์ที่สำคัญ

ข้อมูลเพิ่มเติม

คุณสามารถเรียนรู้เพิ่มเติมเกี่ยวกับนักเทียบท่าเขียนได้จากเอกสารอย่างเป็นทางการ ลิงก์ไว้ที่นี่ . เมื่อคุณทราบส่วนสำคัญของวิธีเขียนไฟล์เขียนแล้ว เอกสารประกอบสามารถช่วยคุณเกี่ยวกับพารามิเตอร์ต่างๆ ที่เฉพาะเจาะจงได้

คุณไม่จำเป็นต้องรู้ทุกอย่าง เพียงแค่ค้นหาว่าแอปพลิเคชันของคุณต้องการอะไรและข้อมูลอ้างอิงจะแนะนำคุณในการใช้งาน