Apache Batch是一种流行的压力测量工具。
我自己在golang中编写了具有相同功能的工具。然后我做一些测试。 我发现它很好用。
但是偶然地,我发现我的工具和Apache Batch有所不同:
通过cmd netstat -na|grep ESTABLISHED|wc -l
检查已建立的链接号时:
使用cmd ab -n 128000 -c 128 http://127.0.0.1:8000/
,上面的cmd返回128附近的数字。
但是使用我自己的工具,cmd返回256附近(设置并发128时)。
为什么我自己的工具的并发次数是预期的两倍?
我的代码:
func request(cli *http.Client, uri string) {
resp, err := cli.Get(uri)
if err != nil {
panic(err)
}
defer resp.Body.Close()
if resp.StatusCode != 200 {
panic("return" + strconv.Itoa(resp.StatusCode))
}
}
func workRoutine(ch chan string, wg *sync.WaitGroup) {
cli := &http.Client{}
for uri := range ch {
request(cli, uri)
}
wg.Done()
}
func main() {
rnum := 128
tnum := 128000
url := "http://127.0.0.1:8000/"
ch := make(chan string)
var wg sync.WaitGroup
go func() {
for i := 0; i < tnum; i++ {
ch <- url
}
close(ch)
}()
wg.Add(rnum)
for i := 0; i < rnum; i++ {
go workRoutine(ch, &wg)
}
stime := time.Now()
wg.Wait()
dtime := time.Now().Sub(stime)
fmt.Println("Timecost", dtime)
fmt.Println("Throughputs", float64(tnum)/dtime.Seconds())
}