Webb.WAVE.Controls.Upload2已经完成,正在测试中。
主要改进:
1、上传文件数据处理的算法改进。在LAN上,最大速度可以达10MB/S,比起上个版本的最大速度3.5MB有很大的提高。
2、内存的最小占用。在极坏的情况下,内存占用可能多一些(主要是在算法的处理上,当上传文件的所有数据的每个字节都为13时,内存可能会出现大量碎片)。 极好情况下,只占用缓存设定的内存。
3、添加客户端脚本,上传进度条完全在客户端处理。其中上传速度,剩余时间等,都是用JS完成的,因此大大减少了服务器负担。
4、空文件不再处理,即用用户上传文件中,有空文件或者不存在的文件时,将被忽略,不再处理它。
5、可自行配置一些相关参数,如上传最大字节数,缓存字节数,临时目录等。
当然,还有很多改进的地方,我自己也不记得了。估计这个版本会在下个星期发布测试版。
Wednesday, June 07, 2006
做了一个大的改动,使上传速度又有了一次飞越。这是上传稳定后的速度,最快的瞬时速度有15MB/S.
改动说明:主要是上传的GUID处理上,原来是通过在页面里注册一个隐藏的表单变量,然后在上传的Module中处理这个GUID。
原代码:
/// Get value from preloaded entity body. Identified by name. You can get any value in the form.
/// But you can not get the file data by this function.
/// But this function too waste time.
/// </summary>
/// <param name="preloadedEntityBody"></param>
/// <param name="name"></param>
/// <returns></returns>
private string AnalysePreLoadedContent(string i_perLoadedData, string m_fiedName)
{
// string preloadedContent = HttpContext.Current.Request.ContentEncoding.GetString(m_preLoadedData);
if (i_perLoadedData.Length > 0)
{
string m_temp = "name=\""+m_fiedName+"\"\r\n\r\n";
if(i_perLoadedData.IndexOf(m_temp)<=0) return string.Empty;
int startIndex = i_perLoadedData.IndexOf(m_temp)+m_temp.Length;
int endIndex = i_perLoadedData.IndexOf("\r\n--",startIndex);
return i_perLoadedData.Substring(startIndex,endIndex-startIndex);
}
else
{
return string.Empty;
}
}
字符串的查找工作相对而言是比较慢的,为了解决这一问题,进度条的GUID没有存在页面的隐藏表单变量里,而是用在了临时的Cookie里,也就是浏览器Cookie。原来想在Session里使用,但HTTPModule里无法取得Session实例,虽然实现了IReadonlySession以及IRequrieSessonStatus也无法使用Session,所以就放弃了。
上传进度条消失的问题,在上个版本中我们进行测试的时候遇到过。但我没能查到是什么原因。
这个版本里有没有就还得测试了。
Thursday, June 08, 2006
压力测试结果。然而更大的文件上传,在压力测试下失败!而且失败原因不明。
测试环境:
服务器:Win2003+IIS6.0 CPU:P4 3G RAM:512MB
客户端:WinXP+SP2 IE6.0
网络:LAN
测试工具:LoadRunner 7.5
Load test result: for Webb.Upload only
Thursday, June 08, 2006
Scenario 1: 10-user array with 3.26 MB and no progress bar.
Transaction Summary |
Transaction Name |
Minimum |
Average |
Maximum |
Std |
90 Percent |
Pass |
Fail |
Stop |
7.438 |
8.561 |
9.453 |
0.736 |
9.417 |
10 |
0 |
0 | |
0 |
0 |
0 |
0 |
0 |
10 |
0 |
0 | |
0 |
0 |
0 |
0 |
0 |
10 |
0 |
0 |
HTTP Responses Summary |
HTTP Responses |
Total |
Per second |
90 |
7.5 | |
120 |
10 |
Scenario 2: 100-user array 3.26 MB and no progress bar.
Transaction Summary |
Transaction Name |
Minimum |
Average |
Maximum |
Std |
90 Percent |
Pass |
Fail |
Stop |
7.234 |
32.879 |
66.375 |
19.201 |
63.489 |
100 |
0 |
0 | |
0 |
0 |
0 |
0 |
0 |
100 |
0 |
0 | |
0 |
0.001 |
0.016 |
0.003 |
0 |
100 |
0 |
0 |
HTTP Responses Summary |
|
Total |
Per second |
900 |
12.857 | |
1,200 |
17.143 |
虽然测试结果比上次的要好得多,100人同时上传3.26MB的文件可以在1分钟内完成,平均算下来,也有5MB/S,而10个用户同时上传,平均速度反而还少一些。当然,可能与服务器的一些配置相关。例如:应用程序没有分成独立的应用程序池,服务器同时运行着SQLServer等。
不管怎样,结果可以参考一下。