0

Go、Node.js、Python-Flask(Tornadoを使用)のベンチマークテストを実行しようとしています。

私は各サーバーに対して以下を実行しています(それぞれ数回):

ab -c 500 -n 100000 http://127.0.0.1:5000

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) 
}

Goソースは正しい/最適ですか?Goに「DNF」よりも優れたグレードを与えたいのですが...ストレス下でGoの信頼性がPythonよりも低いのはなぜですか?サーバーが停止する前に、リクエストの77%しか完了できません。

4

2 に答える 2

2

r.Body.Close() でリクエストボディを閉じる必要があります。

于 2012-09-20T16:23:39.257 に答える
1

Goのgcが開いているものを取得する前にファイル記述子が使い果たされているか、デフォルトでファイル記述子が開いたままになっているため、コードが不足している可能性があります。

/etc/security/limits.confのfdカウントを1024を超えて、またはOSのデフォルトが何であれブーストします。または、それがオプションでない場合は、Go httpサーバーコードを変更して、リクエストが処理された後に各Web接続を閉じるようにします。

于 2012-09-20T03:03:48.763 に答える