Control Groups (cgroups) trong Linux là gì?

Nhóm là gì

Nhóm là một cơ chế đặc biệt được cung cấp bởi nhân Linux cho phép chúng ta phân bổ các loại tài nguyên như thời gian xử lý, số lượng tiến trình trên mỗi nhóm, dung lượng bộ nhớ cho mỗi nhóm hoặc kết hợp các tài nguyên đó cho một quy trình hoặc một bộ quy trình. Các nhóm được tổ chức theo hình thức phân cấp và cơ chế này tương tự như các quy trình thông thường, bởi vì chúng cũng được tổ chức theo hình thức phân cấp và nhóm trẻ em (còn được gọi là nhóm con) kế thừa một bộ tham số nhất định từ nhóm phụ huynh (cha nhóm). Nhưng thực sự, chúng không giống nhau. Sự khác biệt chính giữa các nhóm và quy trình thông thường là có nhiều cấp độ nhóm kiểm soát khác nhau có thể tồn tại cùng một lúc, trong khi cây cây bình thường luôn chỉ có một hệ thống phân cấp. Hệ thống phân cấp này không ngẫu nhiên vì mỗi hệ thống phân cấp nhóm điều khiển được gắn vào tập hợp hệ thống con nhóm kiểm soát.

Một hệ thống con của nhóm điều khiển biểu thị một loại tài nguyên như thời gian của bộ xử lý hoặc số pid – nói cách khác, số lượng quy trình cho một nhóm điều khiển. Nhân Linux hỗ trợ 12 hệ thống con nhóm điều khiển như sau:

  • cpuset: gán các bộ xử lý và nút bộ nhớ riêng cho các tác vụ trong một nhóm.
  • CPU: Sử dụng bộ lập lịch để cung cấp quyền truy cập vào các tác vụ nhóm cho tài nguyên bộ xử lý.
  • cpuacct: tạo báo cáo sử dụng bộ xử lý theo nhóm
  • io: đặt giới hạn đọc / ghi từ / đến khối thiết bị.
  • ký ức: Đặt giới hạn cho việc sử dụng bộ nhớ theo các tác vụ từ một nhóm.
  • thiết bị: Cho phép truy cập vào các thiết bị theo các tác vụ từ một nhóm.
  • tủ đông: Cho phép tạm dừng / tiếp tục các nhiệm vụ từ một nhóm.
  • net_cls: cho phép đánh dấu các gói mạng từ các tác vụ trong một nhóm.
  • net_prio: cung cấp cài đặt tự động ưu tiên lưu lượng mạng cho mỗi giao diện mạng từ một nhóm.
  • hoàn hảo: cung cấp quyền truy cập perf_event cho một nhóm.
  • ômetlb: bật hỗ trợ cho các trang lớn cho một nhóm.
  • pid: Đặt giới hạn về số lượng quy trình cho một nhóm.
>>> Xem thêm:  Hướng dẫn cấu hình Nginx sử dụng Let’s Encrypt trên Ubuntu...

Mỗi hệ thống con nhóm điều khiển phụ thuộc vào các tùy chọn cấu hình liên quan. Ví dụ, hệ thống con cpuset nên được kích hoạt thông qua các tùy chọn cấu hình kernel CONFIG_CPUSETS, io hệ thống con thông qua các tùy chọn cấu hình kernel CONFIG_BLK_CGROUP, … Tất cả các tham số cấu hình kernel có thể được tìm thấy trong Cài đặt chung -> Nhóm điều khiển như dưới đây.

Bạn có thể thấy các nhóm điều khiển được kích hoạt trên máy tính của mình thông qua hệ thống tập tin.

$ cat /proc/cgroups
#subsys_name	hierarchy	num_cgroups	enabled
cpuset	8	6	1
cpu	6	150	1
cpuacct	6	150	1
blkio	12	150	1
memory	3	198	1
devices	9	150	1
freezer	11	6	1
net_cls	5	6	1
perf_event	4	6	1
net_prio	5	6	1
hugetlb	2	6	1
pids	10	158	1
rdma	7	1	1

Hoặc thông qua sysfs

$ ls -l /sys/fs/cgroup/
total 0
dr-xr-xr-x 6 root root  0 Thg 3   5 08:58 blkio
lrwxrwxrwx 1 root root 11 Thg 3   5 08:58 cpu -> cpu,cpuacct
lrwxrwxrwx 1 root root 11 Thg 3   5 08:58 cpuacct -> cpu,cpuacct
dr-xr-xr-x 6 root root  0 Thg 3   5 08:58 cpu,cpuacct
dr-xr-xr-x 3 root root  0 Thg 3   5 08:58 cpuset
dr-xr-xr-x 6 root root  0 Thg 3   5 08:58 devices
dr-xr-xr-x 3 root root  0 Thg 3   5 08:58 freezer
dr-xr-xr-x 3 root root  0 Thg 3   5 08:58 hugetlb
dr-xr-xr-x 6 root root  0 Thg 3   5 08:58 memory
lrwxrwxrwx 1 root root 16 Thg 3   5 08:58 net_cls -> net_cls,net_prio
dr-xr-xr-x 3 root root  0 Thg 3   5 08:58 net_cls,net_prio
lrwxrwxrwx 1 root root 16 Thg 3   5 08:58 net_prio -> net_cls,net_prio
dr-xr-xr-x 3 root root  0 Thg 3   5 08:58 perf_event
dr-xr-xr-x 6 root root  0 Thg 3   5 08:58 pids
dr-xr-xr-x 2 root root  0 Thg 3   5 08:58 rdma
dr-xr-xr-x 6 root root  0 Thg 3   5 08:58 systemd
dr-xr-xr-x 5 root root  0 Thg 3   5 08:58 unified

Như bạn có thể đoán, cơ chế nhóm điều khiển không phải là cơ chế duy nhất được phát minh trực tiếp cho nhân Linux, mà chủ yếu là cho không gian người dùng. Để sử dụng nhóm điều khiển, bạn nên tạo nó ngay từ đầu. Chúng ta có thể tạo một nhóm theo hai cách sau:

  • Cách đầu tiên là tạo các thư mục con trong bất kỳ hệ thống con nào từ / sys / fs / cgroup và thêm pid của tác vụ vào File nhiệm vụ – File sẽ được tạo tự động sau khi chúng tôi tạo thư mục con.
  • Cách thứ hai là tạo / hủy / quản lý các nhóm với các tiện ích từ thư viện libcgroup.
>>> Xem thêm:  Hướng dẫn quay video màn hình trên Ubuntu 18.04

Chúng tôi sẽ xem xét một ví dụ đơn giản. Lệnh bash bên dưới sẽ in một dòng tới thiết bị / dev / tty

#!/bin/bash

while :
do
    echo "print line" > /dev/tty
    sleep 5
done

Vì vậy, nếu chúng tôi chạy tập lệnh này, chúng tôi sẽ thấy kết quả sau:

$ sudo chmod +x cgroup_test_script.sh
~$ ./cgroup_test_script.sh 
print line
print line
print line
...
...
...

Tiếp theo đi đến địa điểm nhóm gắn trên máy tính. Như bạn thấy, đây là thư mục / sys / fs / cgroup, nhưng bạn có thể gắn nó bất cứ khi nào bạn muốn.

$ cd /sys/fs/cgroup

Và bây giờ tiếp tục đi đến thư mục con thiết bị Đại diện cho loại tài nguyên cho phép hoặc từ chối truy cập vào thiết bị theo các tác vụ trong một nhóm:

# cd devices

Và tạo thư mục cgroup_test_group đây

# mkdir cgroup_test_group

Sau khi tạo thư mục cgroup_test_group, phần sau sẽ được tạo tự động

/sys/fs/cgroup/devices$ ll cgroup_test_group/
total 0
drwxr-xr-x 2 root root 0 Thg 3   7 12:17 ./
dr-xr-xr-x 8 root root 0 Thg 3   5 08:58 ../
-rw-r--r-- 1 root root 0 Thg 3   7 12:17 cgroup.clone_children
-rw-r--r-- 1 root root 0 Thg 3   7 12:17 cgroup.procs
--w------- 1 root root 0 Thg 3   7 12:17 devices.allow
--w------- 1 root root 0 Thg 3   7 12:17 devices.deny
-r--r--r-- 1 root root 0 Thg 3   7 12:17 devices.list
-rw-r--r-- 1 root root 0 Thg 3   7 12:17 notify_on_release
-rw-r--r-- 1 root root 0 Thg 3   7 12:17 tasks

Ở đây, tôi chỉ quan tâm đến nhiệm vụ tập tintập tin thiết bị. File tác vụ đầu tiên phải chứa pid của các quy trình sẽ được gắn vào cgroup_test_group. File thứ hai, device.deny, chứa danh sách các thiết bị bị cấm. Theo mặc định, một nhóm mới được tạo sẽ không có bất kỳ hạn chế truy cập nào trên bất kỳ thiết bị nào. Để cấm một thiết bị (trong trường hợp này là / dev / tty) chúng tôi sẽ ghi vào tập tin device.deny với nội dung sau:

# echo "c 5:0 w" > devices.deny

Bây giờ chúng tôi sẽ phân tích ý nghĩa của dòng này. Lời c Đầu tiên đại diện cho loại thiết bị. Trong trường hợp của tôi, ví dụ là / dev / tty. Chúng tôi có thể xác minh từ đầu ra của câu lệnh ls:

$ ls -l /dev/tty
crw-rw-rw- 1 root tty 5, 0 Thg 3   7 12:17 /dev/tty

Xem các nhân vật c đầu tiên trong danh sách sự cho phép trong thông số trên. Phần thứ hai là 5: 0 là số chính và phụ của thiết bị. Bạn có thể thấy những con số này trong đầu ra của câu lệnh ls. Và nhân vật w Cuối cùng, để cấm hoạt động ghi vào thiết bị này. Bây giờ tôi sẽ chạy tập tin scrip cgroup_test_script.sh với kết quả như sau:

~$ ./cgroup_test_script.sh 
print line
print line
print line
...
...

Ghi chú: Trên đây là kết quả của việc chạy tập lệnh được ghi vào thiết bị khi các nhóm không được sử dụng cho quy trình này.

>>> Xem thêm:  Hướng dẫn kiểm tra phiên bản Linux

Sau đó thêm pid process vào File thiết bị / cgroup_test_group / task của nhóm.

# echo $(pidof -x cgroup_test_script.sh) > /sys/fs/cgroup/devices/cgroup_test_group/tasks

Kết quả của việc chạy tập lệnh này sẽ tương tự như sau:

~$ ./cgroup_test_script.sh 
print line
print line
print line
print line
print line
print line
./cgroup_test_script.sh: line 5: /dev/tty: Operation not permitted

Tình huống tương tự sẽ xảy ra khi bạn chạy docker, chẳng hạn như thùng chứa ví dụ bên dưới:

~$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
fa2d2085cd1c        mariadb:10          "docker-entrypoint..."   12 days ago         Up 4 minutes        0.0.0.0:3306->3306/tcp   mysql-work

~$ cat /sys/fs/cgroup/devices/docker/fa2d2085cd1c8d797002c77387d2061f56fefb470892f140d0dc511bd4d9bb61/tasks | head -3
5501
5584
5585
...
...
...

Vì vậy, trong quá trình khởi tạo docker container, bến tàu sẽ tạo một nhóm cho các quy trình trong thùng chứa này.

$ docker exec -it mysql-work /bin/bash
$ top
  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                                                                   1 mysql     20   0  963996 101268  15744 S   0.0  0.6   0:00.46 mysqld
   71 root      20   0   20248   3028   2732 S   0.0  0.0   0:00.01 bash
   77 root      20   0   21948   2424   2056 R   0.0  0.0   0:00.00 top

Và chúng ta có thể thấy nhóm này trên máy chủ

$ systemd-cgls

Control group /:
-.slice
├─docker
│ └─fa2d2085cd1c8d797002c77387d2061f56fefb470892f140d0dc511bd4d9bb61
│   ├─5501 mysqld
│   └─6404 /bin/bash

Bây giờ chúng ta đã biết một chút về cơ chế nhóm điều khiển, cách sử dụng thủ công và mục đích của cơ chế này là gì.

Xem thêm nhiều bài khác tại : https://excel-cracker.com/he-dieu-hanh

Comments are closed.