Dùng LXC container để giới hạn tài nguyên tính toán - cpu (phần 3)
LXC
3
Linux
91
White

Bùi Hồng Hà viết ngày 12/08/2015

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 200000cpu.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)

alt text

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_uscpu.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:

alt text

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.

Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

Bùi Hồng Hà

59 bài viết.
297 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
80 8
Bài viết tổng hợp cơ chế hoạt động của https Chút ít về chữ ký điện tử Chữ ký điện tử là cơ chế bao gồm 3 thuật toán: Thuật toán chọn một khóa...
Bùi Hồng Hà viết hơn 3 năm trước
80 8
White
45 7
Giới thiệu Gần đây thấy bản thân chém gió rất nhiều về MapReduce, Hadoop v.v nhưng chưa thấy có bài viết nào tổng hợp + giải thích cụ thể về MapRe...
Bùi Hồng Hà viết gần 3 năm trước
45 7
White
37 0
Giới thiệu Google là một công ty dẫn đầu về phần mềm xử lý Big Data. Hầu hết các phần mềm xử lý dữ liệu như Hadoop đều có nguồn gốc ý tưởng từ Goo...
Bùi Hồng Hà viết gần 3 năm trước
37 0
Bài viết liên quan
White
1 0
sudo du sh
t viết hơn 2 năm trước
1 0
White
34 10
Thời kỳ mới đi làm tôi nghĩ cứ phải gõ thật nhiều cho quen cho nhớ nhưng lâu dần việc đó cho cảm giác thật nhàm chán. Hiện giờ, những gì tôi hay là...
manhdung viết hơn 3 năm trước
34 10
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
59 bài viết.
297 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!