99% 文件下载

99% 文件下载

我们在 Ubuntu 12.04 下有服务器,安装了 Apache HTTP 2.2。

内核3.2.0。

下载某些文件时遇到奇怪的行为。

虚拟主机配置:

<Directory /var/www/name/*>
   ...
      AllowOverride AuthConfig

   # add these accordingly for the MIME types to be compressed
   AddOutputFilterByType DEFLATE text/plain
   AddOutputFilterByType DEFLATE text/html
   AddOutputFilterByType DEFLATE text/xml
   AddOutputFilterByType DEFLATE text/css
   AddOutputFilterByType DEFLATE application/xml
   AddOutputFilterByType DEFLATE application/xhtml+xml
   AddOutputFilterByType DEFLATE application/rss+xml
   AddOutputFilterByType DEFLATE application/javascript
   AddOutputFilterByType DEFLATE application/x-javascript

   <Files *.gz>
    SetOutputFilter DEFLATE
    Header set Content-Encoding: gzip
    Header append Content-Encoding: deflate
   </Files>

</Directory>

问题是 - 有时由于未知原因无法下载某些(!)文件:当文件下载 99% 时 - 速度降至 0 并且下载停止。

tcpdump日志中没有任何异常 - 但我在(下载速度== 0之后)结果中发现了一个奇怪的地方。

例如 - 在下载尝试期间badfile.gz

10:36:37.611369 IP (tos 0x0, ttl 64, id 7954, offset 0, flags [DF], proto TCP (6), length 1420)
    37.**.**.176.80 > 10.**.**.25.55981: Flags [.], cksum 0x00a9 (correct), seq 228803:230171, ack 197, win 243, options [nop,nop,TS val 2097666946 ecr 811530774], length 1368
10:36:37.611396 IP (tos 0x0, ttl 64, id 64391, offset 0, flags [DF], proto TCP (6), length 52, bad cksum 0 (->933a)!)
    10.**.**.25.55981 > 37.**.**.80: Flags [.], cksum 0xac28 (incorrect -> 0xf8fc), seq 197, ack 230171, win 4053, options [nop,nop,TS val 811530824 ecr 2097666946], length 0

Flags [.]- 所以,它挂在数据传输上 - 没有Finalize标志(据我所知)。

tcpdump下载另一个文件的另一个例子goodfile.gz(来自服务器端的同一 Apache 目录):

10:39:21.216118 IP (tos 0x0, ttl 64, id 18169, offset 0, flags [DF], proto TCP (6), length 52, bad cksum 0 (->47c9)!)
    10.**.**.25.55981 > 37.**.**.80: Flags [F.], cksum 0xac28 (incorrect -> 0x83bb), seq 0, ack 1, win 4096, options [nop,nop,TS val 811691867 ecr 2097666946], length 0

很少有文件具有不同的扩展名/大小/授权等 - 但问题只出现在其中少数几个。

所以 - 有时会出现问题,而无需在服务器端进行任何更改。有时badfile.gz可以毫无问题地下载 - 有时(通常)它会挂起。

使用浏览器下载时也是如此 - Chrome 报告“失败 - 网络错误“,Firefox - 只是说“估计未知“在下载过程中。

如果我可以添加更多信息,请告诉我。

举几个例子。

badfile第一的:

$ wget http://static.content.domain.net/assets/json/en-GB/content3.json.gz
...
HTTP request sent, awaiting response... 200 OK
Length: 229874 (224K) [application/x-gzip]
Saving to: 'content3.json.gz.3'

content3.json.gz.3                                  99%[==============...=====> ] 224.42K  --.-KB/s   eta 0s    

goodfile

$ wget http://static.content.domain.net/assets/json/en-GB/24k.tar.gz
...
HTTP request sent, awaiting response... 200 OK
Length: 24576 (24K) [application/x-gzip]
Saving to: '24k.tar.gz.1'

24k.tar.gz.1                                       100%[=========...======>]  24.00K  --.-KB/s   in 0.05s  

2015-11-25 10:38:40 (440 KB/s) - '24k.tar.gz.1' saved [24576/24576]

PS 我们的网络配置足够复杂,包括办公室/数据中心之间的 VPN 隧道 - 也可能是这里的原因。

PPS 我们那里也有非常旧的系统:

# /usr/lib/update-notifier/apt-check --human-readable
205 packages can be updated.
154 updates are security updates.

但现在无法更新:-)

答案1

还有故事的延续:几天前,我们apt-get update在一些 Ubuntu 12/14 机器上也遇到了问题 - 它无法完成,并且在列表下载期间也挂起。

NOC 团队在 Cisco ASA 的威胁检测设置中进行了修复,将其更改为“仅扫描到被动”。

答案2

我们还知道 Linux 服务器上的下载失败的问题与您所描述的完全一样。我们在这里追踪到 Linux 内核 3.x 和 Cisco ASA 之间的不兼容性。

请注意,涉及的其中一台机器具有最新的 3.x Debian 内核 3.16.0,并且我们的 ASA 固件更新是最新的。

这些症状并不是 100% 都能重现,而且似乎只影响较大的文件,并且当请求来自外部网络(在我们的例子中是 Internet)时,症状会加剧。

我们这里有一个本地 Linux 发行版的存储库,从互联网上下载 ISO 映像真是一团糟。

我们尝试用 来缓解这个问题,net.ipv4.tcp_sack = 0甚至进行了实验net.ipv4.tcp_ecn = 0,虽然它缓解了这个问题,但并没有在所有服务器中解决它们。

迁移到内核 4.2.0 后问题得到了彻底解决。

我还发现了一个线程,它描述了比我们尝试过的解决方法更多的解决方法sysctl

sysctl -w net.ipv4.tcp_sack=0
sysctl -w net.ipv4.tcp_congestion_control=reno
sysctl -w net.ipv4.tcp_frto=1
sysctl -w net.ipv4.tcp_early_retrans=1

他们还提到了我们不知道的 ASA 配置修复。我建议,如果您有思科设备并有思科支持,请让他们参与进来。

https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1388786

相关内容