Apache Batch - популярный инструмент для измерения давления.
Я сам пишу инструмент с той же функцией в golang.Затем я делаю некоторые тесты.Я считаю, что это работает хорошо.
Но случайно я нахожу отличие от моего инструмента и пакета Apache:
При проверке УСТАНОВЛЕННОГО номера ссылки по 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())
}