Почему мой инструмент измерения давления Golang и Apache Batch генерируют разное количество УСТАНОВЛЕННЫХ ссылок? - PullRequest
0 голосов
/ 18 марта 2019

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())
}
...