การซื้อบัญชี Tencent Cloud: ประสบการณ์เลือดและน้ำตาที่แท้จริงของปริมาณงานขนาดใหญ่ของเซิร์ฟเวอร์หน่วยความจำ
ในแวดวงอินเทอร์เน็ตในปัจจุบันคำที่สถาปนิกและนักพัฒนาส่วนหลังพูดถึงทุกวันคือ:
การทำงานพร้อมกันสูงเวลาแฝงต่ำปริมาณงานขนาดใหญ่
。
ในการติดตามตัวชี้วัดเหล่านี้เราได้เพิ่มประสิทธิภาพโค้ดอย่างสิ้นหวังเพิ่มแคช Redis ทำการแยกการอ่านและเขียน MySQL และมีส่วนร่วมในฐานข้อมูลย่อยและตารางย่อย... ผมร่วงทั่วพื้นแต่ในหลายๆกรณีเมื่อเผชิญกับช่วงเวลาที่น่ากลัวอย่างแท้จริง (เช่นการเพิ่มขึ้นอย่างรวดเร็วของอีคอมเมิร์ซการจับสลากโปรโมชั่นขนาดใหญ่และอุปกรณ์ IoT ขนาดใหญ่ที่รายงานข้อมูลทุกวินาที) คุณจะพบว่าไม่ว่าคุณจะปรับให้เหมาะสมอย่างไรซีพียูของเซิร์ฟเวอร์ก็ยังคงเต็มทันทีและปริมาณงานของระบบมันไม่สามารถลุกขึ้นได้
ต่อมาเพื่อนของฉันปลุกฉันด้วยประโยคเดียว: "คุณซ่อมที่ชั้นซอฟต์แวร์ทุกวันทำไมคุณไม่ดูฮาร์ดแวร์พื้นฐานล่ะ?
อินสแตนซ์สากลที่คุณซื้อด้วยงบประมาณเพียงเล็กน้อยแบนด์วิดท์หน่วยความจำพื้นฐานและแคช CPU ถูกคุณบีบออกไปนานแล้ว!
”
ด้วยความสงสัยทีมงานของเราได้ย้ายแคชหลักและโหนดการประมวลผลข้อมูลไปยังเซิร์ฟเวอร์หน่วยความจำของผู้ให้บริการระบบคลาวด์ด้วยค่าใช้จ่ายของตนเองบทช่วยสอนของวันนี้ไม่ได้พูดถึงพารามิเตอร์ PPT อย่างเป็นทางการเสมือนจริงฉันจะพาคุณไปสัมผัสประสบการณ์ที่ครอบคลุมและสมจริงจากมุมมองของสถาปนิกแนวหน้า:
เมื่อเซิร์ฟเวอร์หน่วยความจำเข้าสู่ธุรกิจ "ทรูพุตขนาดใหญ่" ประสบการณ์ที่สดชื่นคืออะไร?
1.เซิร์ฟเวอร์หน่วยความจำคืออะไร? (เวอร์ชั่นพื้นถิ่น)
ก่อนที่จะพูดถึงการวัดจริงเราต้องหา:
อะไรคือความพิเศษของเซิร์ฟเวอร์หน่วยความจำ?
หลายคนคิดว่าเซิร์ฟเวอร์ไม่ใช่แค่ดู CPU กี่คอร์และหน่วยความจำกี่ GB? เซิร์ฟเวอร์ General Purpose มี16คอร์64G และเซิร์ฟเวอร์หน่วยความจำ Optimized ยังมี16คอร์64G ทำไมหน่วยความจำจึงมีราคาแพงกว่า? มันเก็บภาษีไอคิวหรือไม่?
คำตอบคือ:
"คุณภาพ" และ "อัตราส่วน" ของหน่วยความจำแตกต่างกันอย่างสิ้นเชิง
"อัตราส่วน" ที่น่ากลัว: อัตราส่วนของ CPU ต่อหน่วยความจำของเซิร์ฟเวอร์สากลมักจะอยู่ที่1:4 $ (เช่น4คอร์16G) ในขณะที่อัตราส่วนของเซิร์ฟเวอร์หน่วยความจำมักจะอยู่ที่1:8 $หรือ1:16 $ (เช่น4คอร์32G หรือ8คอร์64G)
"ช่องโอเวอร์คล็อก" ระดับฮาร์ดแวร์: เซิร์ฟเวอร์หน่วยความจำมักใช้ซีพียูระดับไฮเอนด์ล่าสุด (เช่นโปรเซสเซอร์ AMD EPYC หรือ Intel Xeon Scalable ความถี่สูง) และมีช่องหน่วยความจำมากกว่า (ช่องหน่วยความจำ) ซึ่งหมายความว่าหน่วยความจำเซิร์ฟเวอร์ธรรมดาดูเหมือนจะวิ่งบนถนนในเขตสองเลนในขณะที่หน่วยความจำของเซิร์ฟเวอร์หน่วยความจำวิ่งบนทางหลวงแปดเลนสองทางแบนด์วิดท์หน่วยความจำ (Bandwidth) และความถี่อ้างอิงสูงกว่าประเภทสากลมาก
ความล่าช้าต่ำมาก: เนื่องจากการเพิ่มประสิทธิภาพอย่างมากของการเข้าถึงหน่วยความจำโดยสถาปัตยกรรมพื้นฐานความล่าช้าในการเข้าถึงข้อมูลหน่วยความจำของ CPU (Latency) จึงถูกบีบอัดเป็นระดับนาโน
สอง
, การจำลองฉาก: "ธุรกิจนรก" ที่ทรมานเซิร์ฟเวอร์สากล
เพื่อให้ทุกคนมีความรู้สึกที่เข้าใจง่ายเกี่ยวกับ "ปริมาณงานขนาดใหญ่" ก่อนอื่นให้ฉันอธิบายสิ่งที่เราเผชิญ
ฉากธุรกิจจริง
:
เรามีแอป Internet of Things (IoT) ที่อุปกรณ์อัจฉริยะหลายแสนเครื่องทั่วประเทศจะออนไลน์พร้อมกันในช่วงเวลาสำคัญตั้งแต่8.00-9.00น. ทุกคืนอุปกรณ์แต่ละเครื่องจะรายงานข้อมูล JSON ที่ซับซ้อน (รวมถึงอุณหภูมิพลังงานวิถี GPS บันทึกการทำงานของผู้ใช้ฯลฯ) ไปยังเซิร์ฟเวอร์ทุกๆ0.5วินาที
จุดเจ็บปวดทางธุรกิจ: QPS (จำนวนคำขอต่อวินาที): จุดสูงสุดสามารถพุ่งไปที่100,000ลักษณะข้อมูล: ความถี่สูงปริมาณงานมากแต่แพ็กเก็ตข้อมูลเดียวมีขนาดเล็กสถาปัตยกรรมเก่า: เซิร์ฟเวอร์ที่ใช้งานทั่วไป1เครื่อง (16คอร์64G) สำหรับการส่งต่อ Nginx เซิร์ฟเวอร์ที่ใช้งานทั่วไป2เครื่องเรียกใช้บริการรับการเขียนภาษา Go ข้อมูลจะถูกเขียนลงในคลัสเตอร์แคช Redis ในเครื่องก่อนจากนั้นสคริปต์แบบอะซิงโครนัสจะถูกปัดลงใน MongoDB
ความผิดพลาดของสถาปัตยกรรมเก่าในชีวิตประจำวัน:
การซื้อบัญชีเทนเซ็นต์คลาวด์
ทุกคืนเวลา8:30น. ข้อความของตำรวจเริ่มทิ้งระเบิดอย่างไม่ไยดีเปิดบอร์ดตรวจสอบเพื่อดู:
อัตราการเข้าพักของ CPU มีเสถียรภาพสูงกว่า95%
Nginx เริ่มรายงาน502 Bad Gateway หรือ504 Gateway Timeout อย่างบ้าคลั่ง
ปริมาณงานของระบบ (Throughput) ติดอยู่ที่30,000/วินาทีและไม่สามารถขึ้นได้อีกคำขอที่เหลือทั้งหมดอยู่ในคิวหมดเวลาแล้วลองใหม่โดยอุปกรณ์ทำให้เกิดเอฟเฟกต์หิมะถล่มที่น่ากลัวยิ่งขึ้น
เราสงสัยในตอนนั้น: เห็นได้ชัดว่าหน่วยความจำถูกใช้น้อยกว่า40% ทำไมระบบถึงติด?
ต่อมาฉันใช้เครื่องมือเพื่อดึงข้อมูลพื้นฐาน
เนื่องจากการแลกเปลี่ยนข้อมูลบ่อยเกินไปซีพียูจึงใช้พลังงานไปมากในการสลับบริบทและคิวบัสของ "รอให้หน่วยความจำส่งข้อมูล" (นั่นคือคอขวดแบนด์วิดท์หน่วยความจำ)
3.การปรับแต่งขั้นสูงสุด: การวัดจริง24ชั่วโมงของการเปลี่ยนเซิร์ฟเวอร์หน่วยความจำ
เพื่อแก้ปัญหานี้เราโหดร้ายและเปลี่ยนเซิร์ฟเวอร์สากลสองเครื่องที่รับบริการเป็นสองเครื่องโดยตรง
เซิร์ฟเวอร์หน่วยความจำ (16คอร์128G โดยใช้สถาปัตยกรรมหน่วยความจำ DDR5รุ่นล่าสุด)
。
หลังจากเปิดตัวอีกครั้งเราใช้เครื่องมือทดสอบความเครียดเพื่อจำลองการทดสอบความเครียดพร้อมกัน100,000ครั้งประสบการณ์จริงสามารถอธิบายได้เพียงสองคำ:
สะเทือนใจ
。
ต่อไปนี้เป็นตารางเปรียบเทียบข้อมูลหลักที่เราบันทึกระหว่างการทดสอบความเครียด:
ตัวบ่งชี้การตรวจสอบ
สถาปัตยกรรมเก่า: ตัวอย่างทั่วไป (16แกน64G × 2)
สถาปัตยกรรมใหม่: อินสแตนซ์ประเภทหน่วยความจำ (16แกน128G × 2)
การปรับปรุงประสิทธิภาพและการเปลี่ยนแปลงประสบการณ์
ปริมาณงานมาก (Throughput)
~ 35,000คำขอ/วินาที (พบคอขวด)
112,000คำขอ/วินาที
ทะยานขึ้น3.2เท่ากลืนการจราจรทั้งหมดได้อย่างง่ายดาย
ความล่าช้าในการตอบสนองเฉลี่ย (Latency)
240ms (คิวจำนวนมาก
หมดเวลา)
4.2ms
การตอบสนองเกือบทันทีไม่มีการหมดเวลาที่ด้านอุปกรณ์
การใช้งาน CPU สูงสุด
95% - 100% (ติดขอบ)
32% - 40%
ซีพียูเป็นแบบสบายๆและมีระยะขอบมาก
การใช้แบนด์วิดท์หน่วยความจำ
ใกล้100% (บัสอุดตัน)
28%
พลังของ DDR5 8ช่องความกว้างของถนนรถน้อย
ปรับแต่งความรู้สึกของร่างกายที่แท้จริง:
เมื่อเครื่องมือวัดความดันดันจำนวนพร้อมกันเป็น100,000ฝ่ามือของฉันเหงื่อออกจริงๆแต่สิ่งที่น่าทึ่งก็คือเส้นโค้งการเฝ้าระวังไม่ได้ทะยานขึ้นถึง100% เหมือนเมื่อก่อน
เส้นโค้ง CPU ของเซิร์ฟเวอร์หน่วยความจำจะยกขึ้นเบาๆและอยู่ที่ประมาณ35% อย่างสง่างามภายใต้ปริมาณงานจำนวนมากบริการรับสัญญาณทั้งหมดทำได้ง่ายเหมือนการเดินเล่นในสายลมการหยุดชะงักของระบบ (Stop-the-World) ที่เกิดจากการแยกส่วนของหน่วยความจำและการรีไซเคิลขยะ (GC) ที่มักปรากฏบนเซิร์ฟเวอร์ที่ใช้งานทั่วไปจะถูกกำจัดอย่างไร้ร่องรอยเนื่องจากแบนด์วิดท์บัฟเฟอร์หน่วยความจำขนาดใหญ่ในอินสแตนซ์หน่วยความจำ
ประการที่สี่ความลึกเริ่มต้น: 3ความลับเบื้องหลังปริมาณงานขนาดใหญ่
เมื่อเห็นสิ่งนี้คุณอาจถามว่า: "พี่ชายฉันเปลี่ยนประเภทเซิร์ฟเวอร์ทำไมประสิทธิภาพจึงแย่ลงมาก? ตรรกะพื้นฐานเบื้องหลังนี้คืออะไร?"
เมื่อรวมกับการวัดจริงนี้ฉันจะแยกชิ้นส่วนเรื่องราวภายในสำหรับคุณ:
ความลับที่1: กำจัด "การรอที่ไม่ถูกต้อง" ของ CPU (Memory Bound)
ที่ด้านล่างของคอมพิวเตอร์ความเร็วในการประมวลผลของ CPU เร็วกว่าความเร็วในการอ่านและเขียนของหน่วยความจำหลายร้อยหรือหลายพันเท่าหากธุรกิจของคุณเป็น "ปริมาณงานจำนวนมาก" (เช่นการทำงานพร้อมกันสูงการอ่านและเขียนแคชบ่อยๆ) ซีพียูมักจะต้องหยุดทำงานและรอให้หน่วยความจำถ่ายโอนข้อมูล
เซิร์ฟเวอร์ที่ใช้งานทั่วไปมีแบนด์วิดท์หน่วยความจำต่ำและ CPU มักมีเวลา60% ในการ "พายเรือและข้อมูลอื่นๆ" แบนด์วิดท์สูงและการออกแบบช่องสัญญาณสูงของเซิร์ฟเวอร์หน่วยความจำ
ให้หน่วยความจำป้อนข้อมูลไปยัง CPU ด้วยความเร็วที่เร็วที่สุด
บีบประสิทธิภาพแบบมัลติคอร์ของ CPU จริงๆ
ความลับที่2: เป็นแหล่งเพาะทางกายภาพที่สมบูรณ์แบบสำหรับ Redis / Memcached
Redis ถูกใช้อย่างกว้างขวางในสถาปัตยกรรมของเรา Redis เป็นฐานข้อมูลหน่วยความจำบริสุทธิ์และเป็น
โมเดลเธรดเดี่ยว
。
บนเซิร์ฟเวอร์ที่ใช้งานทั่วไปเมื่อ Redis พบการอ่านและการเขียนหลายหมื่นครั้งต่อวินาทีบรรทัดเดียวจะติดขัดเนื่องจากการตอบสนองของหน่วยความจำช้าหลังจากเปลี่ยนเซิร์ฟเวอร์หน่วยความจำความล่าช้าของหน่วยความจำพื้นฐานนั้นต่ำมากและข้อดีของเรดิสแบบเธรดเดียวของ Redis ถูกนำมาใช้อย่างเต็มที่เครื่องสแตนด์อะโลนสามารถทะลุ100,000 QPS ได้อย่างง่ายดายและปริมาณงานจะเพิ่มขึ้นเป็นสองเท่าโดยตรง
ความลับที่3: "Space for Time" นำมาจากความจุหน่วยความจำขนาดใหญ่
เนื่องจากหน่วยความจำเซิร์ฟเวอร์หน่วยความจำมีความใจกว้างเพียงพอ (128G, 256G ทุกครั้ง) เราจึงเปิดรหัสภาษา Go ขนาดใหญ่โดยตรง
บัฟเฟอร์หน่วยความจำ (In-Memory Buffer Ring)
。
หลังจากข้อมูลเข้ามาคุณไม่จำเป็นต้องอ่านและเขียนดิสก์หรือซับซ้อนในทันที
การตรวจสอบเครือข่ายทั้งหมดถูกกองไว้ในหน่วยความจำโดยไม่ต้องใช้สมองแบทช์ (Batch) ถูกปัดลงในฐานข้อมูลโดยเซิร์ฟเวอร์ในพื้นหลังเกมเพลย์ "Space for Time" แบบนี้กล้าเล่นบนเซิร์ฟเวอร์ที่มีหน่วยความจำเต็มเท่านั้น
5.คำแนะนำในการหลีกเลี่ยงหลุม: ธุรกิจใดที่ควรปิดตา? อันไหนไม่ควรซื้อ?
แม้ว่าเซิร์ฟเวอร์หน่วยความจำจะเจ๋งแต่ราคาของมันก็แพงกว่าเซิร์ฟเวอร์ทั่วไปเพื่อช่วยให้ทุกคนประหยัดเงินฉันได้สรุปชุด
คู่มือการเลือกและหลีกเลี่ยงหลุม
。
💡อย่าลังเลสถานการณ์เหล่านี้ต้องอยู่ใน [เซิร์ฟเวอร์หน่วยความจำ]:
โหนดแคชประสิทธิภาพสูง: หากเซิร์ฟเวอร์ของคุณส่วนใหญ่ใช้เพื่อเรียกใช้ Redis, Memcached หรือ Nginx cache พร้อมกันสูง
การวิเคราะห์ข้อมูลขนาดใหญ่แบบเรียลไทม์/คิวข้อความ: เช่นเรียกใช้ Kafka, Spark Streaming, Flink เป็นต้นมิดเดิลแวร์เหล่านี้มีความต้องการแบนด์วิดท์หน่วยความจำสูงมาก
เซิร์ฟเวอร์เกมที่ทำงานพร้อมกันสูง: พิกัดปริมาณเลือดและสถานะของผู้เล่นในเกมทั้งหมดมีการโต้ตอบบ่อยครั้งในหน่วยความจำและเซิร์ฟเวอร์ที่ใช้งานทั่วไปไม่สามารถพกพาได้
ฐานข้อมูลที่สร้างขึ้นเองที่มีภาระงานสูงเช่น ClickHouse ที่ต้องการหน่วยความจำถาวรและอินสแตนซ์ MySQL ที่มีหน่วยความจำขนาดใหญ่
❌ฟังคำแนะนำของฉันการเลือก [ประเภทสากล/ประเภทการคำนวณ] สำหรับฉากเหล่านี้ก็เพียงพอแล้ว:
เว็บไซต์อย่างเป็นทางการขององค์กรทั่วไปบล็อกและพื้นหลังโปรแกรมขนาดเล็ก: การเกิดขึ้นพร้อมกันหลายร้อยครั้งและการใช้ประเภทหน่วยความจำเป็นการสิ้นเปลืองเงิน
ธุรกิจที่ต้องพึ่งพาการประมวลผลของ CPU เป็นอย่างมากเช่นการแปลงรหัสวิดีโอการแสดงภาพและการคำนวณทางวิทยาศาสตร์บริการเหล่านี้ต้องการ CPU ที่มีความถี่สูงประสิทธิภาพสูง (ควรเลือกอินสแตนซ์ C ที่ใช้คอมพิวเตอร์) ซึ่งไม่ไวต่อแบนด์วิดท์หน่วยความจำมากนัก
สถานีดาวน์โหลดไฟล์แบบคงที่บริสุทธิ์/ดิสก์สำรอง: คอขวดอยู่ที่แบนด์วิดท์เครือข่ายและปริมาณการทำงานของฮาร์ดดิสก์ (ควรเลือกแบนด์วิดท์ขนาดใหญ่และดิสก์คลาวด์มาตรฐาน) ซึ่งไม่เกี่ยวข้องกับหน่วยความจำ
หก. สรุป
"การวัดปริมาณงานที่แท้จริงของเซิร์ฟเวอร์หน่วยความจำขนาดใหญ่" ในครั้งนี้ได้ทำลายอคติ "CPU เท่านั้น" ของทีมเราในอดีตโดยสิ้นเชิง
การซื้อบัญชีเทนเซ็นต์คลาวด์
ในยุคของการประมวลผลแบบคลาวด์การกำจัดคอขวดของระบบมักไม่ได้ขึ้นอยู่กับว่าคุณได้สร้างโค้ดใหม่อย่างละเอียดเพียงใดแต่ขึ้นอยู่กับว่าคุณได้
ธุรกิจที่เหมาะสมวางไว้บนฮาร์ดแวร์ที่ตรงกับการแบ่งงานมากที่สุด
。เซิร์ฟเวอร์หน่วยความจำใช้แบนด์วิดท์ที่น่ากลัวและเวลาแฝงต่ำเพื่อแสดงให้เราเห็นว่า "การบินด้วยอิฐที่ทรงพลัง" ที่แท้จริงคืออะไร
หากธุรกิจของคุณกำลังทุกข์ทรมานจาก "การทำงานพร้อมกันสูงปริมาณงานมากและ CPU ที่สูงอย่างอธิบายไม่ได้" คุณอาจเปิดตัวอย่างหน่วยความจำเพื่อทดสอบความเครียดในคืนนี้-เชื่อฉันเถอะว่ามันเนียนนุ่มประสบการณ์ทรูพุตขนาดใหญ่จะทำให้คุณรู้สึกว่าเงินทุกบาทถูกใช้ไปกับใบมีด!

