6.1 Lý do cần giới hạn tài nguyên của container
Docker làm rất tốt trong việc quản lý tài nguyên container, điều này giúp phân phối hiệu quả sức mạnh của hệ thống và tránh các xung đột không đáng có giữa các container. Điều này đặc biệt quan trọng để đảm bảo rằng ứng dụng trong một container không "ăn hết" tài nguyên và làm chậm hiệu suất của các dịch vụ khác. Giới hạn các tài nguyên như CPU và bộ nhớ sẽ giúp tránh tình trạng quá tải, duy trì ổn định cho hệ thống và đảm bảo tất cả các ứng dụng hoạt động một cách dự đoán được. Trong bài giảng này, tụi mình sẽ tìm hiểu cách đặt giới hạn cho việc sử dụng CPU và bộ nhớ để hệ thống vẫn năng suất ngay cả khi tải cao.
Tại sao việc giới hạn tài nguyên container lại quan trọng:
- ổn định: Ngăn chặn tình huống mà một container chiếm hết tài nguyên, dẫn đến việc các container khác hoặc chính hệ thống bị chậm lại.
- hiệu quả: Phân phối tài nguyên tốt hơn giữa các container, để tận dụng tối đa sức mạnh của hệ thống.
- bảo vệ: Giới hạn tài nguyên giúp tránh các vấn đề với container có thể vô tình hoặc cố ý làm quá tải hệ thống.
6.2 Giới hạn sử dụng CPU
Docker cung cấp một vài cách để giới hạn việc sử dụng CPU
của các container.
Quan trọng!
Ở đây CPU
được hiểu là 1 lõi của bộ xử lý, không phải toàn bộ bộ xử lý. Bộ xử lý 4 lõi sẽ có 4 CPU
.
1. Giới hạn mức chia sẻ CPU (--cpu-shares)
Tham số --cpu-shares
đặt giá trị ưu tiên tương đối cho việc sử dụng CPU của container. Giá trị mặc định là 1024. Đây là một giá trị tương đối, nghĩa là container với --cpu-shares=512
sẽ có một nửa mức ưu tiên so với container với --cpu-shares=1024
.
Ví dụ sử dụng:
Trong ví dụ này, container high_priority_container
sẽ có mức độ ưu tiên sử dụng CPU
cao hơn so với low_priority_container
.
docker run -d --name low_priority_container --cpu-shares=512 nginx
docker run -d --name high_priority_container --cpu-shares=2048 nginx
2. Giới hạn số lượng CPU (--cpus)
Tham số --cpus
đặt số lượng chính xác CPU
khả dụng cho container. Ví dụ, giá trị 1.5 có nghĩa là container có thể sử dụng 1.5 CPU
.
Ví dụ sử dụng:
Ví dụ này giới hạn container limited_cpu_container
không sử dụng nhiều hơn 1.5 CPU
.
docker run -d --name limited_cpu_container --cpus="1.5" nginx
3. Giới hạn thời gian sử dụng CPU
(--cpu-quota và --cpu-period)
Tham số --cpu-quota
và --cpu-period
cho phép cấu hình chi tiết hơn việc sử dụng CPU
. --cpu-period
đặt khoảng thời gian trong micro giây (mặc định là 100000), còn --cpu-quota
đặt thời gian tối đa cho phép sử dụng CPU
trong khoảng thời gian đó.
Ví dụ sử dụng:
Trong ví dụ này, container custom_cpu_quota_container
sẽ sử dụng không quá 50% CPU
(25000/50000).
docker run -d --name custom_cpu_quota_container --cpu-period=50000 --cpu-quota=25000 nginx
6.3 Giới hạn sử dụng RAM
Giới hạn RAM cho phép kiểm soát container có thể sử dụng bao nhiêu bộ nhớ RAM. Điều này giúp tránh được tình trạng một container chiếm hết bộ nhớ, làm ảnh hưởng đến các tiến trình và container khác.
1. Giới hạn dung lượng RAM tối đa (--memory)
Tham số --memory
đặt giới hạn trên của RAM mà container có thể sử dụng. Nếu container vượt quá giới hạn này, hệ thống sẽ dừng nó lại.
Ví dụ sử dụng:
Ví dụ này giới hạn container limited_memory_container
chỉ sử dụng tối đa 512 MB RAM.
docker run -d --name limited_memory_container --memory="512m" nginx
2. Giới hạn dung lượng bộ nhớ swap (--memory-swap)
Tham số --memory-swap
đặt giới hạn tổng cho RAM và swap. Ví dụ, nếu --memory
được đặt là 512 MB và --memory-swap
là 1 GB, container có thể sử dụng tối đa 512 MB RAM và thêm 512 MB swap.
Ví dụ sử dụng:
Ví dụ này giới hạn container swap_limited_container
sử dụng 512 MB RAM và 512 MB swap.
docker run -d --name swap_limited_container --memory="512m" --memory-swap="1g" nginx
3. Giới hạn sử dụng RAM không dùng swap (--memory-swap=-1)
Để cấm sử dụng swap, hãy đặt tham số --memory-swap
thành giá trị -1.
Ví dụ sử dụng:
Ví dụ này giới hạn container no_swap_container
512 MB RAM mà không dùng swap.
docker run -d --name no_swap_container --memory="512m" --memory-swap="-1" nginx
6.4 Tình huống thực tế
1. Chạy các tác vụ ưu tiên cao và ưu tiên thấp
Nếu trên một server có các tác vụ quan trọng và tác vụ phụ, tham số --cpu-shares
giúp phân bố tài nguyên sao cho các tác vụ quan trọng nhận được nhiều CPU
hơn.
docker run -d --name high_priority_task --cpu-shares=2048 my_high_priority_image
docker run -d --name low_priority_task --cpu-shares=512 my_low_priority_image
2. Giới hạn tài nguyên để kiểm thử
Để kiểm thử ứng dụng trong điều kiện tài nguyên bị giới hạn, có thể đặt ra các giới hạn chặt chẽ về CPU
và bộ nhớ. Điều này giúp hiểu rõ ứng dụng sẽ hoạt động ra sao trong các giới hạn này.
docker run -d --name test_container --cpus="1" --memory="256m" my_test_image
3. Bảo vệ khỏi việc cạn kiệt tài nguyên
Để tránh tình huống một container sử dụng tất cả tài nguyên của hệ thống, có thể thiết lập giới hạn về bộ nhớ và CPU
cho tất cả các container.
docker run -d --name isolated_container --cpus="2" --memory="1g" my_app_image
GO TO FULL VERSION