Javascript Go can';t处理基准测试(当Python&;Node.js可以处理时)?

Javascript Go can';t处理基准测试(当Python&;Node.js可以处理时)?,javascript,webserver,python,Javascript,Webserver,Python,我正在尝试对Go、Node.js和Python Flask(使用Tornado)进行基准测试 我已经为每台服务器运行了以下操作(每次运行几次): Node和Python很好地处理了负载,但Go抱怨: apr_socket_recv: Connection reset by peer (104) 以下是我的Node.js代码: var http = require('http'); http.createServer(function (req, res) { res.writeHead(2

我正在尝试对Go、Node.js和Python Flask(使用Tornado)进行基准测试

我已经为每台服务器运行了以下操作(每次运行几次):

Node和Python很好地处理了负载,但Go抱怨:

apr_socket_recv: Connection reset by peer (104)
以下是我的Node.js代码:

var http = require('http');
http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello World\n');
}).listen(5000, '127.0.0.1');
console.log('Server running at http://127.0.0.1:5000/');
以下是我的Python代码:

import flask
from tornado.wsgi import WSGIContainer
from tornado.httpserver import HTTPServer
from tornado.ioloop import IOLoop

app = flask.Flask(__name__)

@app.route("/")
def index():
    return "Hello, world."

http_server = HTTPServer(WSGIContainer(app))
http_server.listen(5000)
IOLoop.instance().start()
这是我的Go服务器:

package main

import (
   "fmt"
   "net/http"
)

func serve(w http.ResponseWriter, r *http.Request) {
   fmt.Fprintln(w, "Hello, world.")
}

func main() {
   http.HandleFunc("/", serve)
   http.ListenAndServe(":5000", nil) 
}

我的围棋来源正确/最佳吗?我想给围棋一个比“DNF”更好的分数。。。在压力下,Go如何比Python更不可靠?在服务器停止之前,我只能完成77%的请求。

代码可能已经用完了文件描述符,这可能是因为它们在Go的gc获取打开的请求之前被释放,或者是因为它们在默认情况下保持打开状态保持活动状态


将/etc/security/limits.conf中的fd计数提高到1024或操作系统上的默认值。或者,如果这不是一个选项,那么修改Go http服务器代码,使其在处理请求后关闭每个web连接。

该代码可能会耗尽文件描述符,因为它们是在Go的gc获取打开的描述符之前释放的,或者是因为它们在默认情况下处于打开状态保持活动状态


将/etc/security/limits.conf中的fd计数提高到1024或操作系统上的默认值。或者,如果这不是一个选项,那么修改Go http服务器代码,使其在处理请求后关闭每个web连接。

您应该使用r.body.close()关闭请求正文。

您应该使用r.body.close()关闭请求正文。

我尝试了Sakee(Sakee-c 500-r 100000)并恢复了许多不可用的套接字。为了简单起见,Tamas提供了“解决方案”。然而,我强调,如果不提高GOMAXPROCS>=2,我仍然无法运行Go服务器。就我而言,Node是赢家(仅供参考,我是Python开发人员和Go爱好者,而不是Node.js的导师……现在,我想我可能也必须成为Node爱好者!)我尝试了攻城(Sakege-c 500-r 100000)并恢复了许多不可用的套接字。“解决方案”由Tamas提供以简化。但是,我强调,如果不提升GOMAXPROCS>=2,我仍然无法让Go服务器运行。就我而言,Node是赢家(仅供参考,我是一名Python开发人员和Go爱好者,而不是Node.js的新手……现在,我想我可能也必须成为一名节点爱好者!)更好,但仍然需要GOMAXPROCS>=2。更好,但仍然需要GOMAXPROCS>=2。添加“w.Header().Set(“Connection”,“close”)”在性能上等同于r.Body.close()。关于fd计数的评论很公平,但Go应该能够使用与Python和Node相同的资源运行。事实上,GOMAXPROCS必须大于1才能完成Go。添加“w.Header().Set”(“Connection”,“close”)”在性能上等同于r.Body.close().关于fd计数的评论很公平,但是Go应该能够使用与Python和Node相同的资源运行。因此,GOMAXPROCS必须大于1才能完成Go。
package main

import (
   "fmt"
   "net/http"
)

func serve(w http.ResponseWriter, r *http.Request) {
   fmt.Fprintln(w, "Hello, world.")
}

func main() {
   http.HandleFunc("/", serve)
   http.ListenAndServe(":5000", nil) 
}