ผู้ดูแลระบบ Linux - การจัดการทรัพยากรด้วย crgoups

cgroupsหรือ Control Groups เป็นคุณลักษณะของเคอร์เนล 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 เมื่อคิดการจัดการทรัพยากรสำหรับการให้บริการสิ่งที่สำคัญที่จะมุ่งเน้นเป็นcgroupscgroupsมีขั้นสูงด้วยsystemdทั้งในด้านการทำงานและความเรียบง่าย

เป้าหมายของ cgroups ในการจัดการทรัพยากรคือ - ไม่มีบริการใดบริการหนึ่งที่สามารถทำให้ระบบล่มโดยรวมได้ หรือไม่มีกระบวนการบริการเดียว (อาจเป็นสคริปต์ PHP ที่เขียนไม่ดี) จะทำให้การทำงานของเซิร์ฟเวอร์เสียไปจากการใช้ทรัพยากรมากเกินไป

cgroupsอนุญาตให้ควบคุมทรัพยากรของหน่วยสำหรับทรัพยากรต่อไปนี้ -

  • CPU - จำกัด งานที่ต้องใช้ซีพียูมากซึ่งไม่สำคัญเท่ากับงานอื่น ๆ ที่มีความเข้มข้นน้อยกว่า

  • Memory - จำกัด จำนวนหน่วยความจำที่บริการสามารถใช้งานได้

  • Disks - จำกัด ดิสก์ i / o

** เวลา CPU: **

งานที่ต้องการลำดับความสำคัญของ CPU น้อยกว่าสามารถกำหนด CPU Slices ที่กำหนดเองได้

ลองดูสองบริการต่อไปนี้เป็นตัวอย่าง

บริการ 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]#

มาตั้งค่า Polite Service โดยใช้ลำดับความสำคัญของ 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 CPUS หุ้น
ขีด จำกัด หน่วยความจำ MemoryLimit
ขีด จำกัด หน่วยความจำแบบซอฟต์ MemorySoftLimit
บล็อกน้ำหนัก IO บล็อก IOW
Block Device Limit (ระบุใน / volume / path)) บล็อกไอโอดีอุปกรณ์น้ำหนัก
อ่าน IO BlockIOReadBandwidth
ดิสก์เขียน IO BlockIOReadBandwidth

ส่วนใหญ่มักจะให้บริการจะถูก จำกัด โดยการใช้งาน CPU , ขีด จำกัด ของหน่วยความจำและการอ่าน / เขียน IO

หลังจากเปลี่ยนแต่ละครั้งจำเป็นต้องโหลด systemd ใหม่และเริ่มบริการใหม่ -

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

กำหนดค่า CGroups ใน CentOS Linux

ในการสร้าง cgroups แบบกำหนดเองใน CentOS Linux เราจำเป็นต้องติดตั้งบริการและกำหนดค่าก่อน

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]#

อย่างที่เราเห็นโดยค่าเริ่มต้น CentOS 7 มี 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]#