前言:

测试环境:

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(用时)平均总用时平均一条请求耗时
用户数为547.798ms64.333ms56.066ms0.5607ms

测试2 10条并发

操作方式测试1(用时)测试2(用时)平均总用时平均一条请求耗时
用户数为10119.037ms88.307ms103.672ms0.5184ms

测试3 20条并发

操作方式测试1(用时)测试2(用时)平均总用时平均一条请求耗时
用户数为20200.559ms190.877ms195.718ms0.4890ms

测试4 50条并发

操作方式测试1(用时)测试2(用时)平均总用时平均一条请求耗时
用户数为50458.408ms448.862ms454.135ms0.4541ms

测试5 80条并发

操作方式测试1(用时)测试2(用时)平均总用时平均一条请求耗时
用户数为80673.473ms667.245ms670.359ms0.4190ms

测试6 100条并发

操作方式测试1(用时)测试2(用时)平均总用时平均一条请求耗时
用户数为1001.2148s0.8109s1.0129s0.5065ms

测试7 150条并发

操作方式测试1(用时)测试2(用时)平均总用时平均一条请求耗时
用户数为1501.6721s1.3690s1.5206s0.5069ms

测试8 200条并发

操作方式测试1(用时)测试2(用时)平均总用时平均一条请求耗时
用户数为2002.2316s2.1661s2.1989s0.5497ms

测试9 250条并发

操作方式测试1(用时)测试2(用时)平均总用时平均一条请求耗时
用户数为2503.2498s3.2113s3.2306s0.6416ms


Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐