使用 net/http 时打开的文件太多

我正在使用go-json-rest编写 REST 服务,它反过来使用 net/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: 接受错误:接受 tcp [::]:4545: 打开的文件太多;10ms 后重试


net/http 是否为每个请求打开文件?


30秒到达战场
浏览 235回答 1
1回答

临摹微笑

发布 elithrar 评论作为答案插座,是的。您可能需要增加 fd 限制(通过 ulimit 或 sysctl)。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go