ไม่สามารถเข้าถึงได้ทันที? Alibaba Cloud ECS CPU ทำงานเต็ม (100%) บทช่วยสอนการแก้ไขปัญหาและการเพิ่มประสิทธิภาพ

เมฆ 2026-05-28 阅读 10
1

เว็บไซต์ใช้งานได้ดีในระหว่างวันและจู่ๆก็ติดในตอนเย็นเบราว์เซอร์ยังคงวนเวียนอยู่และในที่สุดก็รายงานว่า "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 ตัวที่สองและสามขึ้นเพื่อแชร์การรับส่งข้อมูลตามการเรียกเก็บเงินและปล่อยโดยอัตโนมัติหลังจากสิ้นสุดกิจกรรม. ใช้เทคโนโลยีดอกเบี้ยทบต้นเพื่อต่อสู้กับความไม่เที่ยงของการจราจร

1
← 返回新闻中心