ค้นหาเว็บไซต์

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

ผลลัพธ์ของคำสั่งข้างต้นจะแสดงคอลัมน์เหล่านี้:

  1. CPU: หมายเลขโปรเซสเซอร์เป็นจำนวนเต็ม หรือคำว่า all เป็นค่าเฉลี่ยสำหรับโปรเซสเซอร์ทั้งหมด
  2. %usr: เปอร์เซ็นต์การใช้งาน CPU ขณะเรียกใช้แอปพลิเคชันระดับผู้ใช้
  3. %nice: เหมือนกับ %usr แต่มีลำดับความสำคัญที่ดี
  4. %sys: เปอร์เซ็นต์การใช้งาน CPU ที่เกิดขึ้นขณะเรียกใช้แอปพลิเคชันเคอร์เนล นี่ไม่รวมเวลาที่ใช้ในการจัดการกับการขัดจังหวะหรือการจัดการฮาร์ดแวร์
  5. %iowait: เปอร์เซ็นต์ของเวลาที่ CPU ที่กำหนด (หรือทั้งหมด) ไม่ได้ใช้งาน ในระหว่างที่มีการดำเนินการ I/O ที่ใช้ทรัพยากรจำนวนมากตามกำหนดเวลาบน CPU นั้น สามารถดูคำอธิบายโดยละเอียดเพิ่มเติม (พร้อมตัวอย่าง) ได้ที่นี่
  6. %irq: เปอร์เซ็นต์ของเวลาที่ใช้ในการให้บริการฮาร์ดแวร์ขัดจังหวะ
  7. %soft: เหมือนกับ %irq แต่มีซอฟต์แวร์ขัดจังหวะ
  8. %steal: เปอร์เซ็นต์ของเวลาที่ใช้ในการรอโดยไม่สมัครใจ (ขโมยหรือถูกขโมย) เมื่อเครื่องเสมือนในฐานะแขก "ชนะ" ความสนใจของไฮเปอร์ไวเซอร์ในขณะที่แข่งขันเพื่อแย่งชิง CPU ค่านี้ควรเก็บไว้ให้น้อยที่สุดเท่าที่จะเป็นไปได้ ค่าที่สูงในช่องนี้หมายความว่าเครื่องเสมือนกำลังหยุดทำงาน หรือจะหยุดทำงานในเร็วๆ นี้
  9. %guest: เปอร์เซ็นต์ของเวลาที่ใช้ในการรันโปรเซสเซอร์เสมือน
  10. %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 ในกรณีนี้) และทำรายการไดเร็กทอรี

ไดเร็กทอรีนี้เป็นที่เก็บไฟล์และไดเร็กทอรีย่อยหลายไฟล์พร้อมข้อมูลโดยละเอียดเกี่ยวกับกระบวนการนี้โดยเฉพาะในขณะที่กำลังทำงานอยู่

ตัวอย่างเช่น:
  1. /proc/2822/io มีสถิติ IO สำหรับกระบวนการ (จำนวนอักขระและไบต์ที่อ่านและเขียน และอื่นๆ ในระหว่างการดำเนินการ IO)
  2. /proc/2822/attr/current แสดงคุณลักษณะด้านความปลอดภัย SELinux ปัจจุบันของกระบวนการ
  3. /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

นอกจากนี้เรายังได้เรียนรู้วิธีดำเนินการที่เหมาะสม (ไม่ว่าจะโดยการปรับลำดับความสำคัญในการดำเนินการของกระบวนการที่กำหนดหรือโดยการยุติกระบวนการนั้น) ภายใต้สถานการณ์ที่ไม่ปกติ

เราหวังว่าแนวคิดที่อธิบายไว้ในบทช่วยสอนนี้จะเป็นประโยชน์ หากคุณมีคำถามหรือความคิดเห็น โปรดติดต่อเราโดยใช้แบบฟอร์มติดต่อด้านล่าง