go學習(十三)——Go 語言socket使用者併發請求效能測試
阿新 • • 發佈:2019-02-08
前言:
測試環境:
windows10虛擬機器vmware安裝的centos6.9
記憶體2g,處理器數量2個,每個處理器核心數量2個
Go版本 go1.7.3 linux/amd64
說明:
本次測試目的:本次測試Go語言的網路服務端在處理大量併發請求時的耗用時間。
測試程式:
服務端程式:
客戶端程式:package main import ( "fmt" "log" "net" ) //開啟服務程式 func startServer() { var i int = 0 //服務端監聽ip和埠號 listener, err := net.Listen("tcp", "localhost:8888") checkError(err) defer listener.Close() fmt.Println("監聽成功") for { i++ fmt.Println("before accept") conn, err := listener.Accept() if err != nil { continue } //開闢一個協程處理客戶端請求 go doServerStuff(conn, i) } } //處理客戶端資訊 func doServerStuff(conn net.Conn, num int) { fmt.Println("accept num:", num) clientInfo := make([]byte, 2048) //讀取客戶端發來訊息 _, err := conn.Read(clientInfo) if err != nil { fmt.Println(" connection error: ", err) return } fmt.Println(string(clientInfo)) sInfo := "I am server, hello" clientInfo = []byte(sInfo) //向客戶端傳送訊息 _, err = conn.Write(clientInfo) if err != nil { fmt.Println(" connection error: ", err) return } } //檢查錯誤 func checkError(err error) { if err != nil { log.Fatal("an error!", err.Error()) } } //主函式 func main() { //開啟服務程式 startServer() }
shell指令碼:package main import ( "flag" "fmt" "log" "net" "time" ) //連線伺服器 func connectServer() { //接通 conn, err := net.Dial("tcp", "localhost:8888") checkError(err) fmt.Println("連線成功!\n") cInfo := "Hello.I am client " buffer := make([]byte, 2048) buffer = []byte(cInfo) conn.Write(buffer) //向伺服器傳送訊息 _, err = conn.Write(buffer) if err != nil { fmt.Println(" connection error: ", err) return } //接收伺服器傳送訊息 _, err = conn.Read(buffer) if err != nil { fmt.Println(" connection error: ", err) return } fmt.Println(string(buffer)) } //檢查錯誤 func checkError(err error) { if err != nil { log.Fatal("an error!", err.Error()) } } //主函式 func main() { var goCount *int goCount = flag.Int("goCount", 0, "goroutine number") //解析輸入的引數 flag.Parse() fmt.Println("go count = ", *goCount) //get current time tInsert := time.Now() fmt.Println("tStart time: ", tInsert) for i := 0; i < *goCount; i++ { fmt.Println("goroutine number: ", i) //連線servser connectServer() } //獲取時間差 elapsed := time.Since(tInsert) fmt.Println("Insert elapsed: ", elapsed) fmt.Println("/n") }
#!/bin/bash
for i in {1..5};do
./client -goCount=5 &
done
說明:以下操作預設設定每個使用者請求次數為20次
測試1 5條併發
操作方式 | 測試1(用時) | 測試2(用時) | 平均總用時 | 平均一條請求耗時 |
---|---|---|---|---|
使用者數為5 | 47.798ms | 64.333ms | 56.066ms | 0.5607ms |
測試2 10條併發
操作方式 | 測試1(用時) | 測試2(用時) | 平均總用時 | 平均一條請求耗時 |
---|---|---|---|---|
使用者數為10 | 119.037ms | 88.307ms | 103.672ms | 0.5184ms |
測試3 20條併發
操作方式 | 測試1(用時) | 測試2(用時) | 平均總用時 | 平均一條請求耗時 |
---|---|---|---|---|
使用者數為20 | 200.559ms | 190.877ms | 195.718ms | 0.4890ms |
測試4 50條併發
操作方式 | 測試1(用時) | 測試2(用時) | 平均總用時 | 平均一條請求耗時 |
---|---|---|---|---|
使用者數為50 | 458.408ms | 448.862ms | 454.135ms | 0.4541ms |
測試5 80條併發
操作方式 | 測試1(用時) | 測試2(用時) | 平均總用時 | 平均一條請求耗時 |
---|---|---|---|---|
使用者數為80 | 673.473ms | 667.245ms | 670.359ms | 0.4190ms |
測試6 100條併發
操作方式 | 測試1(用時) | 測試2(用時) | 平均總用時 | 平均一條請求耗時 |
---|---|---|---|---|
使用者數為100 | 1.2148s | 0.8109s | 1.0129s | 0.5065ms |
測試7 150條併發
操作方式 | 測試1(用時) | 測試2(用時) | 平均總用時 | 平均一條請求耗時 |
---|---|---|---|---|
使用者數為150 | 1.6721s | 1.3690s | 1.5206s | 0.5069ms |
測試8 200條併發
操作方式 | 測試1(用時) | 測試2(用時) | 平均總用時 | 平均一條請求耗時 |
---|---|---|---|---|
使用者數為200 | 2.2316s | 2.1661s | 2.1989s | 0.5497ms |
測試9 250條併發
操作方式 | 測試1(用時) | 測試2(用時) | 平均總用時 | 平均一條請求耗時 |
---|---|---|---|---|
使用者數為250 | 3.2498s | 3.2113s | 3.2306s | 0.6416ms |