คู่มือการปรับแต่งประสิทธิภาพแอปพลิเคชัน Go
- รวมแหล่งข้อมูลด้านเทคนิคสำหรับพัฒนาแอปพลิเคชัน Go ประสิทธิภาพสูง
- มอบแพตเทิร์น ตัวอย่างเชิงปฏิบัติ และอินไซต์ด้านประสิทธิภาพระดับล่าง สำหรับวิศวกรที่พัฒนา API, ไมโครเซอร์วิส และระบบแบบกระจายที่มีประสิทธิภาพสูง
- แม้ Go จะไม่ได้มีตัวเลือกในการจูนประสิทธิภาพมากเท่า C++ หรือ Rust แต่ก็ยังมีโอกาสในการปรับแต่งหลายด้าน เช่น การนำหน่วยความจำกลับมาใช้ซ้ำ การควบคุม allocation และการจัดการเครือข่ายกับ concurrency อย่างมีประสิทธิภาพ
- คู่มือนี้มุ่งเน้นเทคนิคการปรับปรุงประสิทธิภาพที่วัดผลได้ ครอบคลุมตั้งแต่ความสามารถหลักของภาษาไปจนถึงกลยุทธ์เครือข่ายขั้นสูง
เนื้อหาที่ครอบคลุมจนถึงตอนนี้
แพตเทิร์นประสิทธิภาพ Go ที่พบบ่อย
- บทความแรกที่รวบรวมแพตเทิร์นประสิทธิภาพหลักที่นักพัฒนา Go ทุกคนควรรู้
- หัวข้อสำคัญ:
- การใช้งาน
sync.Pool อย่างมีประสิทธิภาพ
- หลีกเลี่ยงการจัดสรรหน่วยความจำที่ไม่จำเป็น
- ปรับแต่ง layout ของ struct และการจัดแนวหน่วยความจำ
- การจัดการ error อย่างมีประสิทธิภาพ
- zero-cost abstraction ผ่าน interface
- เทคนิคการนำ slice กลับมาใช้ซ้ำและการ sort แบบ in-place
- เขียนจากกรณีศึกษาในการทำงานจริง พร้อม benchmark และตัวอย่างโค้ดที่คัดลอกไปใช้ได้
เนื้อหาที่จะครอบคลุมต่อไป
เครือข่ายประสิทธิภาพสูงใน Go
- เตรียมวิเคราะห์เชิงลึกเกี่ยวกับการสร้างบริการเครือข่ายประสิทธิภาพสูงโดยใช้ทั้ง standard library และไลบรารีภายนอก
- หัวข้อที่จะกล่าวถึง:
- การใช้งาน
net/http และ net.Conn อย่างมีประสิทธิภาพ
- การรองรับการเชื่อมต่อพร้อมกันจำนวนมาก
- การจูนประสิทธิภาพด้วย epoll/kqueue,
GOMAXPROCS เป็นต้น
- เทคนิคการทดสอบภายใต้โหลดและการวิเคราะห์คอขวด
- ช่วงเวลาที่ควรใช้ไลบรารีเครือข่ายระดับล่างอย่าง
fasthttp และการหาสมดุลกับการบำรุงรักษา
ผู้อ่านเป้าหมาย
- วิศวกรแบ็กเอนด์ที่ปรับแต่งบริการ Go ในโปรดักชัน
- นักพัฒนาที่ดูแลระบบซึ่งไวต่อ latency
- ทีมที่กำลังย้ายมาใช้ Go หรือกำลังสร้างเส้นทางประมวลผลประสิทธิภาพสูง
- นักพัฒนาที่สนใจโมเดลประสิทธิภาพและ trade-off ของ Go
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
เมื่อดูตัวอย่างแรกเรื่อง object pool ก็รู้สึกแปลกใจที่ทำได้โดยไม่มีคำเตือน
anyคู่มือด้านประสิทธิภาพแนะนำให้ลดการ allocation เพื่อลดเวลา GC
เพิ่มเติม...
zero-copy ถูกประเมินค่าต่ำเกินไป
GOMEMLIMIT ช่วยได้หลายครั้ง
อยากรู้ว่าโปรเจกต์แบบไหนที่จำเป็นต้องทำ optimization
เมื่อดูเอกสาร object pooling ก็สงสัยว่ามีแผนจะทำแพ็กเกจอย่าง
syncให้เป็น generics หรือไม่รู้สึกแปลกใจที่ Golang คล้าย C ในเรื่องการจัดเรียง struct
"struct Data มีอาร์เรย์ [1024]int อยู่ภายใน ซึ่งมีขนาด 4KB"
คุณสามารถหลอกตัวเองได้ด้วยการใช้ sync.Pool