Go 的 http 服务器,同时下载的连接不能超过两个吗?

2022-06-10 11:12:08 +08:00
 daokedao

一个最简单的 http 服务器:

func main() {
	fs := http.FileServer( http.Dir("./public"))
	http.Handle("/", fs)
	http.ListenAndServe(":8888", nil)
}

用 curl 测试几个连接同时下载:

curl --limit-rate 1k http://1.2.3.4:9999/file.zip --output NUL

结果是,只有第一个和第二个连接正常下载,其他的连接处于停滞状态,只有前面的连接下载完了,后面的才能接着下载。

如果把服务器换成 nginx 则多个连接都可以同时下载。

以上都是在 Windows 11 下进行的 Go 的版本是 1.18.1

4293 次点击
所在节点    Go 编程语言
38 条回复
shakukansp
2022-06-10 11:17:59 +08:00
你就不能在 fs 里面加个 go 么
keepeye
2022-06-10 11:32:07 +08:00
跟你一样的环境,一样的代码,我测试可以并发下载
daokedao
2022-06-10 11:32:57 +08:00
@shakukansp 抱歉我没看懂,如何在 fs 里面加个 go
daokedao
2022-06-10 11:34:51 +08:00
@keepeye 我反复多次都是只能两个连接同时下载,我也不知道我哪不对,所有又用了 nginx 试
shakukansp
2022-06-10 11:44:25 +08:00
@daokedao 对不起我错了,http 本来就是协程的
jakes
2022-06-10 11:45:18 +08:00
http.ListenAndServe 里面就有 go c.serve(connCtx),不需要 fs 再 go 了吧?
beordle
2022-06-10 12:52:45 +08:00
可能说监听队列长度问题。你可以 google 下如何指定。大概率是你 nil 的那个位置。
pathletboy
2022-06-10 13:09:05 +08:00
我猜是写入了同个文件 NUL ?
daokedao
2022-06-10 14:57:45 +08:00
@keepeye @beordle @pathletboy 问题很奇怪,好像和下载的文件大小有关,测试如下:

如果我用小文件(小于 100KB )可以多个同时下载
如果文件大于 1MB 就只能两个同时下载,其他的等待

莫名其妙啊
keepeye
2022-06-10 15:21:48 +08:00
@daokedao 应该不是 go 的问题,我测试的文件几十 MB ,对了,我 curl 命令是在 wsl 里面执行的
daokedao
2022-06-10 15:24:50 +08:00
@keepeye 我是打开了四个 cmd 窗口,用 curl 下载,我再试试
dreasky
2022-06-10 15:54:48 +08:00
不会是 cmd 窗口卡住了吧 :doge
pathletboy
2022-06-10 15:59:01 +08:00
@daokedao
http.DefaultTransport = &http.Transport{
DisableKeepAlives: true,
}
配置下可以,原因未知
daokedao
2022-06-10 18:36:17 +08:00
@dreasky 用同样的 cmd 窗口,从 nginx 下载就没有问题。

@pathletboy 试了 http.DefaultTransport ,也不行。另外我查了 http.DefaultTransport 是用在 client 端的,服务端是用 SetKeepAlivesEnabled(false) ,试了还是不行。
ToBeHacker
2022-06-10 20:12:55 +08:00
nul 文件锁
Frankcox
2022-06-11 08:03:37 +08:00
浏览器这没复现成功,Chrome windows11 go1.18.1 四个标签页下载,都能正常下载。
AnroZ
2022-06-11 10:13:16 +08:00
go 默认运行在一个 cpu 核上的,尝试设置下 runtime.GOMAXPROCS
daokedao
2022-06-11 18:02:23 +08:00
@ToBeHacker 不是 NUL 的问题,即使把 NUL 改为不同的文件名,结果同样。

@AnroZ 网上可查得 Starting from Go 1.5, the default value of GOMAXPROCS is the number of cores.
daokedao
2022-06-11 18:03:53 +08:00
@Frankcox 我也用 Chrome 试了,连续下载四次,开始时只有前两个下载有进度,后两个下载进度一直显示 0 。
但是过了一会,神奇的事情发生了,第三个下载在一瞬间完成了。又过了一会,第四个也在一瞬间完成了。
而这时,第一个和第二个还在下载中。。。
daokedao
2022-06-11 18:17:24 +08:00
@Frankcox 上面一瞬间完成的下载,找到原因了,是下载出错了,只下载了 1KB ,而原文件是 72MB

我又用 Chrome 反复试了,结论还是只能有两个连接同时下载,后面的连接要等前面的结束后才开始下载。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/858651

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX