我创建了一个简单的go脚本:https://gist.github.com/kbl/86ed3b2112eb80522949f0ce574a04e3
它从互联网上获取一些xml,然后启动X goroutines。 X取决于文件内容。就我而言,它是1700 goroutines。
我的第一次执行完成了:
$ go run mathandel1.go
2018/01/27 14:19:37 Get https://www.boardgamegeek.com/xmlapi/boardgame/162152?pricehistory=1&stats=1: dial tcp 72.233.16.130:443: socket: too many open files
2018/01/27 14:19:37 Get https://www.boardgamegeek.com/xmlapi/boardgame/148517?pricehistory=1&stats=1: dial tcp 72.233.16.130:443: socket: too many open files
exit status 1
我试图将ulimit
增加到2048年。
现在我得到了不同的错误,脚本与你相同:
$ go build mathandel1.go
# command-line-arguments
/usr/local/go/pkg/tool/linux_amd64/link: flushing $WORK/command-line-arguments/_obj/exe/a.out: write $WORK/command-line-arguments/_obj/exe/a.out: file too large
导致该错误的原因是什么?我该如何解决这个问题?
答案 0 :(得分:1)
您运行private void ConfigureRoutes(IRouteBuilder routeBuilder)
{
routeBuilder.MapRoute(
"Default",
"{controller=Home}/{action=Index}/{id?}"
);
}
更改了最大文件大小。
来自ulimit 2048
,man bash(1)
部分:
如果没有给出选项,则假定为-f。
这意味着您现在将最大文件大小设置为ulimit
字节,这对于任何事情都可能不够。
我猜你打算改变打开文件描述符数量的限制。为此,您要运行:
2048
对于原始错误(在更改最大文件大小之前),您将启动1700个goroutines,每个都执行一次http get。每个都使用tcp套接字创建连接。这些由开放文件描述符限制覆盖。
相反,您应该限制并发下载的数量。这可以使用简单的worker pool模式完成。