Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

反向代理镜像站下载大文件总是失败 #198

Open
abcfy2 opened this issue Dec 8, 2017 · 3 comments
Open

反向代理镜像站下载大文件总是失败 #198

abcfy2 opened this issue Dec 8, 2017 · 3 comments
Labels

Comments

@abcfy2
Copy link

abcfy2 commented Dec 8, 2017

测试命令:

curl -O https://cloudera.proxy.ustclug.org/cm5/ubuntu/xenial/amd64/cm/pool/contrib/e/enterprise/cloudera-manager-daemons_5.13.1-1.cm5131.p0.2~xenial-cm5_all.deb
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0  701M    0 1567k    0     0   216k      0  0:55:16  0:00:07  0:55:09  241k
curl: (18) transfer closed with 734423739 bytes remaining to read

当下载文件容量比较大的时候,就时不时随机出现这种错误。

@gaoyifan
Copy link
Member

gaoyifan commented Dec 8, 2017

感谢反馈。
原因是同时使用反向代理服务器的人数过多,导致缓冲空间被耗尽。

2017/12/08 23:31:14 [crit] 23434#23434: *18692359 pwritev() "/tmp/mem/nginx_temp/0000165591" failed (28: No space left on device) while reading upstream, client: 202.38.93.152, server: *.proxy.ustclug.org, request: "GET /cm5/ubuntu/xenial/amd64/cm/pool/contrib/e/enterprise/cloudera-manager-daemons_5.13.1-1.cm5131.p0.2~xenial-cm5_all.deb HTTP/1.1", upstream: "https://151.101.8.167:443/cm5/ubuntu/xenial/amd64/cm/pool/contrib/e/enterprise/cloudera-manager-daemons_5.13.1-1.cm5131.p0.2~xenial-cm5_all.deb", host: "cloudera.proxy.ustclug.org"
2017/12/08 23:31:35 [crit] 23435#23435: *18692749 pwritev() "/tmp/mem/nginx_temp/0000165594" has written only 8192 of 36864 while reading upstream, client: 202.38.93.152, server: *.proxy.ustclug.org, request: "GET /cm5/ubuntu/xenial/amd64/cm/pool/contrib/e/enterprise/cloudera-manager-daemons_5.13.1-1.cm5131.p0.2~xenial-cm5_all.deb HTTP/1.1", upstream: "https://151.101.8.167:443/cm5/ubuntu/xenial/amd64/cm/pool/contrib/e/enterprise/cloudera-manager-daemons_5.13.1-1.cm5131.p0.2~xenial-cm5_all.deb", host: "cloudera.proxy.ustclug.org"

nginx不太适合反向代理大文件。 比如有用户访问A文件(大小1GB),那么在整个请求过程中nginx就会占用服务器1GB的存储空间。 如果用户下载时间很长,或者有大量这类并发请求,就会快速耗尽服务器的缓冲空间。

这还会带来另一个问题——网络波动。 由于反向代理服务器到上游的速度比较快(约20MB/s),会占满出国隧道的带宽,导致其他服务(如light)的网速出现较大幅度的波动。

个人建议: 对于大文件,从上游下载时每次只下载一小块,等用户取回后再下载下一块。以提升缓冲空间的利用效率。
https://github.com/Qihoo360/ngx_http_subrange_module (类似功能的模块还有很多)

@abcfy2
Copy link
Author

abcfy2 commented Dec 9, 2017

或者参考下nginx官方文档 https://www.nginx.com/blog/nginx-caching-guide/

我按照这个文档的优化建议,启用proxy_cache_lock on;,这样似乎并发请求的时候就只会生成一个cache文件,其他客户端请求的时候就会等待,从cache中获取数据,而不会都丢给上游。

@gaoyifan gaoyifan added the fault label Dec 9, 2017
@leozhangzhang
Copy link

今天下载cloudera的文件时候,老是提示retry
image

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

3 participants