Hệ điều hành Centos 7 – Có gì mới và khác so với Centos 6 – Phần 4 - CGroups
FASTER - STRONGER - SAVER
sales@vietdata.com.vn   0914 83 55 22
Trang Chủ > Kiến thức dịch vụ > Centos 7 >Hệ điều hành Centos 7 – Có gì mới và khác so với Centos 6 – Phần 4 – CGroups

Hệ điều hành Centos 7 – Có gì mới và khác so với Centos 6 – Phần 4 – CGroups

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:

. blkio: giới hạn on input/output access theo 2 chiều các thiết bị block.

. cpu: sử dụng CPU scheduler để cấp các CGroup tasks truy nhập đến CPU. Nó được sử dụng đồng thời với cpuacct controller.

. cpuacct: tạo các report tự động về tài nguyên CPU được sử dụng bởi các task trong một CGroup.

. cpuset: gán các CPU riêng (đối với hệ thống muilticore) và các node memory vào tasks trong một CGroup.

. devices: cho phép hoặc từ chối truy nhập đến các thiệt bị từ một task trong CGroup.

. freezer: suspends hoặc resumes các tasks trong một CGroup.

. memory: giới hạn memory được sử dụng bởi các tasks trong một CGroup, và sinh các report tự động về việc sử dụng này.

. net_cls: tags các gói packets với một classid, cho phép Linux traffic controller xác đinh các packets đến từ một CGroup task cụ thể.

. perf_event: theo dõi CGroups với perf tool.

. hugetlb: cho phép sử dụng virtual memory pages với kích thước lớn và giới hạn tài nguyên trên các pages này

Systemd tổ chức sắp xếp các processes bằng cgroup. Một ví dụ cụ thể về cgroup đó là: tất cả các process sinh ra bới apache webserver sẽ nằm trong cùng một cgroup, kể cả các CGI scripts. Điều này làm cho việc stop webserver trở nên dễ dàng hơn, 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:

. Ở trên cùng là root silce gọi là .slice

. Bên dưới là system.slice (không gian mặc đinh cho tất cả các system services), user.slice (không gian mặc đinh cho tất cả các user session) và machine.slice (không gian mặc đinh cho tất cả các virtual machines và Linux containers)

. Bên dưới nữa là các scopes (một nhóm các process ngoại được khởi tạo bởi fork) và services (một nhóm các process được tạo thông qua một unit file).

Để 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

Chú ý: 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).

Phân bổ tài nguyên thông qua Systemd Resource Controllers

Systemd sử dụng một bộ điều khiển để giới hạn các tài nguyên như sau:

. CPUShares: mặc định là 1024.

. MemoryLimit: mặc đinh ko giới hạn.

. BlockIOWeight: mặc đinh ko giới hạn, các giá trị từ 10 đến 1000.

RHEL 7.2 thêm 3 tùy chọn mới:

. StartupCPUShares và StartupBlockIOWeight: làm việc giống CPUShares và BlockIOWeight nhưng chỉ có tác dụng trong quá trình khởi động.

. CPUQuota: giới hạn CPU time tới một đơn vị % cụ thể ngay cả khi máy ở trạng thái rỗi idle.

Ví dụ để giới hạn cho 1 services:

# systemctl set-property httpd CPUShares=500
# systemctl daemon-reload

Kiểm tra ngay 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, ta xem cụ thể khi sử dụng một 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:

. Apache service ( httpd.service): 40% of CPU, 500M of memory.

. PHP service ( php-fpm.service): 30% of CPU, 1G of memory.

. MariaDB service ( mariadb.service): 30% of CPU, 1G of memory.

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.

Và đây là cấu hình để setup với lệnh systemctl set-property:

. Apache service: CPUShares=4096 (4 x 1024); MemoryLimit=500M.

. PHP service: CPUShares=3072 (3 x 1024); MemoryLimit=1G

. MariaDB service: CPUShares=3072 (3 x 1024); MemoryLimit=1G.

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.