Конечная точка dropwizard нагрузочного теста - PullRequest
1 голос
/ 05 мая 2020

Моя конфигурация Dropwizard выглядит следующим образом:

server:
  applicationConnectors:
    - type: http
      port: 8080
  adminConnectors:
    - type: http
      port: 8081
  minThreads: 50
  type: default
  maxThreads: 1024
  maxQueuedRequests: 1024
  gzip:
    enabled: true
    minimumEntitySize: 128B
    bufferSize: 8KB
    deflateCompressionLevel: 9
    includedMethods: [POST, GET]

Я написал простой код go для нагрузочного тестирования этой конечной точки, чтобы определить максимальное количество запросов в секунду, которое она может выдержать.

func init() {
    // Customize the Transport to have larger connection pool
    defaultRoundTripper := http.DefaultTransport
    defaultTransportPointer, ok := defaultRoundTripper.(*http.Transport)
    if !ok {
        panic(fmt.Sprintf("defaultRoundTripper not an *http.Transport"))
    }
    defaultTransport := *defaultTransportPointer // dereference it to get a copy of the struct that the pointer points to
    defaultTransport.MaxIdleConns = 500
    defaultTransport.MaxIdleConnsPerHost = 450

    myClient = &http.Client{Transport: &defaultTransport}
}

//HitHelloWorldService ...
func HitHelloWorldService() {
    fmt.Println("Hitting the Hello World Service")
    resp, err := myClient.Get(helloWorldEndpoint)

    if err != nil {
        fmt.Printf("Error while hitting endpoint : %v\n", err)
        return
    }
    io.Copy(ioutil.Discard, resp.Body)
    defer resp.Body.Close()
}

Я интегрировал prometheus с dropwizard и использовал графану для построения RPS. Чтобы быть уверенным в RPS.

Теперь проблема в том, что следующий код go вызывает указанную выше функцию.

func main() {
    fmt.Println("Hello !! Starting with go-client to benchmark dropwizard endpoints")

    var wg sync.WaitGroup
    for i := 0; i < 400; i++ {
        wg.Add(1)
        go httpclients.HitHelloWorldService()
    }

    wg.Wait()

}

Я получаю следующую ошибку.

Get http://127.0.0.1:8080/helloWorld: read tcp 127.0.0.1:53576->127.0.0.1:8080: read: connection reset by peer

Максимальная пропускная способность, которую мне удалось достичь, составляет не более 300 запросов в секунду.

Примечание. Я запускаю этот код на локальной машине ma c. Конфигурация выглядит следующим образом:

Память: 16 ГБ, 1600 МГц Процессор DDR3: 2,2 ГГц Intel Core i7

Получить http://127.0.0.1: 8080 / helloWorld : читать tcp 127.0. 0.1: 53567-> 127.0.0.1:8080: чтение: сброс соединения одноранговым узлом

Как я могу добиться более высокого RPS на моей локальной машине ma c. Как я могу исправить проблему: сброс соединения одноранговым узлом .

1 Ответ

0 голосов
/ 07 мая 2020

Ну может достичь 15000 RPS, ничего не меняя на уровне Dropwizard. Но код go переписал. На этот раз я использовал рабочий пул.

const (
    numJobs    int = 5000000
    numWorkers int = 150
)

func worker(id int, jobs <-chan int, results chan<- bool) {
    for j := range jobs {
        fmt.Printf("Processing Job No : %v\n", j)
        httpclients.HitHelloWorldService()
        results <- true
    }
}

func main() {
    fmt.Println("Hello !! Starting with go-client to benchmark dropwizard endpoints")

    jobs := make(chan int, numJobs)
    results := make(chan bool, numJobs)

    for w := 1; w < numWorkers; w++ {
        go worker(w, jobs, results)
    }

    for j := 1; j <= numJobs; j++ {
        jobs <- j
    }

    close(jobs)
    for a := 1; a <= numJobs; a++ {
        <-results
    }
}

График Grafana, фиксирующий количество запросов в секунду и ResponseTime конечной точки

Это помогло обойти проблему, но все еще не знаю, почему соединение сброшено из-за проблемы однорангового узла пришло впервые.

...