Tetapkan batas CPU di Docker Compose

Saya mendapatkan server lokal yang ingin saya gunakan banyak layanan mikro. Saya menggunakan file penulisan buruh pelabuhan untuk mendeklarasikan semua layanan dan ingin menetapkan batas cpu. Saya merujuk dokumen di bawah ini: https://docs.docker.com/compose/compose-file/ File penulisan buruh pelabuhan saya seperti:

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

...

Saya bingung menghitung batas CPU. Misalnya CPUnya 8 core. Ada 20 layanan mikro. Apakah ada cara untuk menghitung batas CPU setiap layanan? Atau ada formula untuk melakukannya?

----- UPDATE ------ Agar lebih jelas, poin utama saya di sini adalah batas CPU. Itu karena saya ingin mengirimkan peringatan jika CPU dari satu layanan mikro menggunakan 80% CPU untuk layanan mikro tersebut. Jika saya tidak menetapkan batas cpu, apakah benar penggunaan CPU microservice akan sama dengan penggunaan CPU host? Saya tidak menggunakan Swarn Docker tetapi Docker saja.

Setiap ide sangat dihargai.

Terima kasih,


person Kenny Tai Huynh    schedule 09.01.2020    source sumber


Jawaban (1)


Memiliki CPU yang terlalu berkomitmen sebenarnya tidak menjadi masalah. Jika Anda memiliki 16 proses dan semuanya mencoba melakukan pekerjaan yang memerlukan 100% CPU pada sistem 8-inti, kernel akan membagi waktu di seluruh proses; dalam praktiknya, Anda seharusnya mengharapkan proses-proses tersebut mendapatkan masing-masing 50% CPU dan tugasnya hanya memakan waktu dua kali lebih lama. Salah satu saran yang pernah saya dengar (di ruang Kubernetes) adalah mengatur permintaan CPU berdasarkan persyaratan beban layanan dalam kondisi stabil, dan tidak menetapkan batas CPU.

Tidak ada rumus ajaib untuk menetapkan salah satu dari angka-angka ini. Cara terbaik adalah menyiapkan beberapa sistem metrik seperti Prometheus, menjalankan sistem gabungan Anda, dan melihat pemanfaatan sumber daya sebenarnya. Dalam beberapa kasus, mungkin untuk mengetahui bahwa suatu proses adalah single-threaded dan tidak akan pernah menggunakan lebih dari 1 inti, atau bahwa Anda mengharapkan suatu proses terikat I/O dan jika tidak maka harus dibatasi, namun mendasarkan pengaturan ini pada aktual penggunaan mungkin lebih baik.

(Memori berbeda, karena Anda sebenarnya bisa kehabisan memori fisik, namun proses juga mampu menyimpan lebih banyak memori daripada yang sebenarnya dibutuhkan. Sekali lagi alat metrik akan sangat membantu di sini.)

Pertanyaan Anda menyarankan satu host. Bagian deploy: hanya berfungsi dengan manajer cluster Swarm Docker. Jika Anda tidak menggunakan Swarm maka Anda perlu menggunakan file version: '2' docker-compose.yml, yang memiliki serangkaian deklarasi batasan sumber daya yang berbeda (dan sebagian besar tidak memiliki konsep "reservasi"). Misalnya,

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 untuk @David Maze setidaknya untuk jawabannya. Ya, dalam kasus saya, persyaratannya hanya menggunakan Docker di server lokal. Tidak ada Kawanan Docker. Poin utama saya di sini adalah batas CPU. Itu karena saya ingin mengirimkan peringatan jika CPU dari satu layanan mikro menggunakan 80% CPU untuk layanan mikro tersebut. Jika saya tidak menetapkan batas cpu, apakah benar penggunaan CPU microservice akan sama dengan penggunaan CPU host? - person Kenny Tai Huynh; 09.01.2020