Подключение к бассейну подключается каждый раз? - PullRequest
0 голосов
/ 08 июня 2018

Я пытаюсь написать простой http-сервер на ходу, принимаю строку запроса и отправляю ее на redis.Я использую модуль redigo для подключения redis и fasthttp для http-сервера.

В коде (ниже).Я пытаюсь использовать пул redis, чтобы подключения использовались повторно.Когда я пытаюсь выполнить сравнительный анализ, используя ab

ab -n 10000 -c 100 -k -r http://127.0.0.1:9080/?a=b

, я вижу, что открыто почти 6000 соединений redis.Я вижу, что при использовании netstat

не работает пул соединений?Как мне уменьшить количество подключений к Redis?

package main

import (
    "fmt"
    "time"
    "github.com/garyburd/redigo/redis"
    "github.com/valyala/fasthttp"
)

var Pool *redis.Pool
var err error

func init() {
    Pool = newPool("127.0.0.1:6379")
    _, err = Pool.Dial()
    if err != nil {
        fmt.Println(err)
    }
}

func newPool(server string) *redis.Pool {

    return &redis.Pool{
        MaxIdle:     3,
        IdleTimeout: 240 * time.Second,
        Dial: func() (redis.Conn, error) {
            c, err := redis.Dial("tcp", server)
            if err != nil {
                return nil, err
            }
            return c, err
        },
    }
}

func fastHTTPHandler(ctx *fasthttp.RequestCtx) {
    conn := Pool.Get()
    defer conn.Close()
    conn.Do("RPUSH", "LTBENCH_PARAMS", ctx.QueryArgs().QueryString())

}

func main() {
    fasthttp.ListenAndServe(":9080", fastHTTPHandler)
}

1 Ответ

0 голосов
/ 08 июня 2018

Одновременно разрешено только 3 неактивных подключения в пуле, поэтому после завершения первого одновременного пакета из 100 клиентов вместо 97 могут быть закрыты до 97 таких подключений.

Вам нужно установить MaxIdle на значение, которое может обработать ваш ожидаемый параллелизм, который в данном случае равен 100.Если вы хотите ограничить количество открытых соединений, вам также следует установить MaxActive и Wait, чтобы пики активности не истощали ресурсы сервера.

return &redis.Pool{
    MaxIdle:     100,
    IdleTimeout: 240 * time.Second,
    MaxActive:   200,
    Wait:        true,
    Dial:        func() (redis.Conn, error) { return redis.Dial("tcp", addr) },
}
...