Linux管理者-crgoupsを使用したリソース管理

cgroupsまたはControlGroupsは、管理者がサービスおよびグループ化のためにシステムリソースを割り当てまたは制限できるようにするLinuxカーネルの機能です。

実行中のアクティブなコントロールグループを一覧表示するには、次のpsコマンドを使用できます-

[root@localhost]# ps xawf -eo pid,user,cgroup,args 
8362 root     -                            \_ [kworker/1:2] 
1 root        -                           /usr/lib/systemd/systemd --switched-
   root --system --    deserialize 21 
507 root     7:cpuacct,cpu:/system.slice  /usr/lib/systemd/systemd-journald 
527 root     7:cpuacct,cpu:/system.slice  /usr/sbin/lvmetad -f 
540 root     7:cpuacct,cpu:/system.slice  /usr/lib/systemd/systemd-udevd 
715 root     7:cpuacct,cpu:/system.slice  /sbin/auditd -n 
731 root     7:cpuacct,cpu:/system.slice   \_ /sbin/audispd 
734 root     7:cpuacct,cpu:/system.slice       \_ /usr/sbin/sedispatch 
737 polkitd  7:cpuacct,cpu:/system.slice  /usr/lib/polkit-1/polkitd --no-debug 
738 rtkit    6:memory:/system.slice/rtki  /usr/libexec/rtkit-daemon 
740 dbus     7:cpuacct,cpu:/system.slice  /bin/dbus-daemon --system --
   address=systemd: --nofork --nopidfile --systemd-activation

リソース管理は、CentOSの6.Xのように、と再定義されているにsystemdのinit実装。サービスのリソース管理を考えるとき、焦点を当てるべき主なものはcgroupsです。cgroups機能性とシンプルさの両方でsystemdで進歩しました。

リソース管理におけるcgroupの目標は、システム全体をダウンさせることができるサービスはありません。または、単一のサービスプロセス(おそらく不十分に記述されたPHPスクリプト)が、リソースを消費しすぎてサーバーの機能を損なうことはありません。

cgroupsを使用すると、次のリソースのユニットのリソース制御が可能になります-

  • CPU −他のそれほど集中的でないタスクほど重要ではないCPU集中型タスクを制限する

  • Memory −サービスが消費できるメモリ量を制限する

  • Disks −ディスクI / Oを制限する

** CPU時間:**

より少ないCPU優先度を必要とするタスクは、カスタム構成されたCPUスライスを持つことができます。

たとえば、次の2つのサービスを見てみましょう。

丁寧なCPUサービス1

[root@localhost]# systemctl cat polite.service 
# /etc/systemd/system/polite.service 
[Unit] 
Description = Polite service limits CPU Slice and Memory 
After=remote-fs.target nss-lookup.target

[Service] 
MemoryLimit = 1M 
ExecStart = /usr/bin/sha1sum /dev/zero 
ExecStop = /bin/kill -WINCH ${MAINPID} 
WantedBy=multi-user.target

# /etc/systemd/system/polite.service.d/50-CPUShares.conf 
[Service] 
CPUShares = 1024 
[root@localhost]#

邪悪なCPUサービス2

[root@localhost]# systemctl cat evil.service 
# /etc/systemd/system/evil.service 
[Unit] 
Description = I Eat You CPU 
After=remote-fs.target nss-lookup.target

[Service] 
ExecStart = /usr/bin/md5sum /dev/zero 
ExecStop = /bin/kill -WINCH ${MAINPID} 
WantedBy=multi-user.target

# /etc/systemd/system/evil.service.d/50-CPUShares.conf 
[Service] 
CPUShares = 1024 
[root@localhost]#

より低いCPU優先度を使用して丁寧なサービスを設定しましょう-

systemctl set-property polite.service CPUShares = 20  
/system.slice/polite.service
1   70.5   124.0K        -        -  

/system.slice/evil.service
1   99.5   304.0K        -        -

ご覧のとおり、通常のシステムアイドル時間の間、両方の不正なプロセスは依然としてCPUサイクルを使用しています。ただし、タイムスライスを少なくするように設定されているのは、CPU時間を少なくすることです。これを念頭に置いて、より短い時間のタイムスライスを使用すると、重要なタスクがシステムリソースにアクセスしやすくなることがわかります。

リソースごとにサービスを設定するために、set-propertyメソッドは次のパラメーターを定義します-

systemctl set-property name parameter=value

CPUスライス CPUシェア
メモリ制限 MemoryLimit
ソフトメモリ制限 MemorySoftLimit
ブロックIOの重み BlockIOWeight
ブロックデバイス制限(/ volume / pathで指定)) BlockIODeviceWeight
IOを読む BlockIOReadBandwidth
ディスク書き込みIO BlockIOReadBandwidth

ほとんどの場合、サービスはCPUの使用メモリの制限読み取り/書き込みIOによって制限されます

それぞれを変更した後、systemdをリロードしてサービスを再起動する必要があります-

systemctl set-property foo.service CPUShares = 250 
systemctl daemon-reload 
systemctl restart foo.service

CentOSLinuxでCGroupsを構成する

CentOS Linuxでカスタムcgroupを作成するには、最初にサービスをインストールして構成する必要があります。

Step 1 − libcgroupをインストールします(まだインストールされていない場合)。

[root@localhost]# yum install libcgroup 
Package libcgroup-0.41-11.el7.x86_64 already installed and latest version 
Nothing to do 
[root@localhost]#

ご覧のとおり、デフォルトでは、CentOS7にはeverythingインストーラーとともにlibcgroupがインストールされています。最小限のインストーラーを使用するには、依存関係とともにlibcgroupユーティリティをインストールする必要があります。

Step 2 −cgconfigサービスを開始して有効にします。

[root@localhost]# systemctl enable cgconfig 
Created symlink from /etc/systemd/system/sysinit.target.wants/cgconfig.service 
to /usr/lib/systemd/system/cgconfig.service. 
[root@localhost]# systemctl start cgconfig 
[root@localhost]# systemctl status cgconfig 
● cgconfig.service - Control Group configuration service 
Loaded: loaded (/usr/lib/systemd/system/cgconfig.service; enabled; vendor 
preset: disabled) 
Active: active (exited) since Mon 2017-01-23 02:51:42 EST; 1min 21s ago 
Main PID: 4692 (code=exited, status = 0/SUCCESS) 
Memory: 0B 
CGroup: /system.slice/cgconfig.service  

Jan 23 02:51:42 localhost.localdomain systemd[1]: Starting Control Group 
configuration service... 
Jan 23 02:51:42 localhost.localdomain systemd[1]: Started Control Group 
configuration service. 
[root@localhost]#