×

Loading...
Ad by
  • 最优利率和cashback可以申请特批,好信用好收入offer更好。请点链接扫码加微信咨询,Scotiabank -- Nick Zhang 6478812600。
Ad by
  • 最优利率和cashback可以申请特批,好信用好收入offer更好。请点链接扫码加微信咨询,Scotiabank -- Nick Zhang 6478812600。

我做了个试验,详情见内

4个30M的文件+一个100K的文件。客户端和服务器在同一机器上,同一form提交,没用Ajax。
单线程处理用时36秒,全部完成后forward到结果页面。
为每一个文件上传开新线程应该为5个文件5个线程,+主线程,共6个,用时49秒。我一直刷新文件管理器,发现文件大小同时在变,最后一个小文件在20秒时就结束了。程序在约20秒的时候forward到结果页面,这是后台线程还正忙着呢。

下面是我的分析:
结果很出乎意料,开了多线程,速度反而下降了,并从现象来看,确实是多线程工作,同事上传文件。究其原因,我觉得上传的瓶颈是在IO上开了多线程并没有提高IO,所以不会提高任何速度。
那为什么反而墁了?我认为可能多线程调度消耗了资源,IO的物理通道就一个,多线程其实是共享一个,那么为了公平起见,调度器就不断调度各个上传线程轮流上传,不断的开关连接,消耗大量资源。导致速度下降。
页面提前转过倒是一件好事,可以后台传文件,前台用户干别的事。

改进方案:
所有的文件只开一个线程,按他们的顺序传。
主线程在invoke上传线程后就forward到下一个页面。。。

欢迎提出你的宝贵意见,包括砖头:)
Report

Replies, comments and Discussions:

  • 工作学习 / 专业技术讨论 / 用浏览器上传文件,假如5个10M文件,就像yahoo mail贴附件那样,选定后一起上传,服务器端struts,我在服务器端开5个thread来收,和一个thread来收,速度有提高吗?网络环境假定客户端3M DSL,服务器在Hoting center, 100M
    • 我觉得瓶颈不在服务器,而在网络带宽,带宽已经跑满,再增加线程恐怕没用。在本机很难试,局域网也不好试。
    • 很好奇, 用浏览器上传是单线程的, 到服务器端能分多线程接受吗?毕竟还是走TCP/IP协议, struts能实现吗?
      • 可以,只要同时send几个asynchronous requests就行了。
        • 你那是用AJAX来做了, 那服务器端跟开多线程一点关系都没有, 楼主的意思好象是一个页面提交.
          • 好主意,用Ajax试试
            • so far i still keep looking a solution for ajax uploading file in INTERNET enirv. really want to your outcome.
          • 对应每个request他的servlet container都会开个thread to serve it unless the resouce exhausted
            • 我的情况是同一用户,同一session,同一页面,同一请求,同一form,多个文件,服务器不会开多个线程处理,应该是自己的程序处理。没准HTTP协议根本都不支持呢,好了,不在这里耍嘴皮了,今晚试试,给大家汇报。
    • 我做了个试验,详情见内
      4个30M的文件+一个100K的文件。客户端和服务器在同一机器上,同一form提交,没用Ajax。
      单线程处理用时36秒,全部完成后forward到结果页面。
      为每一个文件上传开新线程应该为5个文件5个线程,+主线程,共6个,用时49秒。我一直刷新文件管理器,发现文件大小同时在变,最后一个小文件在20秒时就结束了。程序在约20秒的时候forward到结果页面,这是后台线程还正忙着呢。

      下面是我的分析:
      结果很出乎意料,开了多线程,速度反而下降了,并从现象来看,确实是多线程工作,同事上传文件。究其原因,我觉得上传的瓶颈是在IO上开了多线程并没有提高IO,所以不会提高任何速度。
      那为什么反而墁了?我认为可能多线程调度消耗了资源,IO的物理通道就一个,多线程其实是共享一个,那么为了公平起见,调度器就不断调度各个上传线程轮流上传,不断的开关连接,消耗大量资源。导致速度下降。
      页面提前转过倒是一件好事,可以后台传文件,前台用户干别的事。

      改进方案:
      所有的文件只开一个线程,按他们的顺序传。
      主线程在invoke上传线程后就forward到下一个页面。。。

      欢迎提出你的宝贵意见,包括砖头:)
      • Multi-threading applications usually have better performance. "客户端和服务器在同一机器上" is not correct setup for the test. The OS kernel is using different ways to send files to localhost or to remote server.
        You could use truss or similar utility to trace the system calls to find the bottleneck.
      • 新方案中没写什么时候在哪告诉用户成功失败
      • 这个测试方案太糟糕了.
        Because your client and server are in one computer, so there is NO network delay at all. So you can't figure out the pro/con of your implementation.


        Unless, your program will only be deploy in LAN with 100M network speed. Otherwise, this test is totally nonsense. You can only test the cpu speed in this test.
        • 多谢指教,由于是私活,只能在家弄,家里只一台电脑。这不,今天又弄了一台,正在装系统,尽快再试一下。
          • if upload lots of file, why not ftp. For fun it is OK, but no value
          • 你在家里再弄一台电脑,两台电脑100M连接速度,还是不能模仿真正的环境。
            本来你要多线程同步上传几个文件的目的,就是为了在网络速度慢的时候能加快速度;你现在这个测试环境还是不对。

            你可以把服务器搭好在你家之后,让朋友在他家访问你的服务器,然后上传,这样测试才正常一些。

            其实,上传5个40M的文件,对于一般用户太辛苦了。如果你的软件是面向一般用户,而不是局域网用户,那么这个软件没有太大意义。因为一般高速上网,下载速度是300kBps,而上载速度只有十分之一,即30kBps。满负荷运转,1M需要30秒,40M需要20分钟。5个,就是100分钟。
            • 你说的很对,其事文件没那么大,我为了测试,怕一闪就没了,所以本机用30M的测试。 谢谢
              事实上我的客户可能一次传10-30张数码照片,每个,应该在100K-1M之间。这个测试会耽误一些时间,所以不愿麻烦朋友。我打算用我的laptop拨号上网访问的的台式机,记得bell宽带送个拨号的帐号。
        • 我觉得这个方案很好, 不应该模拟网络延迟, 那反而不准确.
          楼主是希望比较单线程和多线程哪个更快, 所以前提应该是网络条件相同, 在单机模拟, 反而能最大限度的达到网络条件相同, 如果在网络上模拟, 特别是让朋友从外部来上传, 那两次上传时的网络情况有太多的因素导致不相同了. 所以我觉得楼主的试验结果是有效的. 没有必要再用真实网络环境来测试, 那反而是没有价值的.
          而且我觉得楼主对结果的分析也是正确的, 但是这引出另一个问题, 就是稳定性. 在多线程的例子里, 20秒后页面就重定向了, 那么你怎么保证另外还在运行的线程如果出错了, 怎么办? 客户端不可能再得到你的信息了, 这说明后台开多线程是不可行的.
          其实我觉得从原理上分析, 如果客户端要上传10M的文件, 带宽是固定的, 所以花费的时间也就固定了, 跟马路上车的通行是一样的, 跟后台没有关系. 只不过象你的试验, 可以提前让客户转到别的页面, 看似速度快了, 但牺牲的是稳定性, 相比稳定性和速度, 稳定性无疑是第一位的.
          我觉得楼主应该用AJAX来做, 比如客户要上传5个文件, 那选择完一个文件后就马上上传, GAMIL就是这么做的, 这样等于提前开始上传, 而不是等客户选择完5个文件后才开始上传, 所以变相的相当于提高速度, 当然你还可以在服务器端用多线程, 以提高项目的含金量, :-).
          欢迎指正.