2015-11-28 3 views
0

Я пишу службу 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 открытые файлы для каждого запроса?

+3

Розетки, да. Возможно, вам нужно увеличить свой предел fd (через 'ulimit' или' sysctl'). – elithrar

+0

[Файловые дескрипторы] (https://en.wikipedia.org/wiki/File_descriptor), чтобы быть более конкретным. Нельзя легко различить, что у нас слишком много открытых файлов или других ресурсов. –

+0

См. Http://stackoverflow.com/questions/30352725/why-is-my-hello-world-go-server-getting-crushed-by-apachebench. Также убедитесь, что jmeter правильно использует соединение http/1.1 или использует что-то другое для генерации запросов. – JimB

ответ

0

Публикация elithrar комментарий как ответ

Розетки, да. Возможно, вам потребуется увеличить лимит fd (через ulimit или sysctl).

Смежные вопросы