do request failed: Get "http://43.138.118.180:8080/hello/cheetah": dial tcp 43.138.118.180:8080: connectex: Only one usage of each socket address (protocol/network address/port) is normally permitted.
netstat -n | find "WAIT" /c
命令查看,发现有1600连接数而且一直保持了boomer_test.go
的代码,并发用户数 2,每秒增加 1 个用户,运行 5 秒,那么肯定不会出现问题的,这只是测试的代码b := NewStandaloneBoomer(2, 1)
go b.Run(testcase1, &testcase2)
time.Sleep(5 * time.Second)
b.Quit()
hrp boom
的代码发现,发现少了InitBoomer
的方法,很有可能就是这里的问题,最后发现InitBoomer
内有关闭闲置连接的方法
go
// CloseIdleConnections closes any connections which were previously
// connected from previous requests but are now sitting idle in
// a "keep-alive" state. It does not interrupt any connections currently
// in use.
func (t *Transport) CloseIdleConnections() {
t.nextProtoOnce.Do(t.onceSetNextProtoDefaults)
t.idleMu.Lock()
m := t.idleConn
t.idleConn = nil
t.closeIdle = true // close newly idle connections
t.idleLRU = connLRU{}
t.idleMu.Unlock()
for _, conns := range m {
for _, pconn := range conns {
pconn.close(errCloseIdleConns)
}
}
if t2 := t.h2transport; t2 != nil {
t2.CloseIdleConnections()
}
}
InitBoomer
方法,实测结果正常脚本同样执行 2 个接口、1 个事务,并发用户数 200,每秒增加 50 个用户
压测数据
- 测试平台压测数据
平均响应时间
一样约 50ms,但是平均RPS
少了一半,服务器监控下 CPU、带宽、每秒入包/出包数也是同样的1:2
从服务器的日志分析,CPU、带宽、每秒入包/出包数一直在降低
从测试平台分析,并发量一直减少,客户端 (测试平台) CPU 使用率正常,
从 CPU 使用率得知outputOnEvent
的使用率占比很高,
分析outputOnEvent
函数,整体占用率不高,那么导致这个问题应该是函数outputOnEvent
没有用协程。查看源码,发现用了协程,但是也用了线程阻塞,在测试报告入库时用协程应该可以解决问题
package boomer
func (r *runner) outputOnEvent(data map[string]interface{}) {
size := len(r.outputs)
if size == 0 {
return
}
wg := sync.WaitGroup{}
wg.Add(size)
for _, output := range r.outputs {
go func(o Output) {
o.OnEvent(data)
wg.Done()
}(output)
}
wg.Wait()
}
数据接近hrp boom
的压测数据, 最后定位到原因时计算 PCT 时,由于压测时间越长,请求数据多,导致计算时间长,而数据输出没有异步执行,所以影响了压测结果,入库操作采用队列方式
测试报告数据偶现丢失情况,已经提 issues 给作者了查看详情,但是作者那边无法复现到我这种情况,目前暂时搁置