Я использую двоичный файл 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)
}
}
Эту проблему можно решить, изменив некоторые параметры вашей системы.
Рекомендую подписаться на следующую тему: Слишком много открытых файлов