测试Go语言时性能下降

测试Go语言时性能下降,go,Go,我一直在测试一个简单的web服务器,它是用Go和http_load编写的。当用100个并行程序运行测试1秒时,我看到16k个请求已完成。但是,运行测试10秒会导致类似数量的请求以1秒测试速率的十分之一左右完成 此外,如果我同时运行几个1秒的测试,第一个测试将完成16k个请求,后续测试将只完成100-200个请求 package main import "net/http" func main() { bytes := make([]byte, 1024) for i := 0

我一直在测试一个简单的web服务器,它是用Go和http_load编写的。当用100个并行程序运行测试1秒时,我看到16k个请求已完成。但是,运行测试10秒会导致类似数量的请求以1秒测试速率的十分之一左右完成

此外,如果我同时运行几个1秒的测试,第一个测试将完成16k个请求,后续测试将只完成100-200个请求

package main

import "net/http"

func main() {
    bytes := make([]byte, 1024)
    for i := 0; i < len(bytes); i++ {
        bytes[i] = 100
    }

    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        w.Write(bytes)
    })
    http.ListenAndServe(":8000", nil)
}
主程序包
导入“net/http”
func main(){
字节:=make([]字节,1024)
对于i:=0;i

我想知道是否有任何原因可以解释为什么在处理如此多的请求时性能会达到上限,以及我在实现上述web服务器时是否遗漏了一些东西。

这可能是对您自己的系统而不是go服务器的限制。如果您尝试使用http_加载访问google之类的东西,也会发生同样的降级:

$> http_load -parallel 100 -seconds 10 google.txt
1000 fetches, 100 max parallel, 219000 bytes, in 10.0006 seconds
219 mean bytes/connection
99.9944 fetches/sec, 21898.8 bytes/sec
msecs/connect: 410.409 mean, 4584.36 max, 16.949 min
msecs/first-response: 279.595 mean, 3647.74 max, 35.539 min
HTTP response codes:
  code 301 -- 1000

$> http_load -parallel 100 -seconds 50 google.txt
729 fetches, 100 max parallel, 159213 bytes, in 50.0008 seconds
218.399 mean bytes/connection
14.5798 fetches/sec, 3184.21 bytes/sec
msecs/connect: 1588.57 mean, 36192.6 max, 17.944 min
msecs/first-response: 237.376 mean, 33816.7 max, 33.092 min
2 bad byte counts
HTTP response codes:
  code 301 -- 727

$> http_load -parallel 100 -seconds 100 google.txt
1091 fetches, 100 max parallel, 223161 bytes, in 100 seconds
204.547 mean bytes/connection
10.91 fetches/sec, 2231.61 bytes/sec
msecs/connect: 1652.16 mean, 35860.4 max, 17.825 min
msecs/first-response: 319.259 mean, 35482.1 max, 31.892 min
HTTP response codes:
  code 301 -- 1019

如你所见,点击google的时间越长,点击率就会下降很多(google.txt包含一个url“”)。这很可能是由于系统中的限制(程序可以拥有的最大打开连接数、内存、cpu等)。

您使用的是什么操作系统,是否进行过TCP/文件调整?大多数HTTP基准测试在达到应用程序限制之前就达到了操作系统限制,这是臭名昭著的。重复测试后出现问题通常是由于操作系统中的端口保持活动设置或文件打开设置。