发个牢骚先:搞什么,新手就不能一天写两篇以上的新手区文章!新手歧视嘛。

    这篇文章是用来提问题的,所以你可能从中什么也学不到,如果浪费了你的时间,很抱歉。

    二个问题

1、为什么会url直接下载>>HTTPS时下载的速度>>HTTP时下载的速度

2、400M不到的文件,下载过程中inetinfo的虚拟内存居然达到了近2G,那时客户端才下了3M不到

    先描述下场景。这个页面负责文件下载,下载的文件在局域网的另一台机器上(download server),ASPX页面在web server上。在web上做了https,可以通过https或者http访问这个页面;局域网的速度10MB/s;下载的文件大小:363,895KB。

   web服务器配置


    最初的代码是把download server上的文件一股脑的读入内存,然后在传输到客户端。

 

监视了下整个下载过程

(1)任务管理器


(2)性能


 

我对上图的理解是,第一阶段,把远端的文件全部读入web服务器上的asp.net进程占用的内存中(文件363,895KB),在这期间CPU始终保持100%,CPU使用率之所以这么高,是由于局域网的10M速度造成(速度下降到1M时,CPU在60%上下)。

第二阶段,ASP.net的内存迅速上升(远高于文件实际大小),此时IIS进程也不甘人后,可用内存则迅速降低。在IIS的使用内存达到恒定后,客户端弹出保存对话框

第三阶段, 文件传输到客户端。cpu使用率下降,可用内存升高。

可以看出这段代码存在许多问题,尤其是在下载大文件时,ASP.net超出60%物理内存后会被回收,可用内存不够用,CPU 长时间100%。

附张局域网速度1M时的:

 

为了解决这些问题,试了一些方法,但都不成功。或许某人说的对,用纯.net的方案是无解的。一个的非纯.net解决方案是ISAPI Filters+HttpHandler,限于本人水平有限,写不来那个ISAPI Filters。

前话表述完了,开始说说自己遇到的几个问题

1、url直接下载>>HTTPS时下载的速度>>HTTP时下载的速度(Why)

看到别人为了解决耗内存,用了句Response.Flush()

用了下,帮助不大

 

(1)用HTTPS访问该页面时

客户端下载速度

 

性能


(2)用HTTP访问该页面时

客户端下载速度

 

性能

 


同样的代码在Https、Http访问时有不同的表现,这让我很诧异。1、下载速度差的离谱,即使是较快的https,也只有带宽的1/10;http更别提了,下了没几M,自己就停止传输了。CPU和速度还是有很大的关系,https时的持续100%,http时的5%不到。唯一的亮点是可用内存好多啊。

这里,我的问题就是为什么会url直接下载>>HTTPS时下载的速度>>HTTP时下载的速度

2、400M不到的文件,下载过程中inetinfo的虚拟内存居然达到了近2G,那时客户端才下了3M不到(Why)

换了个想法(从结果看很不成熟的想法)。开了个线程去取数据到内存里放着,主线程把这些数据传給客户端。

代码如下

队列成员

循环队列


下载类


页面下载代码

 

这里依旧有url直接下载>>HTTPS时下载的速度>>HTTP时下载的速度的问题

(1)先看HTTPS

下载速度


任务管理器


(2)再看HTTP的



文件也才400M不到,为什么inetinfo的虚拟内存就占用了近2G?


参考:

Optimizing the Downloading of Large Files in ASP.NET