Я пишу службу REST с помощью go-json-rest, который с использованием net/http.Слишком много открытых файлов при использовании сети/http
Мой код сервера просто, получить запрос и передать его в канал
Вот мой код сервера
package main
import (
"github.com/ant0ine/go-json-rest/rest"
"log"
"net/http"
"strconv"
"time"
)
const workerCount = 4
var evChannel = make(chan Event)
var workers = make([]*LogWorker, workerCount)
const maxLogFileSize = 100 // In MB
const maxLogFileBackups = 30
const maxLogFileAge = 5
const logFileName = "/home/sam/tmp/go_logs/event_"
func main() {
// Initialize workers
// Four workers is being created
for i := 0; i < workerCount; i++ {
var fileName = logFileName + strconv.Itoa(i)
workers[i] = NewLogWorker(fileName, maxLogFileSize, maxLogFileBackups, maxLogFileAge)
go workers[i].Work(evChannel)
}
// Initialize REST API
api := rest.NewApi()
//api.Use(rest.DefaultDevStack...)
api.Use(rest.DefaultCommonStack...)
router, err := rest.MakeRouter(
rest.Post("/events", StoreEvents),
)
if err != nil {
log.Fatal(err)
}
api.SetApp(router)
log.Fatal(http.ListenAndServe(":4545", api.MakeHandler()))
}
func StoreEvents(w rest.ResponseWriter, r *rest.Request) {
event := Event{}
err := r.DecodeJsonPayload(&event)
if err != nil {
rest.Error(w, err.Error(), http.StatusInternalServerError)
return
}
// TODO : Add validation if needed
// Add code to parse the request and add further information to event
// log.Println()
select {
case evChannel <- event:
case <- time.After(5 * time.Second):
// throw away the message, so sad
}
// evChannel <- event
//log.Println(Csv(event))
w.WriteHeader(http.StatusOK)
}
Когда я исполняю его непрерывно с помощью JMeter Я иногда получаю ошибку ниже
http: Accept error: accept tcp [::]:4545: too many open files; retrying in 10ms
Имеет ли net/http открытые файлы для каждого запроса?
Розетки, да. Возможно, вам нужно увеличить свой предел fd (через 'ulimit' или' sysctl'). – elithrar
[Файловые дескрипторы] (https://en.wikipedia.org/wiki/File_descriptor), чтобы быть более конкретным. Нельзя легко различить, что у нас слишком много открытых файлов или других ресурсов. –
См. Http://stackoverflow.com/questions/30352725/why-is-my-hello-world-go-server-getting-crushed-by-apachebench. Также убедитесь, что jmeter правильно использует соединение http/1.1 или использует что-то другое для генерации запросов. – JimB