มาทดสอบความเร็วของ Fiber + GORM ในภาษา Golang กัน… (แบบ Native)

Saharak Manoo
2 min readFeb 4, 2021

--

เนื่องจากผมได้ เปลี่ยนจาก Ruby on Rails มา golang เลยลองหา web framework ของ golang ที่เร็วๆ เลยได้มารู้จักกับ Gin และ Fiber และสุดท้ายผมก็เลือก Fiber

ในส่วนของการทดสอบเราจะใช้โปรแกรม wrk ทดสอบความสามารถในการรองรับ โดยใช้คำสั่ง

wrk -c500 -d10 -t10 http://localhost:8080/api/v1/test

โดยสำหรับ URL : http://localhost:8080/api/v1/test เป็นคืนค่า JSON กลับมา

{
"code": 200,
"message": "Go Fiber"
}

โดยผมจะใช้ Fiber V2 ในการทดสอบครั้งนี้

ซึ่งก็จะมี Code ประมาณนี้

หลังจากลองยิงไปประมาณ 3 ครั้งก็ได้ประมาณนี้ครับ

ผลสรุป ได้ประมาณ 58-59Krps นะครับ

ต่อไปเราก็จะมายิงเส้นที่มีการ query กันนะครับ โดยใช้ GORM V2

โดยคำสั่งก็คล้ายๆเดิมเลยครับเปลี่ยนแค่ endpoint

wrk -c300 -d10 -t10 http://localhost:8080/api/v1/sql-query?name=Saharak

โดยสำหรับ URL : http://localhost:8080/api/v1/sql-query เป็นคืนค่า JSON กลับมา เป็น User ตาม name ที่เราใส่เข้าไปนะครับ

ซึ่งก็จะมี Code ประมาณนี้ครับ

หลังจากลองยิงไปประมาณ 3 ครั้งก็ได้ประมาณนี้ครับ

ตกลงไปเยอะเหมือนกันครับ โดยอยู่ที่ประมาณ 11Krps แต่ก็จะมี error บ้างนะครับ เช่นในรอบสุดท้ายมีได้ status ที่ไม่ใช้ 2xx และ 3xx อยู่ 11 ครั้ง

โดยในการทดสอบครั้งนี้ใช้เครื่อง Macbook Pro 2020 2.3 GHz Quad-Core Intel Core i7 Ram 16ในการทดสอบนะครับ

ส่วน Golang ใช้เป็น version

go version go1.15.5 darwin/amd64

Database ใช้เป็น postgres โดยใช้ gorm ต่อและเรียกคำสั่งผ่าน ORM ของ Gorm นะครับ ได้ได้ตั้งค่า Gorm config Connection Pool

dbConfig, err := db.DB()dbConfig.SetMaxIdleConns(1500)dbConfig.SetMaxOpenConns(3500)// คำสั่งปิด
sqlDB.Close()

ทั้งหมดนี้เป็นความอยากรู้ของผม ว่ามันไปได้ถึงขนาดไหน ในการทดสอบแบบเราไม่ได้ต้อง config อะไรเพิ่มเติม ซึ่งถ้าได้ใช้ Redis มาช่วยเรื่อง Cache ก็น่าจะเร็วได้มากกว่านี้ครับ

ถ้าผิดพลาดประการใดขออภัยไว้ ณ ที่นี้ด้วย

ขอบคุณครับ

เพิ่มเติมนะครับ

GORM สามารถ ตั้งค่า Connection Pool ได้นะครับ

sqlDB, err := db.DB()

// SetMaxIdleConns sets the maximum number of connections in the idle connection pool.
sqlDB.SetMaxIdleConns(10)

// SetMaxOpenConns sets the maximum number of open connections to the database.
sqlDB.SetMaxOpenConns(100)

// SetConnMaxLifetime sets the maximum amount of time a connection may be reused.
sqlDB.SetConnMaxLifetime(time.Hour)

--

--

Saharak Manoo
Saharak Manoo

Responses (1)