Skip to content

Latest commit

 

History

History
executable file
·
100 lines (77 loc) · 9.26 KB

15.Cgroup-and-resource-limit.md

File metadata and controls

executable file
·
100 lines (77 loc) · 9.26 KB

Tìm hiểu về cgroup và giới hạn tài nguyên Container.

Giới thiệu về Cgroups.

  • Control group hay cgroup được giới thiệu từ phiên bản Linux kernel 2.6.24, cho phép Linux giới hạn tài nguyên cho các tiến trình trong hệ thông như cpu, memory, băng thông mạng. Do dó có thể tối ưu hiệu năng của hệ thống.

  • Trong cgoups, Các tài nguyên được quản lý được gọi là subsystem và các tiến trình được quản lý được gọi là các task.

  • Các subsystem phỏ biến của cgroup:

    • cpu: sử dụng OS scheduler để cấp phát CPU cho các “task”.
    • cpuacct: báo cáo về trình trạng sử dụng CPU của các “task”.
    • cpuset: quy định cpu cho các task trong hệ thống nhiều cpu.
    • memory: giới hạn sử dụng bộ nhớ trên hệ thống.
    • blkio: giới hạn việc truy cập nhập/xuất(I/O) đến các thiết bị như ổ đĩa cứng.
    • net_prio: giới hạn băng thông mạng theo độ ưu tiên.
    • pids: giới hạn số lượng process được tạo

Docker sử dụng cgroup để giới hạn tài nguyên container.

Memory

  • Docker sử dụng cgroups để có thể giới hạn tài nguyên cho container. Nhưng mặc định, Docker không giới hạn tài nguyên các container.

  • Để giới hạn tài nguyên cho các container, thêm tùy chọn cho container khi chạy lệnh docker run

  • Trên một số host, khả năng giới hạn tài nguyên swap có thể sẽ không có mặc định. Để kiểm tra gõ lệnh docker info.

    • Nếu output có dòng sau thì kernel chưa hỗ trợ
    WARNING: No swap limit support
    
    • Nếu cần tính năng giới hạn swap thì thực hiện chỉnh sửa file /etc/default/grub, sửa hoặc thêm dòng GRUB_CMDLINE_LINUX với hai cặp giá trị sau:
    GRUB_CMDLINE_LINUX="cgroup_enable=memory swapaccount=1"
    

    lưu file.

    • Cập nhật GRUB:
    sudo update-grub
    
    • Thay đổi sẽ được áp dụng ở lần khởi động lại tiếp theo.

Rủi ro của việc hết bộ nhớ.

  • Trong Linux, khi hệ thống phát hiện không đủ mem để thực hiện các chương trình quan trọng, nó sẽ thực hiện kill các tiến trình khác để giải phóng bộ nhớ. Các tiến trình bị kill có thể là docker, các container, các ứng dụng,... -> Đây là hiện tượng Out Of Memory (OOM)

  • Docker đã cố giảm thiểu rủi do bằng các điều chỉnh mức độ ưu tiên OOM cho docker daemon để giảm khả năng bị kill của nó. Tuy nhiên, độ ưu tiên OOM không điều chỉnh được cho các container, nên các container vẫn có nguy cơ bị kill lớn khi gặp phải hiện tượng OOM.

  • Có thể giảm thiểu rủi do này với một số cách:

    • Kiểm tra và cấu hình giới hạn lượng bộ nhớ phù hợp cho ứng dụng mà container chạy:
    • Chạy container trên host mà đáp ứng đủ yêu cầu tài nguyên.
    • Cấu hình swap cho host.

Giới hạn tài nguyên bộ nhớ cho container.

  • Docker có thể giới hạn bộ nhớ cho container theo hai kiểu:
    • Hard limmit: Cho phép container sử dụng không quá một lượng bộ nhớ người dùng hay hệ thống.
    • Soft limmit: Cho phép container có thể sử dụng số lượng bộ nhớ theo nhu cầu của nó trừ khi một điều kiện nào đó thỏa mãn, ví dụ khi kernel phát hiện bộ nhớ thấp trên host.
  • Hầu hết các tùy chọn đều lấy một số nguyên dương và một trong các ký tự b, k, m, g để xác định bytes, kilobytes, megabytes, or gigabytes.
Tùy chọn Mô tả
-m hoặc --memory= Số lượng bộ nhớ tối đa container có thể sử dụng. Tối thiểu là 4m
--memory-swap Dung lượng bộ nhớ swap cấp cho container.
--memory-swappiness Cấu hình swapiness cho container
--memory-reservation Cho phép bạn chỉ định soft limit nhỏ hơn --memory, nó được kích hoạt khi Docker phát hiện sự tranh chấp hoặc bộ nhớ thấp trên máy chủ. Nếu bạn sử dụng --memory-reservation, giá trị này phải được set thấp hơn --memory để nó được ưu tiên. Bởi vì nó là 1 soft limit, nó không đảm bảo rằng container không vượt quá giới hạn.
--kernel-memory Dung lượng tối đa của kernel memory mà 1 container có thể sử dụng. Giá trị min cho phép: 4m. Do kernel memory không thể sử dụng bộ nhớ swap, nên nếu kernel memory của 1 container không đủ, thì nó sẽ block các tài nguyên ở trên host, và sẽ ảnh hưởng tới host và các containers khác
--oom-kill-disable Mặc định, nếu xảy ra lỗi out of mem, kernel sẽ thực hiện kill các tiến trình của 1 container. Để thay đổi điều này, ta có thể sử dụng options --oom-kill-disable. Ta chỉ disable oom ở trên container nào có set -m/--memory option. Nếu flag -m không được set, thì host có thể hết bộ nhớ và kernel có thể sẽ phải kill các tiến trình hệ thống của host để giải phóng bộ nhớ.

Chi tiết về --memory-swap

  • Tùy chọn --memory-swap chỉ có hiệu lực khi mà tùy chọn --memory được thiết lập. Sử dụng swap cho phép container ghi các bộ nhớ thừa vào disk khi mà container cạn kiệt tài nguyên Ram có sẵn cho nó.
  • Thiết lập của nó có thể có nhiều hiệu ứng phức tạp:
    • Nếu --memory-swap đi với một số nguyên dương thì cả --memory--memory-swap phải được thiết lập. --memory-swap đại diện cho tổng só lượng bộ nhớ ram và swap có thể sử dụng, --memory đại diện cho lượng bộ nhớ ram. ví dụ --memory=700m --memory-swap=1g thì container có thể sử dụng tối đa 700m ram và 300m swap.
    • Nếu giá trị --memory-swap=0 thì coi như giá trị này không được thiết lập.
    • Nếu cấu hình giá trị --memory-swap bằng với giá trị --memory thì container không có quyền truy cập swap
    • Nếu chỉ cấu hình --memory mà không có --memory-swap thì mặc định container sẽ sử dụng lượng swap bằng gấp đôi lượng ram.
    • Nếu memory-swap được thiết lập giá trị -1 thì container sẽ sử dụng không giới hạn lượng swap, tối đa theo swap trên host.

CPU

  • Mặc định docker sẽ không bị giới hạn truy cập tài nguyên CPU. Bạn có thể thiết lập nhiều hạn chế để giới hạn truy cập của container đến CPU.
  • Có thể cấu hình default CFS scheduler hoặc realtime scheduler.

Cấu hình default CFS scheduler.

  • CFS là CPU scheduler của Linux kernel cho các tiến trình Linux thông thường. Có nhiều tùy chọn để giới hạn truy cập CPU, khi sử dụng những cấu hình này, Docker sẽ sửa caifn đặt trong cgroup của container.
Tùy chọn Mô tả
--cpus= Quy định lượng tài nguyên cpu mà container có thể sử dụng, ví dụ: --cpu="1.5" thì container có thể sử dụng 1 và một nửa cpu của host. từ docker 1.13 trở lên
--cpu-period=<value> Specify the CPU CFS scheduler period, which is used alongside --cpu-quota. Defaults to 100 micro-seconds. Most users do not change this from the default. If you use Docker 1.13 or higher, use --cpus instead.
--cpu-quota=<value> Impose a CPU CFS quota on the container. The number of microseconds per --cpu-period that the container is limited to before throttled. As such acting as the effective ceiling. If you use Docker 1.13 or higher, use --cpus instead.
--cpuset-cpus Giới hạn container sử dụng những CPU được chỉ định. Nếu host có nhiều hơn một CPU thì cpu đầu tiên sẽ được đánh số bắt đầu từ 0. ví dụ --cpuset-cpus=0-2,5 thì container được sử dụng tài nguyên của cpu thứ 1,2,3 và 6 trên host
--cpu-shares Set this flag to a value greater or less than the default of 1024 to increase or reduce the container’s weight, and give it access to a greater or lesser proportion of the host machine’s CPU cycles. This is only enforced when CPU cycles are constrained. When plenty of CPU cycles are available, all containers use as much CPU as they need. In that way, this is a soft limit. --cpu-shares does not prevent containers from being scheduled in swarm mode. It prioritizes container CPU resources for the available CPU cycles. It does not guarantee or reserve any specific CPU access.

Nguồn tài liệu: https://github.com/TrongTan124/Timhieu-Docker/blob/master/docs/docker-canban/3.2.Cgroups.md https://docs.docker.com/config/containers/resource_constraints/

Tài liệu tham khảo thêm: