ตั้งค่าขีด จำกัด CPU ใน Docker Compose

ฉันมีเซิร์ฟเวอร์ภายในองค์กรซึ่งฉันต้องการปรับใช้ไมโครเซอร์วิสจำนวนมาก ฉันใช้ไฟล์นักเทียบท่าเพื่อประกาศบริการทั้งหมดและต้องการตั้งค่าขีดจำกัด cpu ฉันอ้างอิงเอกสารด้านล่าง: https://docs.docker.com/compose/compose-file/ ไฟล์เขียนนักเทียบท่าของฉันมีลักษณะดังนี้:

version: "3.7"
services:
  redis:
    image: redis:alpine
    deploy:
      resources:
        limits:
          cpus: '2'
          memory: 256M
        reservations:
          cpus: '0.25'
          memory: 64M
  service1:
    image: service1 image
    deploy:
      resources:
        limits:
          cpus: '2'
          memory: 512M
        reservations:
          cpus: '0.25'
          memory: 64M

...

ฉันสับสนในการคำนวณขีดจำกัดซีพียู เช่น cpu มี 8 core มีไมโครเซอร์วิส 20 รายการ มีวิธีใดบ้างที่ฉันสามารถคำนวณขีดจำกัด cpu ของแต่ละบริการได้ หรือมีสูตรอะไรให้ทำบ้าง?

----- อัปเดต ------ เพื่อให้ชัดเจนยิ่งขึ้น ประเด็นหลักของฉันที่นี่คือขีดจำกัดของ CPU เป็นเพราะฉันต้องการส่งการแจ้งเตือนหาก CPU ของไมโครเซอร์วิสหนึ่งใช้ 80% ของ CPU สำหรับไมโครเซอร์วิสนั้น หากฉันไม่ได้ตั้งค่าขีดจำกัด cpu เป็นจริงหรือไม่ที่การใช้งาน CPU ของไมโครเซอร์วิสจะเหมือนกันกับการใช้งาน CPU ของโฮสต์ ฉันไม่ได้ใช้ Docker's Swarn แต่ใช้ Docker เท่านั้น

ความคิดใด ๆ ที่ชื่นชมจริงๆ

ขอบคุณ,


person Kenny Tai Huynh    schedule 09.01.2020    source แหล่งที่มา


คำตอบ (1)


การมี CPU ที่คอมมิตมากเกินไปไม่ใช่ปัญหาจริงๆ หากคุณมี 16 กระบวนการและกระบวนการทั้งหมดพยายามทำงานที่ต้องใช้ CPU 100% บนระบบ 8 คอร์ เคอร์เนลจะแบ่งเวลาระหว่างกระบวนการต่างๆ ในทางปฏิบัติคุณควรคาดหวังว่ากระบวนการเหล่านั้นจะได้รับ CPU 50% ในแต่ละกระบวนการและงานจะใช้เวลานานกว่าสองเท่า คำแนะนำอย่างหนึ่งที่ฉันได้ยิน (ในพื้นที่ Kubernetes) คือการตั้งค่าคำขอ CPU ตามความต้องการโหลดสถานะคงที่ของบริการ และอย่าตั้งค่าขีดจำกัดของ CPU

ไม่มีสูตรวิเศษที่จะกำหนดตัวเลขเหล่านี้ วิธีที่ดีที่สุดคือการตั้งค่าระบบตัววัดบางอย่าง เช่น Prometheus รันระบบแบบรวม และดูการใช้ทรัพยากรจริง ในบางกรณี เป็นไปได้ที่จะรู้ว่ากระบวนการเป็นแบบเธรดเดียวและจะไม่ใช้มากกว่า 1 คอร์ หรือคุณคาดว่ากระบวนการจะถูกผูกกับ I/O และหากไม่เป็นเช่นนั้นก็ควรถูกควบคุมปริมาณ แต่โดยยึดตามการตั้งค่าเหล่านี้ตามจริง การใช้งานน่าจะดีกว่า

(หน่วยความจำแตกต่างออกไป โดยที่หน่วยความจำกายภาพอาจหมดได้จริง แต่กระบวนการนั้นสามารถกักเก็บหน่วยความจำได้มากกว่าที่พวกเขาต้องการจริงๆ เครื่องมือเมตริกจะมีประโยชน์อีกครั้งที่นี่)

คำถามของคุณแนะนำโฮสต์เดียว ส่วน deploy: ใช้งานได้กับ Swarm Cluster Manager ของ Docker เท่านั้น หากคุณไม่ได้ใช้ Swarm คุณจะต้องใช้ไฟล์ version: '2' docker-compose.yml ซึ่งมี ชุดการประกาศข้อจำกัดด้านทรัพยากรชุดอื่น (และส่วนใหญ่ไม่มีแนวคิดเรื่อง "การจอง") ตัวอย่างเช่น,

version: '2'
services:
  redis:
    image: redis:alpine
    # cpus: 2.0
    mem_limit: 256m
    mem_reservation: 64m
person David Maze    schedule 09.01.2020
comment
+1 สำหรับ @David Maze อย่างน้อยสำหรับคำตอบ ใช่ ในกรณีของฉัน ข้อกำหนดคือเพียงใช้ Docker ในเซิร์ฟเวอร์ภายในองค์กร ไม่มี Docker's Swarm ประเด็นหลักของฉันที่นี่คือขีดจำกัดของ CPU เป็นเพราะฉันต้องการส่งการแจ้งเตือนหาก CPU ของไมโครเซอร์วิสหนึ่งใช้ 80% ของ CPU สำหรับไมโครเซอร์วิสนั้น หากฉันไม่ได้ตั้งค่าขีดจำกัด cpu เป็นจริงหรือไม่ที่การใช้งาน CPU ของไมโครเซอร์วิสจะเหมือนกันกับการใช้งาน CPU ของโฮสต์ - person Kenny Tai Huynh; 09.01.2020