Với Centos 7, có nhiều thứ tưởng chừng không mới, đã có trong các phiên bản trước của Centos 6 nhưng nó thực sự sẽ khác khi lên Centos 7. CGroups cũng vậy. CGroups hay Control Groups được giới thiệu bởi Google năm 2006 nhằm giới hạn sử dụng tài nguyên cho một process. Tất cả các process đều có bộ điều khiển tài nguyên của riêng nó hay còn gọi là CGroups subsystem.
Dưới đây là các bộ điều khiển tài nguyên có trong Centos 7:
Systemd tổ chức các processes bằng control group. Chẳng hạn, tất cả các process sinh ra bới apache webserver sẽ nằm trong cùng control group. Điều này làm cho việc stop webserver trở nên dễ dàng hơn. Điều này cho phép chuyển các setting quản lý tài nguyên từ mức process lên mức ứng dụng bằng cách gắn hệ thống phân cấp của CGroup với cây unit của Systemd.
Cây unit của Systemd gồm các thành phần:
Để xem cấu trúc phân cấp của control group:
# systemd-cgls ├─1 /usr/lib/systemd/systemd --switched-root --system --deserialize 24 ├─user.slice │ └─user-0.slice │ ├─session-56.scope │ │ ├─19679 sshd: root@pts/1 │ │ ├─19683 -bash │ │ ├─19714 systemd-cgls │ │ └─19715 less │ └─session-40.scope │ ├─19370 sshd: root@pts/0 │ └─19374 -bash └─system.slice ├─httpd.service │ ├─2577 /usr/sbin/httpd -DFOREGROUND │ ├─2578 /usr/sbin/httpd -DFOREGROUND │ └─2579 /usr/sbin/httpd -DFOREGROUND ├─polkit.service │ └─730 /usr/lib/polkit-1/polkitd --no-debug ├─systemd-udevd.service │ └─455 /usr/lib/systemd/systemd-udevd ├─lvm2-lvmetad.service │ └─450 /usr/sbin/lvmetad -f ├─systemd-journald.service │ └─449 /usr/lib/systemd/systemd-journald ├─dbus.service │ └─611 /bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --sy ├─systemd-logind.service │ └─604 /usr/lib/systemd/systemd-logind ├─chronyd.service │ └─613 /usr/sbin/chronyd -u chrony ├─crond.service │ └─621 /usr/sbin/crond -n ├─postfix.service │ ├─ 1349 /usr/libexec/postfix/master -w │ ├─ 1358 qmgr -l -t unix -u │ └─19596 pickup -l -t unix -u ├─rsyslog.service │ └─589 /usr/sbin/rsyslogd -n ├─sshd.service │ └─1068 /usr/sbin/sshd -D ├─tuned.service │ └─583 /usr/bin/python -Es /usr/sbin/tuned -l -P ├─firewalld.service │ └─580 /usr/bin/python -Es /usr/sbin/firewalld --nofork --nopid ├─NetworkManager.service │ └─698 /usr/sbin/NetworkManager --no-daemon ├─system-getty.slice │ └─getty@tty1.service │ └─631 /sbin/agetty --noclear tty1 └─system-serial\x2dgetty.slice └─serial-getty@ttyS0.service └─630 /sbin/agetty --keep-baud 115200 38400 9600 ttyS0
Để xem các control group sắp xếp bởi CPU, memory hay disk I/O load:
# systemd-cgtop Path Tasks %CPU Memory Input/s Output/s / 213 3.9 829.7M - - /system.slice 1 - - - - /system.slice/ModemManager.service 1 - - - -
Để loại bỏ tất cả các processes của apache server :
# systemctl kill httpd
Note: Thêm tùy chọn -s để xác định tín hiệu cần gửi (SIGTERM, SIGINT or SIGSTOP; mặc định là SIGTERM).
Thông qua Systemd, các tài nguyên có thể được giới hạn như sau:
RHEL 7.2 thêm 3 tùy chọn mới:
Ví dụ để giới hạn cho 1 services:
# systemctl set-property httpd CPUShares=500 # systemctl daemon-reload
Để xem giá trị CPUShares hiện tại của 1 service
# systemctl show -p CPUShares httpd CPUShares=500
hoặc
# systemctl show httpd | grep CPUShares CPUShares=500
Chú ý: Mỗi lần có giới hạn tài nguyên trên 1 service, một thư mục với cùng tên và hậu tố .d được tạo trong /etc/systemd/system. Như trong ví dụ trên, một thư mục là /etc/systemd/system/httpd.service.d sẽ được tạo với 1 file 90-CPUShares.conf trong đó và có nội dung:
[Service] CPUShares=500
Để hiểu hơn về CGroups, lấy ví dụ khi ta muốn sử dụng a website với các server cần cài đặt Apache, MariaDB và PHP
Server có 4Gb RAM và ta muốn phân bổ tài nguyên như sau:
Còn dư 1 Gb RAM cho các process khác
Chú ý: Nếu không cấu hình CGroups, mọi thứ sẽ làm việc giống như trong RHEL 6: tất cả các process sẽ chia sẻ tài nguyên hệ thống khi cần.
Tất cả các services trên được khởi động từ Systemd sẽ được đặt trong system.slice.
Đây là cấu hình để setup với lệnh systemctl set-property:
Chú ý: Còn có một vài services nằm trong system.slice như (crond, postfix, etc). Nhưng chúng không ngốn tài nguyên và sẽ sử dụng trong giới hạn mặc định của nó, vẫn luôn có tài nguyên để dành cho những services khác.
Rất chú ý: Một khi đã set up CPUShares CGroup để giới hạn trên 1 services nằm trong system.slice, tất cả các services trong đó cũng sẽ phải chịu giới hạn theo ngay cả khi không có thông số giới hạn đi kèm, khi đó các services sẽ sử dụng giới hạn mặc định của riêng nó. Điều đó có nghĩa là khi đã sử dụng giới hạn, sẽ ko thể có 1 services bị ảnh hưởng mà các services còn lại không bị.