gpt4 book ai didi

http - Go 服务器中并发(同时)HTTP 连接的理论最大数量是多少?

转载 作者:IT老高 更新时间:2023-10-28 13:09:14 26 4
gpt4 key购买 nike

用 Go 实现的一个非常简单的服务器可以处理的并发 HTTP 连接数上限是多少?

最佳答案

并发 HTTP 连接数受可用内存和操作系统限制。

在 Linux 中,可以使用 ulimit 打印和更改软操作系统限制 - 例如打开文件的最大数量。

在内存方面,运行在 32 位 Linux 上的最小 Go HTTP 服务器中的每个 HTTP 连接消耗 21 KiB 内存(该服务器的源代码,可与 Go 版本 2013-03 编译-23,在下面)。在 64 位 Linux 上,预计内存消耗会更高。

在服务器可用内存为 1GB 的 32 位系统上,21 KiB 意味着大约有 50,000 个同时连接是可能的。这包括 Linux 内核消耗的内存。

package main

import (
"flag"
"fmt"
"net/http"
"os"
"runtime"
"sync"
)

var isClient = flag.Bool("client", false, "Whether to start the HTTP server or the HTTP client")
var N = flag.Int("n", 1000, "Number of concurrent HTTP requests")

var wait = make(chan byte)
var counter = 0
var reachedN = make(chan byte)

func handler(w http.ResponseWriter, req *http.Request) {
fmt.Fprintf(w, "some text")
counter++
if counter == *N {
reachedN <- 0
}
<-wait // Block this goroutine
}

func main() {
flag.Parse()
if *N <= 0 {
fmt.Fprintf(os.Stderr, "invalid number of goroutines")
os.Exit(1)
}

if *isClient {
// Initiate N http connections
var wg sync.WaitGroup
for i := 0; i < *N; i++ {
wg.Add(1)
go func(ii int) {
_, err := http.Get("http://127.0.0.1:12345")
if err != nil {
fmt.Fprintf(os.Stderr, "client %d: %s\n", ii, err)
os.Exit(1)
}
wg.Done()
}(i)
}
wg.Wait()
} else {
runtime.GOMAXPROCS(1) // No concurrency

// Read MemStats
var m0 runtime.MemStats
runtime.ReadMemStats(&m0)

go func() {
<-reachedN // Wait until there are *N concurrent requests

// Read MemStats
var m1 runtime.MemStats
runtime.ReadMemStats(&m1)

fmt.Printf("Number of HTTP connections: %d\n", *N)
fmt.Printf("Memory consumption per connection: %.2f bytes\n", float64(m1.Sys-m0.Sys)/float64(*N))
os.Exit(1)
}()

http.HandleFunc("/", handler)
err := http.ListenAndServe(":12345", nil)
if err != nil {
fmt.Fprintf(os.Stderr, "server: %s\n", err)
os.Exit(1)
}
}
}

关于http - Go 服务器中并发(同时)HTTP 连接的理论最大数量是多少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8645836/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com