Trang Chủ >Kiến thức dịch vụ > KB & Tips > 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.

Làm việc với Systemd

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:

  • Ở 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

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

Systemd Resource Controllers

Thông qua Systemd, các tài nguyên có thể được giới hạ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 bị % 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

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

 

Ví dụ cụ thể

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

  • 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.

Đâ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.

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ị.

Hỗ trợ Kinh Doanh
0908.751868 Mr.Tài
sales@vcloud.vn
Hỗ Trợ Kỹ Thuật
0933 167 123 Mr.Trí
support@vcloud.vn
Tư vấn Máy Chủ
0933 167 123 Mr.Trí
support@vcloud.vn
ĐỐI TÁC