我们在 Centos5.3 上使用squid 3.0 ,目前有 20 个用户(Internet Explorer)使用这个代理。问题是通过代理的访问速度较慢。即使是像 google.com(.au) 这样的简单网页,也比没有代理的直接连接要长 5 秒。看起来有大约 2-5 秒的延迟。禁用 google.com(.au) 的缓存没有帮助。明确定义 dns_nameservers 没有区别。
服务器参数:双核 AMD Opteron(tm) 处理器 2220、6GB 内存、60gb SCSI 硬盘
cache_mem 256 MB
cache_dir ufs /usr/local/squid/var/cache 30000 16 256
maximum_object_size_in_memory 256 KB
minimum_object_size 0 KB(0 - 200 KB - 没有真正的区别,延迟仍然存在)
maximum_object_size 32 MB
您将如何根据服务器规范更改 squid.conf 中的这些规范。什么会导致延迟?对于像 yahoo.com.au 这样更大的网页,还有一种方法可以从缓存中接收页面的一部分,然后再接收其余部分(最后是图片)。目前 15 秒内没有任何内容,然后出现整个网页。
我的第一个预感是使用 tcpdump 嗅探流量并将其加载到wireshark 以查看延迟发生在哪里。
(如果您通过 ssh 执行此操作,请在末尾添加“not port ssh”。)
一旦你把它加载到wireshark中,你应该能够看到延迟出现在哪里。我建议在安静的时间这样做,这样就不会有太多的交通遮挡您的视线。如果您可以成为当时唯一访问代理的人,那就更好了。
可能的延误是:
对于某些网页,在几乎整个页面(图像和所有内容)下载之前,无法绘制页面。为了加快这样的页面,你可以做一些事情:
在过去的日子里,我曾经用 Internet Explorer 浏览 Macintosh(当时是 68k)。我清楚地记得看到“报纸”图标告诉你等待,因为 IE 正在计算如何显示页面(没有获取数据:计算......)
另一件需要注意的事情:某些页面会明确要求它们不被缓存:缓存管理员决定是否允许或拒绝这些请求。通常,这些页面是那些经常更改或 Web 管理员不希望存储在其他地方的页面。因此,在这样的页面中,您将涉及额外的开销,因为 Web 缓存必须代表您处理该页面,即使缓存中根本没有页面。
我同意嗅探流量是确定事情延迟的好方法。网络流的哪一部分实际上导致了延迟?
Wireshark(和 tcpdump)有一大组过滤器,可用于清理流量:您真正必须等到安静时间的唯一原因是为了避免拥有大量 TCP 转储文件。但是,您可以获得一组合理的数据,只需将自己限制为直接到代理的网络流量:
(端口 3128 是标准的 squid 端口:使用适合您的任何端口。)
使用 Wireshark,您可以立即根据单个 TCP 流量流进行过滤:因此您也不必担心不同流的混合。
还要查看 /var/log/squid 中的日志并检查请求发生了什么:它是否来自缓存?它来自远程站点吗?尝试重复请求 - 运行一次后页面会更快出现吗?
当我遇到完全相同的问题时,我发现这是一个 DNS 问题。
一旦我将 squid.conf 中的 DNS 服务器更改为我们的 ISP,延迟就消失了。