ไม่สามารถเข้าถึงได้ทันที? Alibaba Cloud ECS CPU ทำงานเต็ม (100%) บทช่วยสอนการแก้ไขปัญหาและการเพิ่มประสิทธิภาพ
เว็บไซต์ใช้งานได้ดีในระหว่างวันและจู่ๆก็ติดในตอนเย็นเบราว์เซอร์ยังคงวนเวียนอยู่และในที่สุดก็รายงานว่า "504 Gateway Timeout" หรือ "ไม่สามารถเชื่อมต่อได้"
ตกใจรีบเชื่อมต่อกับคอนโซล Alibaba Cloud และดูการตรวจสอบตัวอย่าง ECS:
CPU เต็มและดึงเส้นสีแดง100%
ผู้ดูแลเว็บส่วนบุคคลและการพัฒนาการดำเนินงานและการบำรุงรักษาส่วนใหญ่พบสถานการณ์เช่นนี้อย่าตกใจเมื่อเจอสถานการณ์เช่นนี้และอย่ารีบรีสตาร์ทเซิร์ฟเวอร์ (การรีสตาร์ทสามารถรักษาอาการได้เท่านั้นและ CPU จะยังคงระเบิดในไม่กี่นาที) วันนี้ฉันไม่ได้พูดถึงทฤษฎีเสมือนจริงเพียงแค่ให้ชุด
การตรวจสอบสภาพแวดล้อมการผลิตออนไลน์และการเพิ่มประสิทธิภาพกฎระเบียบทางทหาร
, ทำตามขั้นตอน, ค้นหาเบื้องหลังใน5นาที.
แนวคิดการตรวจสอบหลัก: วิธีการกำหนดตำแหน่งสามขั้นตอน
เมื่อ CPU เต็มตรรกะการแก้ไขปัญหาของเราควรเป็น:
ดูภาพรวม: กระบวนการใด (Nginx, PHP, Java หรือ Trojan Horse) กลืนทรัพยากร
ดูที่ส่วน: โค้ดใดเธรดใดหรือ SQL ใดในกระบวนการนี้ไม่ทำงานอย่างบ้าคลั่ง
มือถัดไป: หลังจากวางตำแหน่งแล้วฉันควรเพิ่มประสิทธิภาพโค้ดเพิ่มแคชหรือฆ่ากระบวนการโดยตรง?
ขั้นตอนที่1: ลงชื่อเข้าใช้เซิร์ฟเวอร์และค้นหากระบวนการที่มีปัญหา (1นาที)
ไม่ว่าการ์ดเว็บไซต์จะเป็นอย่างไรตราบใดที่ SSH ยังสามารถเชื่อมต่อได้ให้เชื่อมต่อทันทีหาก SSH ในเครื่องติดอยู่และไม่สามารถเชื่อมต่อได้โดยตรงผ่านคอนโซล Alibaba Cloud
$ \ Rightarrow $
ตัวอย่าง ECS
$ \ Rightarrow $
การเชื่อมต่อระยะไกล (Workbench) บังคับให้เข้าสู่ระบบ
ป้อนคำสั่งต่อไปนี้ซึ่งเป็นเครื่องมือที่ดีที่สุดสำหรับประสิทธิภาพการแก้ไขปัญหาของ Linux:
แบช
ด้านบน
เข้าสู่
ด้านบน
หลังจากอินเทอร์เฟซให้กดตัวพิมพ์ใหญ่
พี
(เรียงตามการใช้งาน CPU) คุณจะเห็นรายการแบบไดนามิกที่คล้ายกับต่อไปนี้:
ข้อความธรรมดา
PID USER PR NI VIRT RES SHR S % CPU % MEM TIME + COMMAND
12345 nginx 20 0 354m 45m 12m R 98.5 2.3 12:34.56 php-fpm
6789 mysql 20 0 2.5g 1.2g 24m S 1.5 60.2 45:12.89 mysqld
การวิเคราะห์ผล:
ดูแถวแรก
COMMAND
คืออะไร:
หากเป็น php-fpm หรือ node หรือ java: หมายความว่ารหัสธุรกิจของเว็บไซต์ของคุณพบการวนซ้ำไม่สิ้นสุดหรือการเข้าชมจำนวนมากอย่างกะทันหันทำให้ประสิทธิภาพไม่สามารถรองรับได้
ถ้าเป็น mysqld: หมายความว่าฐานข้อมูลพบการสืบค้นช้าดัชนีหายไปหรือการล็อกพร้อมกันสูง
ถ้าเป็น nginx หรือ httpd: ใหญ่
ความน่าจะเป็นคือการพบแปรงที่เป็นอันตรายการโจมตี CC หรือการรวบรวมข้อมูลที่บ้าคลั่ง
หากตัวอักษรและตัวเลขอ่านไม่ออก (เช่น kdevtmpfsi, miner): อย่าคิดเลยว่าเซิร์ฟเวอร์ถูกแฮ็กและถูกจับในฐานะคนงานเหมือง
ขั้นตอนที่2: การแบ่งฉากในเชิงลึกและการทิ้งระเบิดอย่างแม่นยำ (3นาที)
ตามที่คุณ
ด้านบน
สำหรับผลลัพธ์ที่เห็นในนั้นให้เลือกเส้นทางการแก้ปัญหาต่อไปนี้
ฉาก A:Command ใช่
Mysqld
(ฐานข้อมูลติด)
นี่คือฉากที่ความถี่สูงเกิดขึ้นโดยปกติจะเป็นเพราะส่วนของรหัสธุรกิจบางส่วนเป็นขยะเกินไปและมีการตรวจสอบข้อมูลหลายแสนบรรทัดโดยไม่มีการจัดทำดัชนี
1.เข้าสู่ระบบฐานข้อมูลเพื่อดู SQL ที่ดำเนินการในปัจจุบัน
เข้าสู่ระบบ MySQL ของคุณในเทอร์มินัล:
SQL
Mysql-u ราก-p
-ดำเนินการหลังจากเข้าสู่ระบบ
SHOW PROCESSLIST;
หากรายการแจ้งยาวเกินไปและการแสดงผลไม่สมบูรณ์คุณสามารถใช้:
SQL
SHOW FULL PROCESSLIST;
2.จับผีใน
ในรายการผลลัพธ์ให้สังเกต
เวลา
(เวลาดำเนินการ) ยาวมากและ
รัฐ
ชัดเจน
Sending data
、
Sorting for group
หรือ
Creating tmp table
บรรทัดนั้นดูมัน
ข้อมูล
คอลัมน์เขียนคำสั่ง SQL อะไร
การหลีกเลี่ยงเหตุฉุกเฉิน: เมื่อเห็น SQL ช้าที่ทำให้คนอาเจียนเป็นเลือดให้จำ id และเรียกใช้ KILL Id โดยตรง (เช่น KILL 142;) ปล่อยฐานข้อมูลก่อนและเว็บไซต์จะกลับมาเข้าถึงได้ทันที
วิธีแก้ปัญหาที่รุนแรง: ใช้ SQL นี้เพื่อค้นหาสาเหตุในโค้ดและเพิ่มดัชนีลงในฟิลด์หลัง WHERE หรือ JOIN อย่างรวดเร็วหากเป็นการเชื่อมโยงตารางขนาดใหญ่ให้พิจารณาเพิ่มแคช Redis
ฉาก B:Command ใช่
Java
(ขั้นตอนภายในวงที่ไม่สิ้นสุด/OOM)
CPU ของแอปพลิเคชัน Java พุ่งสูงขึ้นโดยปกติเธรดบางตัวจะตกอยู่ใน
While (true)
การหมุนเวียนที่ไม่สิ้นสุดหรือการเก็บขยะ (Full GC) บ่อยๆ
1.ค้นหาเธรดที่ใช้ CPU มากที่สุด
สมมติว่ากระบวนการ PID ของ Java คือ
12345
。ป้อนคำสั่งเพื่อดูว่าเธรดใดที่ใช้ทรัพยากรมากที่สุดในกระบวนการ:
แบช
Top-Hp 12345
ตาม
พี
การเรียงลำดับหากคุณจับเธรด PID ที่ใช้ CPU มากที่สุดคือ
12366
。
2.การแปลง
PID ด้าย
12366
แปลงเป็นเลขฐานสิบหก:
แบช
Printf "% x \n" 12366
# เอาท์พุท: 304e
3.พิมพ์ข้อมูลกอง
ใช้ JDK
Jstack
เครื่องมือค้นหาบรรทัดรหัสที่มีปัญหาโดยตรง:
แบช
Jstack 12345 | grep "304e" -A 20
เทอร์มินัลจะพิมพ์ชื่อคลาสรหัส Java และหมายเลขบรรทัดที่เธรดนี้กำลังดำเนินการโดยตรงในอดีตมันเป็นวนซ้ำที่ไม่มีที่สิ้นสุดหรือไม่มีขอบเขตเปลี่ยนรหัสและปรับใช้ใหม่
ฉาก C:Command ใช่
Nginx
/
Php-fpm
(พบการโจมตีด้วยแปรง/CC ที่เป็นอันตราย)
หากปริมาณการใช้งานปกติมีน้อยมากและจู่ๆ CPU ก็ระเบิดให้ดูบันทึกการเข้าถึงของ Nginx
1.สถิติล่าสุดเข้าถึง IP สูงสุด
แบช
# สมมติว่าบันทึก Nginx ของคุณอยู่ใน/var/log/nginx/access.log
Awk '{print $1}' /var/log/ngx/access.log | sort | uniq -c | sort -nr | head -n 20
หากคุณพบว่า IP ที่ไม่คุ้นเคยถูกรูดหลายหมื่นครั้งในเวลาไม่กี่นาทีไม่ต้องสงสัยเลยว่าคุณกำลังตกเป็นเป้าหมาย
2.เร่งด่วนห้าม IP
ใช้ไฟร์วอลล์ที่มาพร้อมกับ Linux หรือ Alibaba Cloud Security Group โดยตรงเพื่อใส่ IP นี้ลงในบัญชีดำ:
แบช
# ห้ามใช้ iptables
Iptables-I INPUT -s ที่อยู่ IP ที่เป็นอันตราย-j DROP
หากคุณใช้ Alibaba Cloud ให้ไปที่ "กฎกลุ่มความปลอดภัย" ของ ECS โดยตรงและเพิ่มกฎ Drop สำหรับทิศทางขาเข้า
ฉาก D: กระบวนการที่ไม่คาดคิดและไม่คุ้นเคย (เซิร์ฟเวอร์กลายเป็นไก่เนื้อ/การขุด)
หากคุณเห็นกระบวนการแปลกๆมันใช้ CPU 99% และไม่พบซอฟต์แวร์ปกติตามเส้นทาง
ติดตามเถาวัลย์: ใช้ ls -l /proc/Process PID/exe เพื่อดูที่ซ่อนของโปรแกรมที่เป็นอันตรายนี้
ตัดราก: Bashkill -9กระบวนการ PID # บังคับฆ่าเส้นทางโปรแกรมที่เป็นอันตราย rm -rf # ลบไฟล์ไวรัส
ตรวจสอบแบ็คดอร์: แฮกเกอร์มักจะเขียนงานตามกำหนดเวลาป้อน crontab -l เพื่อดูว่ามีสคริปต์จับเวลาที่ดาวน์โหลดไวรัสโดยอัตโนมัติหรือไม่หากมีให้ใช้ crontab -e เพื่อลบทั้งหมด
การป้องกันขั้นสูงสุด: จะหลีกเลี่ยงเส้นสีแดงยาวในครั้งต่อไปได้อย่างไร?
หลังจากเหงื่อเย็นเราจำเป็นต้องใช้มาตรการป้องกันขั้นพื้นฐานและมาตรการจำกัดในปัจจุบันอย่าปล่อยให้ CPU มีโอกาสเป็นผู้เล่นที่สมบูรณ์แบบ
ใช้ "การตรวจสอบระบบคลาวด์" ของ Alibaba Cloud เพื่อกำหนดค่าการเตือนภัยอย่ารอให้ความคิดเห็นของผู้ใช้ไม่สามารถเปิดได้ก่อนที่จะตรวจสอบในการตรวจสอบระบบคลาวด์ของอาลีบาบามีการกำหนดกฎ: "เมื่ออัตราการใช้ CPU ECS มากกว่า85% เป็นเวลา5นาทีให้ส่ง SMS/Dingding ปลุกทันที" แทรกแซงเมื่อมีสัญญาณ
กำหนดค่ากระบวนการทำงานสูงสุดของ PHP-FPM / Nginx
หากเซิร์ฟเวอร์เป็น2คอร์4G ให้จำกัด max_children ไว้ที่ประมาณ30-40ใน php-fpm.conf ด้วยวิธีนี้แม้ว่าการรับส่งข้อมูลจะหมดลงแต่ก็มีเพียงผู้ใช้บางรายเท่านั้นที่แจ้ง502และชั้นล่างสุดของเซิร์ฟเวอร์จะไม่เชื่อมต่อ SSH เนื่องจากหน่วยความจำและ CPU ถูกบีบออกอย่างสมบูรณ์
การใช้ "การปรับขนาดแบบยืดหยุ่น" อย่างสมเหตุสมผลหากเว็บไซต์หรือแอปพลิเคชันของคุณมีส่วนร่วมในกิจกรรมหรือเนื่องจากการค้นหาที่ร้อนแรงนำไปสู่ "การเข้าชม" จริงการเพิ่มประสิทธิภาพแบบสแตนด์อะโลนจะไร้ประโยชน์รีบไปที่ Alibaba Cloud เพื่อเปิด ESS (ESS) และกำหนดค่ากฎ: เมื่อ CPU เกิน80% จะโคลนให้คุณโดยอัตโนมัติและดึง ECS ตัวที่สองและสามขึ้นเพื่อแชร์การรับส่งข้อมูลตามการเรียกเก็บเงินและปล่อยโดยอัตโนมัติหลังจากสิ้นสุดกิจกรรม. ใช้เทคโนโลยีดอกเบี้ยทบต้นเพื่อต่อสู้กับความไม่เที่ยงของการจราจร
