LFCS: ตรวจสอบการใช้ทรัพยากรกระบวนการ Linux และตั้งค่าขีดจำกัดกระบวนการตามผู้ใช้แต่ละราย - ตอนที่ 14
เนื่องจากมีการเปลี่ยนแปลงล่าสุดในวัตถุประสงค์การสอบรับรอง LFCS ซึ่งมีผลตั้งแต่ 2 กุมภาพันธ์ 2016 เรากำลังเพิ่มบทความที่จำเป็นลงในซีรีส์ LFCS ที่เผยแพร่ที่นี่ เพื่อเตรียมพร้อมสำหรับการสอบนี้ ขอแนะนำให้คุณอ่านซีรีส์ LFCE เช่นกัน
ผู้ดูแลระบบ Linux ทุกคนจำเป็นต้องรู้วิธีตรวจสอบความสมบูรณ์และความพร้อมใช้งานของฮาร์ดแวร์ ทรัพยากร และกระบวนการที่สำคัญ นอกจากนี้ การตั้งค่าขีดจำกัดทรัพยากรตามผู้ใช้จะต้องเป็นส่วนหนึ่งของชุดทักษะของผู้ใช้ด้วย
ในบทความนี้ เราจะสำรวจวิธีการบางอย่างเพื่อให้แน่ใจว่าระบบทั้งฮาร์ดแวร์และซอฟต์แวร์ทำงานได้อย่างถูกต้อง เพื่อหลีกเลี่ยงปัญหาที่อาจเกิดขึ้นซึ่งอาจทำให้การผลิตหยุดทำงานโดยไม่คาดคิดและสูญเสียเงิน
สถิติตัวประมวลผลการรายงาน Linux
ด้วย mpstat คุณสามารถดูกิจกรรมของโปรเซสเซอร์แต่ละตัวแยกกันหรือทั้งระบบ ทั้งในภาพรวมแบบครั้งเดียวหรือแบบไดนามิก
หากต้องการใช้เครื่องมือนี้ คุณจะต้องติดตั้ง sysstat:
yum update && yum install sysstat [On CentOS based systems]
aptitutde update && aptitude install sysstat [On Ubuntu based systems]
zypper update && zypper install sysstat [On openSUSE systems]
อ่านเพิ่มเติมเกี่ยวกับ sysstat และยูทิลิตี้ต่างๆ ได้ที่เรียนรู้ Sysstat และยูทิลิตี้ของมัน mpstat, pidstat, iostat และ sar ใน Linux
เมื่อคุณติดตั้ง mpstat แล้ว ให้ใช้มันเพื่อสร้างรายงานสถิติของโปรเซสเซอร์
หากต้องการแสดงรายงานการใช้งาน CPU ทั่วโลก 3 รายการ (-u
) สำหรับ CPU ทั้งหมด (ตามที่ระบุโดย -P
ALL) ในช่วงเวลา 2 วินาที , ทำ:
mpstat -P ALL -u 2 3
ผลลัพธ์ตัวอย่าง
Linux 3.19.0-32-generic (linux-console.net) Wednesday 30 March 2016 _x86_64_ (4 CPU)
11:41:07 IST CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
11:41:09 IST all 5.85 0.00 1.12 0.12 0.00 0.00 0.00 0.00 0.00 92.91
11:41:09 IST 0 4.48 0.00 1.00 0.00 0.00 0.00 0.00 0.00 0.00 94.53
11:41:09 IST 1 2.50 0.00 0.50 0.00 0.00 0.00 0.00 0.00 0.00 97.00
11:41:09 IST 2 6.44 0.00 0.99 0.00 0.00 0.00 0.00 0.00 0.00 92.57
11:41:09 IST 3 10.45 0.00 1.99 0.00 0.00 0.00 0.00 0.00 0.00 87.56
11:41:09 IST CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
11:41:11 IST all 11.60 0.12 1.12 0.50 0.00 0.00 0.00 0.00 0.00 86.66
11:41:11 IST 0 10.50 0.00 1.00 0.00 0.00 0.00 0.00 0.00 0.00 88.50
11:41:11 IST 1 14.36 0.00 1.49 2.48 0.00 0.00 0.00 0.00 0.00 81.68
11:41:11 IST 2 2.00 0.50 1.00 0.00 0.00 0.00 0.00 0.00 0.00 96.50
11:41:11 IST 3 19.40 0.00 1.00 0.00 0.00 0.00 0.00 0.00 0.00 79.60
11:41:11 IST CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
11:41:13 IST all 5.69 0.00 1.24 0.00 0.00 0.00 0.00 0.00 0.00 93.07
11:41:13 IST 0 2.97 0.00 1.49 0.00 0.00 0.00 0.00 0.00 0.00 95.54
11:41:13 IST 1 10.78 0.00 1.47 0.00 0.00 0.00 0.00 0.00 0.00 87.75
11:41:13 IST 2 2.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 0.00 97.00
11:41:13 IST 3 6.93 0.00 0.50 0.00 0.00 0.00 0.00 0.00 0.00 92.57
Average: CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
Average: all 7.71 0.04 1.16 0.21 0.00 0.00 0.00 0.00 0.00 90.89
Average: 0 5.97 0.00 1.16 0.00 0.00 0.00 0.00 0.00 0.00 92.87
Average: 1 9.24 0.00 1.16 0.83 0.00 0.00 0.00 0.00 0.00 88.78
Average: 2 3.49 0.17 1.00 0.00 0.00 0.00 0.00 0.00 0.00 95.35
Average: 3 12.25 0.00 1.16 0.00 0.00 0.00 0.00 0.00 0.00 86.59
หากต้องการดูสถิติเดียวกันสำหรับ CPU เฉพาะ (CPU 0 ในตัวอย่างต่อไปนี้) ให้ใช้:
mpstat -P 0 -u 2 3
ผลลัพธ์ตัวอย่าง
Linux 3.19.0-32-generic (linux-console.net) Wednesday 30 March 2016 _x86_64_ (4 CPU)
11:42:08 IST CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
11:42:10 IST 0 3.00 0.00 0.50 0.00 0.00 0.00 0.00 0.00 0.00 96.50
11:42:12 IST 0 4.08 0.00 0.00 2.55 0.00 0.00 0.00 0.00 0.00 93.37
11:42:14 IST 0 9.74 0.00 0.51 0.00 0.00 0.00 0.00 0.00 0.00 89.74
Average: 0 5.58 0.00 0.34 0.85 0.00 0.00 0.00 0.00 0.00 93.23
ผลลัพธ์ของคำสั่งข้างต้นจะแสดงคอลัมน์เหล่านี้:
CPU
: หมายเลขโปรเซสเซอร์เป็นจำนวนเต็ม หรือคำว่า all เป็นค่าเฉลี่ยสำหรับโปรเซสเซอร์ทั้งหมด%usr
: เปอร์เซ็นต์การใช้งาน CPU ขณะเรียกใช้แอปพลิเคชันระดับผู้ใช้%nice
: เหมือนกับ%usr
แต่มีลำดับความสำคัญที่ดี%sys
: เปอร์เซ็นต์การใช้งาน CPU ที่เกิดขึ้นขณะเรียกใช้แอปพลิเคชันเคอร์เนล นี่ไม่รวมเวลาที่ใช้ในการจัดการกับการขัดจังหวะหรือการจัดการฮาร์ดแวร์%iowait
: เปอร์เซ็นต์ของเวลาที่ CPU ที่กำหนด (หรือทั้งหมด) ไม่ได้ใช้งาน ในระหว่างที่มีการดำเนินการ I/O ที่ใช้ทรัพยากรจำนวนมากตามกำหนดเวลาบน CPU นั้น สามารถดูคำอธิบายโดยละเอียดเพิ่มเติม (พร้อมตัวอย่าง) ได้ที่นี่%irq
: เปอร์เซ็นต์ของเวลาที่ใช้ในการให้บริการฮาร์ดแวร์ขัดจังหวะ%soft
: เหมือนกับ%irq
แต่มีซอฟต์แวร์ขัดจังหวะ%steal
: เปอร์เซ็นต์ของเวลาที่ใช้ในการรอโดยไม่สมัครใจ (ขโมยหรือถูกขโมย) เมื่อเครื่องเสมือนในฐานะแขก "ชนะ" ความสนใจของไฮเปอร์ไวเซอร์ในขณะที่แข่งขันเพื่อแย่งชิง CPU ค่านี้ควรเก็บไว้ให้น้อยที่สุดเท่าที่จะเป็นไปได้ ค่าที่สูงในช่องนี้หมายความว่าเครื่องเสมือนกำลังหยุดทำงาน หรือจะหยุดทำงานในเร็วๆ นี้%guest
: เปอร์เซ็นต์ของเวลาที่ใช้ในการรันโปรเซสเซอร์เสมือน%idle
: เปอร์เซ็นต์ของเวลาที่ CPU ไม่ได้ทำงานใดๆ หากคุณสังเกตเห็นค่าต่ำในคอลัมน์นี้ นั่นแสดงว่าระบบอยู่ภายใต้ภาระหนัก ในกรณีนั้น คุณจะต้องพิจารณารายการกระบวนการให้ละเอียดยิ่งขึ้น เนื่องจากเราจะหารือกันในอีกสักครู่ เพื่อดูว่าอะไรเป็นสาเหตุ
หากต้องการวางโปรเซสเซอร์ไว้ภายใต้ภาระที่ค่อนข้างสูง ให้รันคำสั่งต่อไปนี้ จากนั้นรัน mpstat (ตามที่ระบุ) ในเทอร์มินัลแยกต่างหาก:
dd if=/dev/zero of=test.iso bs=1G count=1
mpstat -u -P 0 2 3
ping -f localhost # Interrupt with Ctrl + C after mpstat below completes
mpstat -u -P 0 2 3
สุดท้ายนี้ ให้เปรียบเทียบกับเอาต์พุตของ mpstat ภายใต้สถานการณ์ “ปกติ”:
ดังที่คุณเห็นในภาพด้านบน CPU 0 อยู่ภายใต้ภาระงานหนักระหว่างสองตัวอย่างแรก ตามที่ระบุในคอลัมน์ %idle
ในหัวข้อถัดไป เราจะหารือถึงวิธีการระบุกระบวนการที่ต้องใช้ทรัพยากรมาก วิธีรับข้อมูลเพิ่มเติมเกี่ยวกับกระบวนการเหล่านี้ และวิธีการดำเนินการที่เหมาะสม
การรายงานกระบวนการ Linux
ในการแสดงรายการกระบวนการที่เรียงลำดับตามการใช้งาน CPU เราจะใช้คำสั่ง ps
ที่รู้จักกันดีพร้อมกับ -eo
(เพื่อเลือกกระบวนการทั้งหมดที่มีรูปแบบที่ผู้ใช้กำหนด) และ --sort
(เพื่อระบุลำดับการจัดเรียงที่กำหนดเอง) ตัวเลือก เช่น:
ps -eo pid,ppid,cmd,%cpu,%mem --sort=-%cpu
คำสั่งข้างต้นจะแสดงเฉพาะ PID
, PPID
คำสั่งที่เกี่ยวข้องกับกระบวนการ และเปอร์เซ็นต์ของการใช้งาน CPU และ RAM ที่จัดเรียงตามเปอร์เซ็นต์ของการใช้งาน CPU ตามลำดับจากมากไปน้อย . เมื่อดำเนินการระหว่างการสร้างไฟล์ .iso ต่อไปนี้เป็นสองสามบรรทัดแรกของเอาต์พุต:
เมื่อเราระบุกระบวนการที่สนใจแล้ว (เช่น กระบวนการที่มี PID=2822
) เราก็สามารถไปที่ /proc/PID
(/proc/2822
ในกรณีนี้) และทำรายการไดเร็กทอรี
ไดเร็กทอรีนี้เป็นที่เก็บไฟล์และไดเร็กทอรีย่อยหลายไฟล์พร้อมข้อมูลโดยละเอียดเกี่ยวกับกระบวนการนี้โดยเฉพาะในขณะที่กำลังทำงานอยู่
ตัวอย่างเช่น:
/proc/2822/io
มีสถิติ IO สำหรับกระบวนการ (จำนวนอักขระและไบต์ที่อ่านและเขียน และอื่นๆ ในระหว่างการดำเนินการ IO)/proc/2822/attr/current
แสดงคุณลักษณะด้านความปลอดภัย SELinux ปัจจุบันของกระบวนการ/proc/2822/cgroup
อธิบายกลุ่มควบคุม (เรียกสั้น ๆ ว่า cgroup) ซึ่งกระบวนการนั้นอยู่หากเปิดใช้งานตัวเลือกการกำหนดค่าเคอร์เนล CONFIG_CGROUPS ซึ่งคุณสามารถตรวจสอบได้ด้วย:
cat /boot/config-$(uname -r) | grep -i cgroups
หากเปิดใช้งานตัวเลือกนี้ คุณจะเห็น:
CONFIG_CGROUPS=y
การใช้ cgroups
ทำให้คุณสามารถจัดการจำนวนการใช้ทรัพยากรที่อนุญาตได้ในแต่ละกระบวนการ ตามที่อธิบายไว้ในบทที่ 1 ถึง 4 ของคู่มือการจัดการทรัพยากร Red Hat Enterprise Linux 7 ในบทที่ 9 ของการวิเคราะห์ระบบ openSUSE และคู่มือการปรับแต่ง และในส่วนกลุ่มควบคุมของเอกสารประกอบเซิร์ฟเวอร์ Ubuntu 14.04
/proc/2822/fd
เป็นไดเร็กทอรีที่มีลิงก์สัญลักษณ์หนึ่งลิงก์สำหรับแต่ละไฟล์ descriptor ที่กระบวนการเปิดขึ้น รูปภาพต่อไปนี้แสดงข้อมูลสำหรับกระบวนการที่เริ่มต้นใน tty1 (เทอร์มินัลแรก) เพื่อสร้างอิมเมจ .iso:
ภาพด้านบนแสดงให้เห็นว่า stdin (ตัวอธิบายไฟล์ 0), stdout (ตัวอธิบายไฟล์ 1) และ stderr (ตัวอธิบายไฟล์ 2) ถูกแมปกับ /dev/zero, /root/test.iso และ /dev/tty1 ตามลำดับ
ข้อมูลเพิ่มเติมเกี่ยวกับ /proc
สามารถพบได้ในเอกสาร “ระบบไฟล์ /proc
” ที่ Kernel.org เก็บรักษาและดูแล และในคู่มือโปรแกรมเมอร์ Linux
การตั้งค่าขีดจำกัดทรัพยากรตามพื้นฐานต่อผู้ใช้ใน Linux
หากคุณไม่ระมัดระวังและอนุญาตให้ผู้ใช้รันกระบวนการได้ไม่จำกัดจำนวน ในที่สุดคุณอาจประสบปัญหาการปิดระบบโดยไม่คาดคิดหรือถูกล็อคเมื่อระบบเข้าสู่สถานะใช้งานไม่ได้ เพื่อป้องกันไม่ให้สิ่งนี้เกิดขึ้น คุณควรจำกัดจำนวนกระบวนการที่ผู้ใช้สามารถเริ่มต้นได้
ในการดำเนินการนี้ ให้แก้ไข /etc/security/limits.conf และเพิ่มบรรทัดต่อไปนี้ที่ด้านล่างของไฟล์เพื่อกำหนดขีดจำกัด:
* hard nproc 10
ฟิลด์แรกสามารถใช้เพื่อระบุผู้ใช้ กลุ่ม หรือทั้งหมด (*)
ในขณะที่ฟิลด์ที่สองบังคับใช้การจำกัดจำนวนกระบวนการ (nproc) ถึง 10. หากต้องการใช้การเปลี่ยนแปลง การออกจากระบบและกลับเข้ามาใหม่ก็เพียงพอแล้ว
ดังนั้นเรามาดูกันว่าจะเกิดอะไรขึ้นหากผู้ใช้รายอื่นที่ไม่ใช่รูท (ไม่ว่าจะถูกต้องตามกฎหมายหรือไม่ก็ตาม) พยายามเริ่มระเบิดเชลล์ส้อม หากเราไม่ได้ใช้ขีดจำกัด สิ่งนี้จะเริ่มเรียกใช้ฟังก์ชันสองอินสแตนซ์ จากนั้นจึงทำซ้ำแต่ละรายการในวงวนที่ไม่มีวันสิ้นสุด ดังนั้นในที่สุดมันก็จะนำระบบของคุณไปสู่การรวบรวมข้อมูล
อย่างไรก็ตาม ด้วยข้อจำกัดข้างต้น Fork Bomb จึงไม่ประสบผลสำเร็จ แต่ผู้ใช้จะยังคงถูกล็อคออกจนกว่าผู้ดูแลระบบจะยุติกระบวนการที่เกี่ยวข้อง:
เคล็ดลับ: ข้อจำกัดอื่นๆ ที่เป็นไปได้ที่ทำโดย ulimit ได้รับการบันทึกไว้ในไฟล์ limits.conf
เครื่องมือการจัดการกระบวนการอื่น ๆ ของ Linux
นอกเหนือจากเครื่องมือที่กล่าวถึงก่อนหน้านี้แล้ว ผู้ดูแลระบบยังอาจต้อง:
ก) แก้ไขลำดับความสำคัญในการดำเนินการ (การใช้ทรัพยากรระบบ) ของกระบวนการโดยใช้ renice ซึ่งหมายความว่าเคอร์เนลจะจัดสรรทรัพยากรระบบไม่มากก็น้อยให้กับกระบวนการตามลำดับความสำคัญที่กำหนด (ตัวเลขที่รู้จักกันทั่วไปในชื่อ “ความดี” ในช่วงตั้งแต่ -20
ถึง <รหัส>19)
ยิ่งค่าต่ำ ลำดับความสำคัญในการดำเนินการก็จะยิ่งมากขึ้น ผู้ใช้ทั่วไป (นอกเหนือจากรูท) สามารถแก้ไขความดีของกระบวนการที่พวกเขาเป็นเจ้าของเป็นค่าที่สูงกว่าเท่านั้น (หมายถึงลำดับความสำคัญในการดำเนินการที่ต่ำกว่า) ในขณะที่รูทสามารถแก้ไขค่านี้สำหรับกระบวนการใด ๆ และอาจเพิ่มหรือลดลงได้
ไวยากรณ์พื้นฐานของ renice มีดังนี้:
renice [-n] <new priority> <UID, GID, PGID, or empty> identifier
หากไม่มีอาร์กิวเมนต์หลังค่าลำดับความสำคัญใหม่ (ว่างเปล่า) อาร์กิวเมนต์ดังกล่าวจะถูกตั้งค่าเป็น PID ตามค่าเริ่มต้น ในกรณีนั้น ความดีของกระบวนการที่มี PID=identifier จะถูกตั้งค่าเป็น
b) ขัดจังหวะการดำเนินการตามปกติของกระบวนการเมื่อจำเป็น สิ่งนี้เรียกกันทั่วไปว่า "การฆ่า" กระบวนการ ภายใต้ประทุน นี่หมายถึงการส่งสัญญาณกระบวนการเพื่อดำเนินการให้เสร็จสิ้นอย่างถูกต้องและปล่อยทรัพยากรที่ใช้ไปในลักษณะที่เป็นระเบียบ
หากต้องการฆ่ากระบวนการ ให้ใช้คำสั่ง kill ดังต่อไปนี้:
kill PID
หรือคุณสามารถใช้ pkill เพื่อยุติกระบวนการทั้งหมดของเจ้าของที่กำหนด (-u)
หรือเจ้าของกลุ่ม (-G)
หรือแม้แต่กระบวนการเหล่านั้นที่มี PPID เหมือนกัน (-P)
ตัวเลือกเหล่านี้อาจตามด้วยการแสดงตัวเลขหรือชื่อจริงเป็นตัวระบุ:
pkill [options] identifier
ตัวอย่างเช่น,
pkill -G 1000
จะฆ่ากระบวนการทั้งหมดที่กลุ่มเป็นเจ้าของด้วย GID=1000
และ,
pkill -P 4993
จะฆ่ากระบวนการทั้งหมดที่มี PPID เป็น 4993
ก่อนที่จะรัน pkill เป็นความคิดที่ดีที่จะทดสอบผลลัพธ์ด้วย pgrep ก่อน อาจใช้ตัวเลือก -l
เพื่อแสดงรายการ ชื่อกระบวนการ ใช้ตัวเลือกเดียวกัน แต่จะส่งคืน PID ของกระบวนการเท่านั้น (โดยไม่ต้องดำเนินการใดๆ เพิ่มเติม) ซึ่งจะถูกปิดหากใช้ pkill
pgrep -l -u gacanepa
นี่คือภาพประกอบในภาพถัดไป:
สรุป
ในบทความนี้ เราได้สำรวจสองสามวิธีในการตรวจสอบการใช้ทรัพยากรเพื่อตรวจสอบความสมบูรณ์และความพร้อมใช้งานของส่วนประกอบฮาร์ดแวร์และซอฟต์แวร์ที่สำคัญในระบบ Linux
นอกจากนี้เรายังได้เรียนรู้วิธีดำเนินการที่เหมาะสม (ไม่ว่าจะโดยการปรับลำดับความสำคัญในการดำเนินการของกระบวนการที่กำหนดหรือโดยการยุติกระบวนการนั้น) ภายใต้สถานการณ์ที่ไม่ปกติ
เราหวังว่าแนวคิดที่อธิบายไว้ในบทช่วยสอนนี้จะเป็นประโยชน์ หากคุณมีคำถามหรือความคิดเห็น โปรดติดต่อเราโดยใช้แบบฟอร์มติดต่อด้านล่าง