为什么这个"你好世界" golang http示例在osx上放慢速度

时间:2015-02-09 09:41:23

标签: linux macos performance go benchmarking

我正在对我的小型Web应用程序进行基准测试,并注意到在几千次请求之后我运行apache bench时,显着减速。

ab -n 20000 http://localhost:8080

前几千个请求速度很快,然后变得越来越慢。显着慢。虽然第一千可能需要一秒钟,但要求18000-20000需要10秒钟。

所以我试图找到缓慢的部分,在某些时候我没有任何东西可以排除,直到我最终确定了一个" hello world"样式http服务器示例。令我惊讶的是,同样的减速发生了。

package main

import "net/http"

func main() {
    mux := http.NewServeMux()

    mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        w.WriteHeader(200)
    })
    http.ListenAndServe(":8080", mux)
}

同样的小例子在linux机器上一直运行得很快。这并不是一件大事,因为我不打算在生产中运行osx上的应用程序;)但我很好奇是什么导致了osx的可怕减速

1 个答案:

答案 0 :(得分:4)

将我的评论称为各种答案:

我不确定Linux和OSX之间的具体区别是什么,但是您的服务器代码非常好并且没有泄漏任何东西。 (我现在没有OSX机器可以深入挖掘)。

我怀疑你正在使用的客户端(ab)没有重用连接,并且由于两个操作系统之间的配置和行为差异,你将大量涌入网络堆栈是封闭的连接或沿着这些方向的东西。

只需在您的ab脚本中使用KeepAlive - ab -k -c 100 -n 20000 http://localhost:8080 - 并且正如评论中所述修复它。它也值得尝试其他工具,如JMeter,围攻等 - 或者只是为此编写一个简单的Go客户端。默认情况下,Go在http库中具有连接重用。