五千年(敝帚自珍)

主题:问一个squid代理问题 -- ktoya

共:💬12
分页树展主题 · 全看首页 上页
/ 1
下页 末页
  • 家园 问一个squid代理问题

    我们学校是用squid做代理的, 总带宽是2Mbps, 而限制了我的网速是5Kb/s, 可是, 在下载某个东西的时候, 比如 http://abc.com/a.zip 这个文件, 如果直接下载或者用flashget下, 显示只有最开始1秒下载得很快, 然后从第二秒开始就恢复到5kb/s了, 但是:

    如果按右键选另存为, 先存到一个地方了, 在下的过程中再按右键重新存一次,也就是说两个下载进程同时重复下载这个文件,然后把第一个进程关了, 这时第二个进程的下载速度就没有速度限制了.

    请问,这种问题会出现在什么地方, squid的bug? 我的推断是这样: 由于服务器是没有限制速度的, 在下载环节中某个地方squid出现了问题, 让服务器认为是自己在下载, 而我则是从服务器端的cache中进行局域网的传输,这是没有速度限制的. 这可能吗? 如果可能, 哪个步骤让服务器出现这种错误

    • 家园 我来分析一下看看

      我没有用过这个代理,但是你说的这个现象我可以解释一下。

      这两个问题并不是代理的问题,应该是Windows显示的错误。

      第一:Windows在下载一个文件的时候,并不是从一开始下载就显示速度的,它是在下载了文件的一些信息及部分文件内容以后才开始正式下载的,有了这些信息,Windows才能确认下载任务。假设这些信息有20K,这20K下载到硬盘上以后,windows确认开始正式下载,由于已经有20K信息在硬盘上了,所以第一秒肯定很快。(就是硬盘拷贝速度)

      第二:和前一个类似。同一个任务已经下载了一遍,那么硬盘上(或者服务器的缓冲区上),已经有了这个文件,那么你再下载的时候速度肯定很快了,因为下载速度就是硬盘拷贝速度,或者你的机器和服务器连接的速度。

      • 家园 第一个我理解了,可是第二个我想不是这个原因

        首先, 速度的提高必要条件有两个:

        1: 有两个相同的下载进程

        2: 把前一个下载进程取消

        不然的话速度还是5kb/sec.

        第二, 服务器缓冲区里应该没有这么多东西,因为无所谓从哪个网站上下载东西, 都可以用这种方法提高速度.

        而且, 第一条和你说的似乎也有点区别, 因为它不止下载了文件内容信息,而且真正下载了这么多, 比如说下载一个1Mb的文件, 第一秒下载了100kb, 而从第二秒开始就是5kb/s了

        这应该和哪个软件没关系, 我用过ccproxy做二级代理,然后在第三台机器上用这种方法居然也会出现这种情况. 所以我想了解, 代理服务器实现限制client下载速度的原理是什么

        • 家园 一个可能的原因,你Kill了你的机器到代理的那个连接

          但是哪个代理并没有马上kill掉相应的到服务器的连接,仍然在源源不断地从服务器读取数据并存储在公共cache里面,

          而你的机器可以从代理的cache读数据,因此可能感觉速度会快些。

          你在kill掉第一个Connection以后多观察第二个Connection一段时间,在刚kill掉第一个connection 以后,显示的速度可能很快,但后来呢,是不是速度又会回去?

          我也就是猜,具体地当然要去看手册,或者code.

          • 家园 贴个图看看

            1: 先弄两个下载进程:

            点看全图

            外链图片需谨慎,可能会被源头改

            2: 取消第一个进程, 第二个进程就变成这样了:

            点看全图

            外链图片需谨慎,可能会被源头改

            (第一张图片可能有点大. 120kb)

            速度随时间会减些,但是无论多长时间至少速度不会跌到5kb/s以下. 实际上开始时的速度就像你说的从服务器cache中取下载好的前部分, 然后等我的机器和服务器共同拥有的一样时, 这时服务器下载了多少就实时给我传多少了. 唯一不同的地方是没有速度限制.

          • 家园 Tha's how the cache server is

            designed to work. If it received the request for the target not cached, then it will fatch that file automatically even the client has canceled the request. Then the second or later requests will be served with that cached file instead to save bandwith. For small files, the late request will see very fast transfer. Only with large files you would be able to see the speed will go down as the cache server is doing the transferring.

            • 家园 以前读Proxy 的Performance分析时

              看到过这个问题,Proxy 可以减少Client的响应时间,但有的时候可能会造成带宽的浪费,比如Client stop tranmiting,而后来又再没有其他用户读取这个文件的时候,这样Proxy从Server取来的东西很可能就浪费啦。

              以为新的版本都改过来了呢! 不过也许改过来的是没有

              existing connection accessing the same file 的情况,象这种有第二个connection accessing the same file 的时候,倒是不会造成带宽的浪费,但却使得5k/s 的限制失效。 可能是设计中一个小小的漏洞,其实只要查一些下两个Connection 是不是来自同一个IP地址就可以了。

              • 家园 自我总结发言

                也就是说, 初期的proxy设计虽然减少了client响应时间, 可是也造成了些浪费: client取消某个进程时server不会也取消(这里面有个迷惑, 我觉得当初人们应该考虑过这点,因为如果有人下载个100甚至200Mb左右的文件突然不取消了, 那浪费的就不止一点点了).

                现在, 这个bug已经修正了, 可仍然没有修正这点: 两个connection同时下载同一个文件时取消第一个进程, server判断不出来, 可是,我还是不明白为什么这样的话第二个连接的速度限制也被取消了.

                • 家园 因为第二个连接的Client直接从代理的Cache里面读数据

                  连接如图所示:

                  连接2的Client--(局域网连接)---代理 ---(连接1)--- 服务器

                  |______(连接2)_______|

                  CLient直接从代理的Cache里面读数据

                  而连接1和连接2都以5k的速度往Cache里面写数据,

                  自然Client的速度就能超过5k.

            • 家园 nod, 差不多就是这样, 我再补充完整点

              要是只有一个进程在下载了一半时cancel了再重新下载, 服务器cache里已经没有这个下了一半的文件了, 速度又会重新记. 只有两个进程时才行.

              所以.. 这究竟是服务器cache设计时的问题, 还是代理服务器的bug

              再扩展些, 如果是服务器cache的设计问题, 是不是可以利用这个bug设计出一个下载软件, 甚至browser, 以造福像我这样在限制速度5kb/s的网速下受苦受难的人?

              (现在国内应该也不少宽带网是限速的吧?)

    • 家园 太专业了

      这要到它的USER MAIL GROUP里去问才有答案.

      • 家园 去www.squid-cache.org 的mail list上问过

        没给过我回音

        而且似乎所有只安装在服务端的代理服务器软件都会出现这个问题. 想了解其原因

分页树展主题 · 全看首页 上页
/ 1
下页 末页


有趣有益,互惠互利;开阔视野,博采众长。
虚拟的网络,真实的人。天南地北客,相逢皆朋友

Copyright © cchere 西西河