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(用时)平均总用时平均一条请求耗时
用户数为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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值