слишком много открытых файлов для сервера Golang, работающего за Caddy

Я использую двоичный файл Go, который имеет http-сервер с systemd. Я настроил его так, чтобы у Caddy был обратный прокси-сервер для этого http-сервера.

http: Accept error: accept tcp [::]:8002: accept4: too many open files;
dial tcp 192.85.2.4:443: socket: too many open files

Когда я смотрю на открытые файлы процесса, я получаю 1025 или меньше, хотя мой ulimit установлен на гораздо больший предел:

$ lsof -p 1243 | wc -l
1025
$ ulimit -Sn
200000
$ ulimit -Hn
1048576

Я не уверен, что это проблема, но кажется, что это могло быть? Похоже, что сервер Go должен порождать новые горутины или как-то об этом позаботиться.

РЕДАКТИРОВАТЬ: Вот мой серверный скрипт:

package main
  
import (
        "fmt"
        "time"
        "net/http"
)

type Config struct{}


func (c *Config) testerHandler(w http.ResponseWriter, r *http.Request) {
    r.Body.Close()
    time.Sleep(1 * time.Second)
    fmt.Fprintf(w, "hello\n")
}

func main() {
        c := &Config{}
        http.HandleFunc("/tester", c.testerHandler)
        fmt.Println("listening on http://127.0.0.1:8000")
        http.ListenAndServe(":8000", nil)
}

РЕДАКТИРОВАТЬ: А вот скрипт, который я использую для спама моего сервера:

package main
  
import (
        "log"
        "net/http"
)

func main() {
        number := 10000
        log.Printf("spamming %d numbers\n", number)
        ch := make(chan interface{})
        client := http.Client{}

        for i:=0; i<number; i++{
                go func(number int) {
                        u := "http://127.0.0.1:8000/tester"
                        rsp, err := client.Get(u)
                        if err != nil {
                                ch <- err
                                return
                        }
                        rsp.Body.Close()

                        ch <- rsp
                }(number)
        }

        var errs int
        m := make(map[int]int)

        for i:=0; i<number; i++ {
                rsp := <-ch
                switch rsp.(type) {
                case *http.Response:
                        code := rsp.(*http.Response).StatusCode
                        m[code]++
                default:
                        log.Println(rsp.(error))
                        errs++
                }
        }

        log.Println("errs:", errs)
        for k, v := range m {
                log.Printf("%d:%d\n", k, v)
        }
}
0
задан 3 January 2021 в 03:48

1 ответ

Эту проблему можно решить, изменив некоторые параметры вашей системы.

Рекомендую подписаться на следующую тему: Слишком много открытых файлов

1
ответ дан 2 January 2021 в 23:08

Другие вопросы по тегам:

Похожие вопросы: