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

วิธีตรวจสอบการใช้งานระบบ การหยุดทำงาน และการแก้ไขปัญหาเซิร์ฟเวอร์ Linux - ตอนที่ 9


แม้ว่า Linux จะมีความน่าเชื่อถือสูง แต่ผู้ดูแลระบบที่ชาญฉลาดควรหาวิธีที่จะจับตาดูพฤติกรรมและการใช้งานของระบบตลอดเวลา การดูแลให้มีเวลาทำงานใกล้เคียง 100% มากที่สุดเท่าที่จะเป็นไปได้และความพร้อมใช้งานของทรัพยากรถือเป็นความต้องการที่สำคัญในสภาพแวดล้อมต่างๆ การตรวจสอบสถานะในอดีตและปัจจุบันของระบบจะช่วยให้เราสามารถคาดการณ์และป้องกันปัญหาที่อาจเกิดขึ้นได้มากที่สุด

ขอแนะนำโปรแกรมการรับรอง Linux Foundation

ในบทความนี้ เราจะนำเสนอรายการเครื่องมือบางอย่างที่มีอยู่ในการกระจายอัปสตรีมส่วนใหญ่เพื่อตรวจสอบสถานะของระบบ วิเคราะห์การหยุดทำงาน และแก้ไขปัญหาที่กำลังดำเนินอยู่ โดยเฉพาะอย่างยิ่งจากข้อมูลที่มีอยู่มากมาย เราจะมุ่งเน้นไปที่ CPU พื้นที่จัดเก็บข้อมูลและการใช้หน่วยความจำ การจัดการกระบวนการขั้นพื้นฐาน และการวิเคราะห์บันทึก

การใช้พื้นที่จัดเก็บ

มี 2 คำสั่งที่รู้จักกันดีใน Linux ที่ใช้ในการตรวจสอบการใช้พื้นที่เก็บข้อมูล: df และ du

อันแรก df (ซึ่งย่อมาจาก disk free) โดยทั่วไปจะใช้เพื่อรายงานการใช้พื้นที่ดิสก์โดยรวมตามระบบไฟล์

ตัวอย่างที่ 1: การรายงานการใช้พื้นที่ดิสก์เป็นไบต์และรูปแบบที่มนุษย์สามารถอ่านได้

หากไม่มีตัวเลือก df จะรายงานการใช้พื้นที่ดิสก์เป็นไบต์ ด้วยแฟล็ก -h จะแสดงข้อมูลเดียวกันโดยใช้ MB หรือ GB แทน โปรดทราบว่ารายงานนี้ยังรวมขนาดทั้งหมดของแต่ละระบบไฟล์ (ในบล็อก 1-K) พื้นที่ว่างและว่าง และจุดเชื่อมต่อของอุปกรณ์จัดเก็บข้อมูลแต่ละรายการ

df
df -h

เป็นเรื่องดีอย่างแน่นอน แต่ก็มีข้อจำกัดอีกประการหนึ่งที่ทำให้ระบบไฟล์ใช้งานไม่ได้ และไอโหนดกำลังจะหมด ไฟล์ทั้งหมดในระบบไฟล์จะถูกแมปกับไอโหนดที่มีข้อมูลเมตา

ตัวอย่างที่ 2: การตรวจสอบการใช้งาน inode โดยระบบไฟล์ในรูปแบบที่มนุษย์สามารถอ่านได้ด้วย
df -hTi

คุณสามารถดูจำนวนไอโหนดที่ใช้และที่มีอยู่:

จากภาพด้านบน มี 146 inodes ที่ใช้ (1%) ใน /home ซึ่งหมายความว่าคุณยังคงสามารถสร้างไฟล์ 226K ในระบบไฟล์นั้นได้

ตัวอย่างที่ 3: การค้นหาและ/หรือการลบไฟล์และไดเร็กทอรีว่าง

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

ใช้คำสั่งต่อไปนี้เพื่อค้นหาไฟล์ว่างหรือไดเร็กทอรี (ซึ่งครอบครอง 0B) ที่ใช้ inodes โดยไม่มีเหตุผล:

find  /home -type f -empty
find  /home -type d -empty

นอกจากนี้ คุณสามารถเพิ่มแฟล็ก -delete ที่ส่วนท้ายของแต่ละคำสั่งได้ หากคุณต้องการลบไฟล์และไดเร็กทอรีว่างเหล่านั้น:

find  /home -type f -empty --delete
find  /home -type f -empty

ขั้นตอนก่อนหน้านี้ลบ 4 ไฟล์ มาตรวจสอบจำนวนโหนดที่ใช้/พร้อมใช้งานอีกครั้งใน /home:

df -hTi | grep home

อย่างที่คุณเห็น ตอนนี้มี inodes ที่ใช้แล้ว 142 (น้อยกว่าเมื่อก่อน 4)

ตัวอย่างที่ 4: การตรวจสอบการใช้งานดิสก์ตามไดเร็กทอรี

หากการใช้ระบบไฟล์บางระบบเกินกว่าเปอร์เซ็นต์ที่กำหนดไว้ล่วงหน้า คุณสามารถใช้ du (คำย่อสำหรับการใช้ดิสก์) เพื่อดูว่าไฟล์ใดบ้างที่ใช้พื้นที่มากที่สุด

ตัวอย่างที่ให้ไว้สำหรับ /var ซึ่งดังที่คุณเห็นในภาพแรกด้านบน ถูกใช้ที่ 67%

du -sch /var/*

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

อ่านเพิ่มเติม

  1. 12 คำสั่ง “df” ที่มีประโยชน์เพื่อตรวจสอบพื้นที่ดิสก์
  2. 10 คำสั่ง “du” ที่มีประโยชน์เพื่อค้นหาการใช้งานดิสก์ของไฟล์และไดเร็กทอรี

การใช้หน่วยความจำและ CPU

เครื่องมือคลาสสิกใน Linux ที่ใช้ในการตรวจสอบการใช้งาน CPU/หน่วยความจำโดยรวมและการจัดการกระบวนการคือคำสั่งอันดับต้น ๆ นอกจากนี้ ด้านบนยังแสดงมุมมองแบบเรียลไทม์ของระบบที่ทำงานอยู่ มีเครื่องมืออื่น ๆ ที่สามารถใช้เพื่อจุดประสงค์เดียวกันได้ เช่น htop แต่ฉันได้เลือกไว้เป็นอันดับต้น ๆ เนื่องจากมีการติดตั้งแบบสำเร็จรูปในการกระจาย Linux ใด ๆ

ตัวอย่างที่ 5: การแสดงสถานะปัจจุบันของระบบของคุณด้วยด้านบน

หากต้องการเริ่มต้นจากด้านบน เพียงพิมพ์คำสั่งต่อไปนี้ในบรรทัดคำสั่งของคุณแล้วกด Enter

top

เรามาตรวจสอบผลลัพธ์ระดับบนสุดทั่วไปกัน:

ในแถวที่ 1 ถึง 5 ข้อมูลต่อไปนี้จะปรากฏขึ้น:

1. เวลาปัจจุบัน (20:41:32 น.) และเวลาให้บริการ (7 ชั่วโมง 41 นาที) มีผู้ใช้เพียงคนเดียวเท่านั้นที่ล็อกออนเข้าสู่ระบบ และโหลดเฉลี่ยในช่วง 1, 5 และ 15 นาทีที่ผ่านมา ตามลำดับ 0.00, 0.01 และ 0.05 บ่งชี้ว่าในช่วงเวลาดังกล่าว ระบบไม่ได้ใช้งานเป็นเวลา 0% ของเวลา (0.00: ไม่มีกระบวนการใดกำลังรอ CPU) จากนั้นจึงมีการโอเวอร์โหลด 1% (0.01: โดยเฉลี่ย 0.01 กระบวนการ กำลังรอ CPU) และ 5% (0.05) หากน้อยกว่า 0 และจำนวนที่น้อยกว่า (เช่น 0.65) ระบบจะไม่ได้ใช้งานเป็นเวลา 35% ในช่วง 1, 5 หรือ 15 นาทีที่ผ่านมา ขึ้นอยู่กับตำแหน่งที่ 0.65 ปรากฏ

2. ขณะนี้มี 121 กระบวนการที่ทำงานอยู่ (คุณสามารถดูรายการทั้งหมดได้ใน 6) มีเพียง 1 รายการเท่านั้นที่กำลังทำงานอยู่ (ด้านบนสุดในกรณีนี้ ดังที่คุณเห็นในคอลัมน์ %CPU) และอีก 120 รายการที่เหลือกำลังรออยู่ในพื้นหลัง แต่กำลัง "อยู่ในโหมดสลีป" และจะยังคงอยู่ในสถานะนั้นจนกว่าเราจะเรียกพวกเขา ยังไง? คุณสามารถตรวจสอบได้โดยเปิดพรอมต์ mysql และดำเนินการค้นหาสองสามรายการ คุณจะสังเกตเห็นว่าจำนวนกระบวนการที่ทำงานอยู่เพิ่มขึ้นอย่างไร

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

3. us (กระบวนการของผู้ใช้ที่ทำงานตามเวลาโดยมีลำดับความสำคัญที่ยังไม่ได้แก้ไข), sy (กระบวนการเคอร์เนลที่ทำงานตามเวลา), ni (กระบวนการของผู้ใช้ที่ทำงานตามเวลาโดยมีลำดับความสำคัญที่แก้ไข), wa (เวลาที่รอจนกว่า I/O จะเสร็จสิ้น) สวัสดี (เวลาที่ใช้ในการขัดจังหวะฮาร์ดแวร์ในการให้บริการ), si (เวลาที่ใช้ในการขัดจังหวะซอฟต์แวร์ให้บริการ), st (เวลาที่ไฮเปอร์ไวเซอร์ขโมยจาก vm ปัจจุบัน - ในสภาพแวดล้อมเสมือนจริงเท่านั้น)

4. การใช้หน่วยความจำกายภาพ

5. สลับการใช้พื้นที่

ตัวอย่างที่ 6: การตรวจสอบการใช้งานหน่วยความจำกายภาพ

หากต้องการตรวจสอบหน่วยความจำ RAM และสลับการใช้งาน คุณสามารถใช้คำสั่ง free ได้

free

แน่นอน คุณยังสามารถใช้สวิตช์ -m (MB) หรือ -g (GB) เพื่อแสดงข้อมูลเดียวกันในรูปแบบที่มนุษย์สามารถอ่านได้:

free -m

ไม่ว่าจะด้วยวิธีใด คุณต้องตระหนักถึงความจริงที่ว่าเคอร์เนลจะสงวนหน่วยความจำไว้มากที่สุดเท่าที่จะเป็นไปได้ และทำให้พร้อมสำหรับการประมวลผลเมื่อพวกเขาร้องขอ โดยเฉพาะอย่างยิ่ง บรรทัด “-/+ buffers/cache” จะแสดงค่าจริงหลังจากพิจารณาแคช I/O นี้แล้ว

กล่าวอีกนัยหนึ่งคือ จำนวนหน่วยความจำที่ใช้โดยกระบวนการและจำนวนที่มีสำหรับกระบวนการอื่น (ในกรณีนี้ 232 MB ที่ใช้และ 270 MB พร้อมใช้งาน ตามลำดับ) เมื่อกระบวนการต้องการหน่วยความจำนี้ เคอร์เนลจะลดขนาดของแคช I/O โดยอัตโนมัติ

อ่านเพิ่มเติม: 10 คำสั่ง “ฟรี” ที่มีประโยชน์เพื่อตรวจสอบการใช้งานหน่วยความจำ Linux

พิจารณากระบวนการให้ละเอียดยิ่งขึ้น

ในช่วงเวลาใดก็ตาม มีกระบวนการมากมายที่ทำงานบนระบบ Linux ของเรา มีสองเครื่องมือที่เราจะใช้เพื่อตรวจสอบกระบวนการอย่างใกล้ชิด: ps และ pstree

ตัวอย่างที่ 7: การแสดงรายการกระบวนการทั้งหมดในระบบของคุณด้วย ps (รูปแบบมาตรฐานเต็มรูปแบบ)

การใช้ตัวเลือก -e และ -f รวมกันเป็นหนึ่งเดียว (-ef) คุณสามารถแสดงรายการกระบวนการทั้งหมดที่กำลังทำงานอยู่บนระบบของคุณในปัจจุบัน คุณสามารถไพพ์เอาต์พุตนี้ไปยังเครื่องมืออื่นๆ เช่น grep (ตามที่อธิบายไว้ในส่วนที่ 1 ของซีรีส์ LFCS) เพื่อจำกัดเอาต์พุตให้แคบลงตามกระบวนการที่คุณต้องการ:

ps -ef | grep -i squid | grep -v grep

รายการกระบวนการด้านบนแสดงข้อมูลต่อไปนี้:

เจ้าของกระบวนการ, PID, Parent PID (กระบวนการพาเรนต์), การใช้งานโปรเซสเซอร์, เวลาที่คำสั่งเริ่มทำงาน, tty (? ระบุว่าเป็น daemon), เวลา CPU ที่สะสม และคำสั่งที่เกี่ยวข้องกับกระบวนการ

ตัวอย่างที่ 8: การปรับแต่งและการเรียงลำดับเอาต์พุตของ ps

อย่างไรก็ตาม บางทีคุณอาจไม่ต้องการข้อมูลทั้งหมดนั้น และต้องการแสดงเจ้าของกระบวนการ คำสั่งที่เริ่มต้นกระบวนการ PID และ PPID และเปอร์เซ็นต์ของหน่วยความจำที่ใช้อยู่ในปัจจุบัน ตามลำดับ และจัดเรียงตาม การใช้หน่วยความจำจากมากไปน้อย (โปรดทราบว่า ps โดยค่าเริ่มต้นจะเรียงลำดับตาม PID)

ps -eo user,comm,pid,ppid,%mem --sort -%mem

โดยที่เครื่องหมายลบหน้า %mem แสดงว่าการเรียงลำดับจากมากไปน้อย

หากกระบวนการเริ่มใช้ทรัพยากรระบบมากเกินไปด้วยเหตุผลบางประการ และมีแนวโน้มว่าจะเป็นอันตรายต่อการทำงานโดยรวมของระบบ คุณจะต้องหยุดหรือหยุดการดำเนินการชั่วคราวโดยส่งสัญญาณอย่างใดอย่างหนึ่งต่อไปนี้โดยใช้โปรแกรม kill ไปยังกระบวนการนั้น เหตุผลอื่นที่คุณควรพิจารณาทำเช่นนี้คือเมื่อคุณได้เริ่มต้นกระบวนการในเบื้องหน้า แต่ต้องการหยุดชั่วคราวและดำเนินการต่อในเบื้องหลัง

Signal name Signal number Description
 SIGTERM 15  Kill the process gracefully.
 SIGINT 2  This is the signal that is sent when we press Ctrl + C. It aims to interrupt the process, but the process may ignore it.
 SIGKILL 9  This signal also interrupts the process but it does so unconditionally (use with care!) since a process cannot ignore it.
 SIGHUP 1  Short for “Hang UP”, this signals instructs daemons to reread its configuration file without actually stopping the process.
 SIGTSTP 20  Pause execution and wait ready to continue. This is the signal that is sent when we type the Ctrl + Z key combination.
 SIGSTOP 19  The process is paused and doesn’t get any more attention from the CPU cycles until it is restarted.
 SIGCONT 18  This signal tells the process to resume execution after having received either SIGTSTP or SIGSTOP. This is the signal that is sent by the shell when we use the fg or bg commands.
ตัวอย่างที่ 9: การหยุดการดำเนินการของกระบวนการที่กำลังทำงานอยู่ชั่วคราวและดำเนินการต่อในเบื้องหลัง

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

process_name &

หรือ
เมื่อมันเริ่มทำงานในเบื้องหน้าแล้ว ให้หยุดชั่วคราวและส่งมันไปที่พื้นหลังด้วย

Ctrl + Z
kill -18 PID

ตัวอย่างที่ 10: การฆ่าด้วยกำลังกระบวนการ "กลายเป็นเรื่องบ้าไปแล้ว"

โปรดทราบว่าการแจกจ่ายแต่ละครั้งมีเครื่องมือในการหยุด/เริ่มต้น/รีสตาร์ท/โหลดบริการทั่วไปซ้ำอย่างสวยงาม เช่น บริการ ในระบบที่ใช้ SysV หรือ systemctl ในระบบที่ใช้ systemd

หากกระบวนการไม่ตอบสนองต่อยูทิลิตี้เหล่านั้น คุณสามารถฆ่ากระบวนการด้วยการบังคับโดยส่งสัญญาณ SIGKILL ไปยังกระบวนการนั้น

ps -ef | grep apache
kill -9 3821

แล้ว.. เกิดอะไรขึ้น/กำลังเกิดขึ้น?

เมื่อเกิดการขัดข้องใดๆ ในระบบ (ไม่ว่าจะเป็นไฟฟ้าดับ ฮาร์ดแวร์ขัดข้อง การหยุดชะงักของกระบวนการที่วางแผนไว้หรือโดยไม่ได้วางแผนไว้ หรือความผิดปกติใดๆ เลย) บันทึกใน /var/log เป็นเพื่อนที่ดีที่สุดของคุณเพื่อพิจารณาว่าเกิดอะไรขึ้นหรืออะไรอาจทำให้เกิดปัญหาที่คุณกำลังเผชิญอยู่

cd /var/log

รายการบางรายการใน /var/log เป็นไฟล์ข้อความปกติ รายการอื่นๆ เป็นไดเร็กทอรี และรายการอื่นๆ เป็นไฟล์บีบอัดของบันทึกที่หมุนเวียน (ประวัติ) คุณจะต้องตรวจสอบผู้ที่มีคำว่า error ในชื่อ แต่การตรวจสอบส่วนที่เหลือก็มีประโยชน์เช่นกัน

ตัวอย่างที่ 11: การตรวจสอบบันทึกเพื่อหาข้อผิดพลาดในกระบวนการ

ลองนึกภาพสถานการณ์นี้ ไคลเอ็นต์ LAN ของคุณไม่สามารถพิมพ์ไปยังเครื่องพิมพ์เครือข่ายได้ ขั้นตอนแรกในการแก้ไขปัญหานี้คือไปที่ไดเรกทอรี /var/log/cups และดูว่ามีอะไรอยู่ในนั้น

คุณสามารถใช้คำสั่ง tail เพื่อแสดง 10 บรรทัดสุดท้ายของไฟล์ error_log หรือ tail -f error_log เพื่อดูบันทึกแบบเรียลไทม์

cd /var/log/cups
ls
tail error_log

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

ตัวอย่างที่ 12: การตรวจสอบบันทึกเพื่อหาความล้มเหลวของฮาร์ดแวร์

แม้ว่าความล้มเหลวของฮาร์ดแวร์อาจเป็นเรื่องยากในการแก้ไขปัญหา แต่คุณควรตรวจสอบ dmesg และบันทึกข้อความและ grep เพื่อหาคำที่เกี่ยวข้องกับชิ้นส่วนฮาร์ดแวร์ที่สันนิษฐานว่ามีข้อผิดพลาด

รูปภาพด้านล่างนำมาจาก /var/log/messages หลังจากค้นหาคำว่า error โดยใช้คำสั่งต่อไปนี้:

less /var/log/messages | grep -i error

เราจะเห็นว่าเรากำลังประสบปัญหากับอุปกรณ์จัดเก็บข้อมูล 2 เครื่อง ได้แก่ /dev/sdb และ /dev/sdc ซึ่งจะทำให้เกิดปัญหากับอาร์เรย์ RAID ตามมา

บทสรุป

ในบทความนี้ เราได้สำรวจเครื่องมือบางอย่างที่สามารถช่วยให้คุณทราบสถานะโดยรวมของระบบของคุณอยู่เสมอ นอกจากนี้ คุณต้องตรวจสอบให้แน่ใจว่าระบบปฏิบัติการและแพ็คเกจที่ติดตั้งของคุณได้รับการอัพเดตเป็นเวอร์ชันเสถียรล่าสุด และอย่าลืมตรวจสอบบันทึก! จากนั้นคุณจะถูกพาไปในทิศทางที่ถูกต้องเพื่อค้นหาวิธีแก้ไขปัญหาที่ชัดเจนสำหรับปัญหาต่างๆ

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