Bạn có chắc chắn muốn xóa bài viết này không ?
Bạn có chắc chắn muốn xóa bình luận này không ?
Dùng LXC container để giới hạn tài nguyên tính toán - cpu (phần 3)
Giới thiệu
Trong phần 2, mình đã giới thiệu về các biến giới hạn tài nguyên I/O của subsystem blkio cũng như làm 2 thực nghiệm đối với subsystem này. Trong phần 3 này, mình sẽ giới thiệu về cách cgroup giới hạn tài nguyên cpu thông qua subsystem: cpu
CPU subsystem
cpu subsystem xếp lịch truy cập CPU cho các cgroups. Việc xếp lịch này được thực hiện bởi 2 chính sách lập lịch sau:
- Completely Fair Scheduler (CFS): lập lịch theo tỉ lệ. CFS chia thời gian sử dụng cpu của các cgroups theo tỉ lệ truy cập mà các cgroups này được thiết lập
- Real-Time Scheduler (RT): cho phép xác định thời gian cpu thực mà một tác vụ có thể sử dụng.
Các biến số của CFS
Biến số | Ý nghĩa |
---|---|
cpu.cfs_period_us | Xác định thời gian (tính bằng micro giây) một cgroup thường xuyên truy cập CPU. Nếu 1 tác vụ cần truy cập CPU 0.2 giây cứ sau 1s, cài đặt biến cpu.cfs_quota_us thành 200000 và cpu.cfs_period_us thành 1000000 |
cpu.cfs_quota_us | Tổng thời gian (tính bằng micro giây) mà một tác vụ có thể chạy trong 1 giai đoạn nào đấy |
cpu.stat | Thông báo thống kê thời gian sử dụng CPU |
cpu.shares | Giá trị số nguyên về tỉ lệ tương đối thời gian CPU của 1 tasks |
Có một chú ý là nếu như tài nguyên CPU thừa thãi, tác vụ có thể sẽ nhận được tài nguyên nhiều hơn mức bị giới hạn.
Các biến số của RT
Ý nghĩa của các biến dưới đây tương đồng với biến của CFS, chỉ khác là nó được áp dụng cho các tác vụ real-time.
Biến số | Ý nghĩa |
---|---|
cpu.rt_period_us | Thời gian 1 tác vụ thời gian thực (real-time) được cấp cpu |
cpu.rt_runtime_us | Thời gian dài nhất 1 tác vụ có truy cập đến cpu. |
Thực nghiệm
Thực nghiệm về tỉ lệ tương đối giữa các task
Ta sẽ tạo 2 containers và giới hạn tài nguyên cpu của 2 containers thông qua cgroups theo tỉ lệ 750:250. Điều này nghĩa là 1 cgroup có thời gian sử dụng cpu nhiều hơn gấp đôi so với cgroup còn lại.
Bước 1: Chuẩn bị
$ cat /var/lib/lxc/test/config
.....
lxc.cgroup.cpu.shares = 250
lxc.cgroup.cpuset.cpus = 0
$ cat /var/lib/lxc/test_io/config
.....
lxc.cgroup.cpu.shares = 750
lxc.cgroup.cpuset.cpus = 0
Ở đây do cpu cores của mình nhiều --> thừa cpu cores nên mình thêm cpuset.cpus = 0 nghĩa là chỉ sử dụng core số 0. Chi tiết về cpuset subsystem sẽ được giới thiệu ở phần sau.
Bước 2: Chạy thực nghiệm
Để kiểm tra cpu shares, mình thử nghiệm 1 chương trình dễ hiểu cho cpu chạy 100% công suất. Chương trình đơn giản dùng 1 vòng lặp vô hạn không làm gì cả để cho cpu quay điên cuồng
#include <stdio.h>
int main() {
while(1) { }
return 0;
}
Chương trình sẽ được compile và chạy trên 2 container khác nhau:
[root@test ~]# ./test
[root@test_io ~]# ./test_io
Bước 3: Quan sát kết quả
Ở máy host, mình chạy lệnh top
và quan sát TIME
mỗi process dành cpu. Mình có kết quả như trong hình (sau khi để các process chạy 1 lúc)
Ta có thể quan sát được là:
- CPU0 hoạt động 100% công suất
- Thời gian cpu của test_io lớn hơn gấp đôi thời gian cpu của test.
Thực nghiệm 2: Giới hạn thời gian cpu
Để kiểm chứng 2 biến cpu.cfs_quota_us và cpu.cfs_period_us, mình sẽ tiến hành bằng cách chỉ chạy 1 container và giới hạn tài nguyên cpu với container đấy. Như ở thực nghiệm trên, ta đã quan sát được rằng với vòng lập vô hạn, cpu sẽ quan điên cuồng đến 100% năng lực. Ta sẽ giới hạn chỉ cho cgroup sử dụng 50% thời gian cpu và quan sát kết quả.
Bước 1: Chuẩn bị
Tạo 1 cgroup với thời gian cpu (quota) bằng 1/2 thời gian được sử dụng
$ cat /var/lib/lxc/test/config
...
lxc.cgroup.cpu.cfs_quota_us = 500000
lxc.cgroup.cpu.cfs_period_us = 1000000
lxc.cgroup.cpuset.cpus = 0
Con số có ý nghĩa là cpu 0, cứ 1s cpu được gán cho tác vụ thì chỉ cho quota cho tác vụ là 0.5s.
Bước 2: chạy chương trình
Ta sẽ vẫn sử dụng chương trình spin cpu ở trên
$ cat test.c
#include <stdio.h>
int main() {
while(1) { }
return 0;
}
$ ./test
Bước 3: quan sát kết quả
Mình thực hiện và có kết quả như ở hình dưới đây:
Ta có thể quan sát được rằng: khi cpu0 được gán cho container test, cpu chỉ sử dụng tối đa là 50% năng lực của cpu, đúng như cài đặt
Kết luận
Bài viết giới thiệu về cpu subsystem của cgroup, các biến số giới hạn cpu của 2 chính sách lập lịch cpu là CFS và RT. Bài viết cũng trình bày 2 thực nghiệm để kiểm chứng hoạt động của các biến số này.
Các phần sau sẽ dần dần giới thiệu các subsystem liên quan đến cpu khác: cụ thể là cpuset và cpuact.





