1. 程式人生 > >go學習(十三)——Go 語言socket使用者併發請求效能測試

go學習(十三)——Go 語言socket使用者併發請求效能測試

前言:

測試環境:

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()
}
客戶端程式:
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")
}
shell指令碼:
#!/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