การสอนการแก้ปัญหาการแก้ไขปัญหา CPU เซิร์ฟเวอร์ Alibaba Cloud เต็มรูปแบบ
สำหรับการดำเนินการและการบำรุงรักษาและการพัฒนาข้อความเตือนที่น่าตกใจที่สุดในตอนกลางดึกคือ "อัตราการใช้งาน CPU ของระบบอินสแตนซ์ ECS เซิร์ฟเวอร์คลาวด์ของคุณสูงถึง100%"
CPU เต็มหมายความว่าพลังการประมวลผลทั้งหมดของเซิร์ฟเวอร์จะถูกบีบออกทันทีตามด้วยเว็บไซต์ที่ติดขัดการตอบสนองของ API หมดเวลาการเชื่อมต่อฐานข้อมูลเต็มและธุรกิจทั้งหมดเป็นอัมพาตเมื่อเผชิญกับสถานการณ์เช่นนี้สามเณรมักจะรีบไปที่คอนโซลเพื่อรีสตาร์ทเซิร์ฟเวอร์แม้ว่าการรีสตาร์ทจะสามารถช่วยฉุกเฉินได้ชั่วคราวแต่หากไม่พบสาเหตุที่แท้จริง CPU จะยังคงเพิ่มขึ้นเป็น100% หลังจากผ่านไป5นาที
บทช่วยสอนในวันนี้จะพาคุณไปพบกับทหารผ่านศึกที่มีประสบการณ์อย่างใจเย็นและเป็นมาตรฐานในการตรวจสอบและแก้ปัญหา CPU เต็มของเซิร์ฟเวอร์ Alibaba Cloud
ขั้นตอนแรก: การตรวจสอบความเข้าใจผิดและการเตรียมการก่อน "พบแพทย์"
ก่อนพิมพ์คำสั่งให้ไปก่อน
คอนโซล Alibaba Cloud
ดูตลาดการตรวจสอบและยืนยันตัวบ่งชี้ที่สำคัญ:
ประเภทพื้นฐาน (T series) รวม CPU
。
หากคุณซื้อ "อินสแตนซ์ประสิทธิภาพต่อเนื่อง" ของ Alibaba Cloud (เช่น t5, t6) เซิร์ฟเวอร์ประเภทนี้มักจะจำกัดพลังการประมวลผลของ CPU พื้นฐาน (เช่นเพียง20%) เมื่อธุรกิจของคุณเกินมาตรฐานจะใช้ "คะแนน CPU" เพื่อให้ได้พลังการประมวลผลเต็มรูปแบบเมื่อคะแนนหมดเซิร์ฟเวอร์จะถูกบังคับให้ "จำกัดความเร็ว" ซึ่งแสดงให้เห็นว่าซีพียูถูกล็อคที่ตำแหน่งที่ต่ำและระบบจะไม่สามารถเคลื่อนที่ได้
วิธีแก้ไข: หากอินสแตนซ์ประสิทธิภาพต่อเนื่องหมดให้เปิด "โหมดไม่มีข้อจำกัดด้านประสิทธิภาพ" ในคอนโซลหรืออัปเกรดเป็นอินสแตนซ์ "สากล" หรือ "คอมพิวเตอร์" โดยตรง
หากไม่รวมข้อจำกัดของรุ่นฮาร์ดแวร์หมายความว่ามีกระบวนการภายในเซิร์ฟเวอร์ที่บ้าคลั่งและเราต้องเข้าสู่ระบบและเริ่ม "จับขโมย"
ขั้นตอนที่สอง: ซีพียูเซิร์ฟเวอร์ Linux เต็มขั้นตอนการตรวจสอบ
เซิร์ฟเวอร์ Linux เป็นพื้นที่ที่มีอุบัติการณ์ของการระเบิดของ CPU สูงซึ่งส่วนใหญ่เกิดจากรหัสที่ไม่ดีการทำงานพร้อมกันสูงหรือโทรจันในการขุด
ขั้นตอนที่1: ค้นหาผู้ร้ายของพลังการคำนวณ "การกิน" (
ด้านบน
คำสั่ง)
ใช้ SSH เพื่อเชื่อมต่อกับเซิร์ฟเวอร์และป้อนคำสั่งทั่วไปของจักรวาลโดยตรงในเทอร์มินัล:
แบช
ด้านบน
หลังจากเข้าสู่อินเทอร์เฟซแบบโต้ตอบแล้วให้กดตัวพิมพ์ใหญ่บนแป้นพิมพ์
พี
(Shift P) เพื่อให้กระบวนการเรียงลำดับจากสูงไปต่ำตามการใช้งาน CPU
จับตาดูสองสามบรรทัดแรกและสังเกตฟิลด์หลักสามช่องต่อไปนี้:
PID: หมายเลขประจำตัวของกระบวนการฆ่ากระบวนการในภายหลังขึ้นอยู่กับมัน
USER: ผู้ใช้รายใดเริ่มกระบวนการนี้ถ้าเป็น www หรือ nginx น่าจะเป็นปัญหารหัสถ้าเป็นรูทและชื่อแปลกระวังโทรจัน
COMMAND: ชื่อของกระบวนการ
การวิเคราะห์ผู้ต้องสงสัย COMMAND ทั่วไป:
Php-fpm, java, node, python: รหัสธุรกิจกำลังทำงานและวนซ้ำหรือฐานข้อมูลที่มีความพร้อมกันสูงไม่ได้รับการจัดทำดัชนีซึ่งทำให้ยากต่อการพกพา
Mysql: ฐานข้อมูลกำลังดำเนินการค้นหาที่เกี่ยวข้องที่ซับซ้อนและการสแกนแบบเต็มตาราง
Kswapd0: ระบบมีหน่วยความจำไม่เพียงพอและกำลังย้ายข้อมูลหน่วยความจำไปยังพาร์ติชัน Swap ของฮาร์ดดิสก์อย่างเมามันทำให้ CPU ทะยานขึ้น
Kinsing, sysrv, สตริงอักขระที่อ่านไม่ออก: ยินดีด้วยเซิร์ฟเวอร์ถูกแฮ็กนี่คือโทรจันการขุดแบบคลาสสิก
ขั้นตอนที่2: การลอกลึกดูว่ากำลังทำอะไรอยู่ในกระบวนการ
หากคุณพบว่าโค้ดของคุณเอง (เช่นกระบวนการ Java หรือ PHP) เต็มไปด้วย CPU การรู้ PID นั้นไม่เพียงพอคุณต้องรู้ว่าโค้ดบรรทัดใดเป็นปีศาจ
สถานการณ์ A: กระบวนการ Java เต็มไปด้วยการสอบสวน (การสัมภาษณ์แบบคลาสสิกและคำถามเชิงปฏิบัติ)
สมมติว่า PID กระบวนการ Java ที่โหลดเต็มคือ
1234
。
ค้นหาหมายเลขเธรด (TID) ที่ใช้ CPU มากที่สุดในกระบวนการนี้: Bashtop -Hp 1234สมมติว่าเธรด1256คิดเป็น90% ของ CPU
แปลงเธรดนี้เป็นเลขฐานสิบหก (เนื่องจากใช้เลขฐานสิบหกในสแต็ก Java):Bashprintf "% x \ n" 1256 # ผลลัพธ์เอาต์พุตถือว่าเป็น: 4e8
ใช้เครื่องมือ jstack เพื่อพิมพ์เธรดสแต็กของ Java และใช้ grep เพื่อจับหมายเลขเธรดเลขฐานสิบหก: Bashjstack 1234 | grep -A 20 "4e8" หน้าจอจะแสดงโดยตรงว่าคลาสใดและบรรทัดใดของโค้ด (เช่น com.xx. service. impl. OrderServiceImpl. lambda $0(OrderServiceImpl. java:88)) กำลังทำงานลูปที่ไม่มีที่สิ้นสุดชัดเจนในพริบตา
ฉาก B:MySQL ทำให้ CPU เต็ม
ถ้าเป็นเช่นนั้น
Mysql
กระบวนการเป็นอันดับหนึ่งลงชื่อเข้าใช้ฐานข้อมูลทันทีเพื่อดำเนินการ:
เอสคิวแอล
แสดงรายการกระบวนการทั้งหมด;
ดูคำสั่ง SQL ที่กำลังดำเนินการอยู่เน้นดู
เวลา
(เวลาดำเนินการ) ประโยคที่ยาวที่สุดหากคุณเห็นจำนวนมาก
Selecting
SQL ที่ไม่ดีซึ่งอยู่ในสถานะและไม่ได้จัดทำดัชนีจะแจ้งให้นักพัฒนาเพิ่มดัชนีโดยตรงหรือขอให้ DBA ฆ่า SQL ที่ไม่ดีนี้ชั่วคราว
ขั้นตอนที่3: กำจัดอย่างเด็ดขาด (วิธีจบอย่างสง่างาม)
สถานการณ์ที่1: การวนซ้ำของรหัสปกติ
หากมีผลต่อการอยู่รอดคุณสามารถใช้ PID เพื่อฆ่ากระบวนการเพื่อแลกกับเวลาหายใจ:
แบช
Kill-9กระบวนการ PID
จากนั้นรีบเปลี่ยนข้อผิดพลาดของรหัส
สถานการณ์ที่2: ม้าโทรจันขุด
แฮกเกอร์มักจะทำงานตามกำหนดเวลาคุณเป็นเพียง
Kill-9
มันไม่สามารถฆ่าได้และจะฟื้นคืนชีพในไม่กี่วินาที
ตรวจสอบงานที่กำหนดเวลา: crontab -l พบสคริปต์ดาวน์โหลดแปลกๆทันทีด้วย cron
ลบ tab -e
ตรวจสอบกระบวนการที่เหลือและฆ่า
อาวุธที่ดีที่สุด: หากม้าโทรจันติดเชื้อในพื้นที่ขนาดใหญ่วิธีแก้ปัญหาที่เร็วและสะอาดที่สุดคือ "ใช้สแนปชอตเพื่อกู้คืนระบบ" หรือติดตั้งระบบใหม่โดยตรงโดยอ้างอิงบทความก่อนหน้านี้
ขั้นตอนที่สาม: ขั้นตอนเต็มรูปแบบของการตรวจสอบ CPU เซิร์ฟเวอร์ Windows
เซิร์ฟเวอร์ Windows ค่อนข้างใช้งานง่ายและแก้ไขได้โดยตรงผ่านอินเทอร์เฟซแบบกราฟิก
ขั้นตอนที่1: เปิดตัวจัดการงาน
เดสก์ท็อประยะไกลเชื่อมต่อกับเซิร์ฟเวอร์
คลิกขวาที่แถบงานที่ด้านล่างแล้วเลือกตัวจัดการงาน
คลิกที่ส่วนหัวของคอลัมน์ CPU เพื่อจัดเรียงตามการใช้งานจากสูงไปต่ำ
ขั้นตอนที่2: การตรวจสอบทรัพยากรในเชิงลึก
บางครั้งตัวจัดการงานสามารถมองเห็นได้เท่านั้น
W3wp.exe
(กระบวนการ IIS) หรือ
Sqlservr.exe
สูงมากมองไม่เห็นรายละเอียด
ที่ด้านล่างของตัวจัดการงานให้คลิกเพื่อเปิดการตรวจสอบทรัพยากร
สลับไปที่แท็บ CPU 。
ที่นี่คุณสามารถดูบริการเฉพาะของแต่ละกระบวนการหากเป็น w3wp.exe ที่สูงขึ้นแสดงว่ามีปัญหากับรหัสเว็บไซต์บน IIS คุณสามารถใช้ "กระบวนการทำงาน" ของ IIS เพื่อดูว่าเว็บไซต์ใดและ URL ใดใช้ทรัพยากรอย่างบ้าคลั่ง
ขั้นตอนที่สี่: การป้องกันดีกว่าการรักษา-จะป้องกันไม่ให้ CPU เต็มอีกครั้งได้อย่างไร?
หลังจากไฟดับแล้วคุณต้องตั้งแนวป้องกันสามแนวเพื่อไม่ให้ตื่นขึ้นมากลางดึก:
กำหนดค่า "กฎการแจ้งเตือน CPU" ในคอนโซล Alibaba Cloud: เข้าสู่การตรวจสอบระบบคลาวด์-> การจัดกลุ่มแอปพลิเคชันหรือการตรวจสอบโฮสต์เพิ่มสัญญาณเตือนไปยังเซิร์ฟเวอร์: เมื่ออัตราการใช้งาน CPU> = 85% เป็นเวลา5นาทีให้ส่งข้อความ/Dingding ไปยังโทรศัพท์ทันทีแทรกแซงก่อนถึง100%
เพิ่ม "บันทึกการสืบค้นช้า" ในฐานข้อมูล: เปิด slow_query_log ของ MySQL และบันทึก SQL ทั้งหมดที่มีเวลาดำเนินการมากกว่า1วินาทีแจกจ่ายให้กับการพัฒนาและการเพิ่มประสิทธิภาพทุกวันเพื่อกำจัดอันตรายที่ซ่อนอยู่ในตา
กลไกการหมดเวลาการตั้งค่าเลเยอร์โค้ด: ไม่ว่าจะเป็นการเรียก API ภายนอกการวนซ้ำที่ซับซ้อนหรือมัลติเธรดต้องกำหนดเวลาหมดเวลาสูงสุดอย่าปล่อยให้วงวนที่ไม่สิ้นสุดแขวนไปเรื่อยๆเพื่อใช้พลังการคำนวณ
สรุป
การตรวจสอบ CPU เต็มรูปแบบเช่นการจับขโมย:
ขั้นแรกให้ใช้ตัวจัดการด้านบน/งานเพื่อล็อคผู้ต้องสงสัย (PID) จากนั้นใช้ jstack / PROCESSLIST เพื่อรับหลักฐานทางอาญา (บรรทัดใดของรหัส/SQL ใด) และสุดท้ายจัดการอย่างเด็ดขาดและติดตั้งสัญญาณเตือนการตรวจสอบ
。
อย่าตกใจเมื่อคุณพบปัญหาและลอกทีละชั้นตามกระบวนการมาตรฐานรหัสที่ไม่ดีหรือโทรจันที่ทำให้ระบบติดขัดจะไม่มีที่ให้ซ่อน

