Squid Web Cache Wiki

Squid Web Cache 文档

🔗 操作系统特定特殊情况

:information_source: 此内容大部分已过时,可能不再适用于现代系统。我们不一定能访问这些系统进行验证,因此目前仍保留这些信息。

🔗 Solaris

🔗 TCP 不兼容?

J.D. Bronson (jb at ktxg dot com) 报告说,他的 Solaris 系统无法与某些源服务器通信,例如 moneycentral.msn.comwww.mbnanetaccess.com。J.D. 通过设置以下参数解决了他的问题:

tcp_xmit_hiwat 49152
tcp_xmit_lowat 4096
tcp_recv_hiwat 49152

:information_source: 在 Solaris 10 及更高版本中,此参数为系统默认值(由 Yuri Voinov 提供)。

🔗 select()

select(3c) 最多只能处理 1024 个文件描述符。configure 脚本应为 Solaris 默认启用 poll()poll() 允许您使用更多文件描述符,可能达到 8192 个或更多。

对于较旧的 Squid 版本,您可以通过更改 include/autoconf.h 中的 HAVE_POLL 来手动启用 poll(),或者通过将 -DUSE_POLL=1 添加到 src/Makefile 的 DEFINES 中来启用。

🔗 malloc

libmalloc.a 存在内存泄漏。Squid 的 configure 在 Solaris 上不使用 -lmalloc。

🔗 DNS 查询和“nscd”

作者:David J N Begley

DNS 查询可能很慢,原因是一种称为 **ncsd** 的神秘东西。您应该编辑 /etc/nscd.conf 文件,并将其设置为:

enable-cache            hosts           no

据称 nscd 会串行化 DNS 查询,从而在应用程序(如 Squid)频繁访问解析器时减慢所有速度。如果您运行一个执行大量 DNS 解析器查询的日志处理器,您可能会遇到类似的情况:解析器会变得非常慢。 . . .

根据 **Andres Kroonmaa** 的说法,从 Solaris 2.6 版本开始的用户 **不应** 完全禁用 nscd 守护进程。nscd 应该运行并缓存 passwd 和 group 文件,但建议禁用 hosts 缓存,因为它可能会干扰 DNS 查询。

几个库调用依赖于可用的空闲文件描述符 FD < 256。在没有 nscd 的系统上运行,如果前 256 个文件都已在使用中,这些调用可能会失败。

自 solaris 2.6 起,Sun 改变了某些系统调用的工作方式,并使用 nscd 守护进程作为它们的实现者。为了与 nscd 通信,Solaris 使用了未文档化的调用。基本上,nscd 用于减少使用 passwd 和 group 文件的用户空间系统库的内存使用。在 2.6 之前,Solaris 在第一次使用时会在库内存中缓存整个 passwd 文件,但这被认为在大型多用户系统中占用过多的 RAM,因此 Sun 决定将这些调用的实现从库移到一个单独的专用守护进程中。

🔗 DNS 查询和 /etc/nsswitch.conf

作者:Jason Armistead

/etc/nsswitch.conf 文件确定了查找(以及其他内容)的搜索顺序。您可能只将其设置为允许 NIS 和 HOSTS 文件工作。您绝对希望 “hosts:” 行包含 dns 一词,例如:

hosts:      nis dns [NOTFOUND=return] files

🔗 DNS 查询和 NIS

作者:Chris Tilbury

我们的站点缓存运行在一台 Solaris 2.6 机器上。我们使用 NIS 在周围分发身份验证和本地主机信息,并且与我们的多用户系统一样,我们在上面运行了一个从属 NIS 服务器来提高 NIS 查询的响应速度。

我们注意到非常高的名称-IP 查询时间(平均约 2 秒)和 IP->名称查询时间(平均约 8 秒),尽管在缓存未受到高负载时,有效站点的响应时间似乎没有太大问题。然后,性能急剧下降。

经过一段时间和一些侦探工作,我们找到了问题。在 Solaris 2.6 上,如果您运行本地 NIS 服务器(ypserv)并且您的 /etc/nsswitch.conf hosts 条目中有 NIS,请检查它启动时使用的标志。2.6 ypstart 脚本在启动 ypserv 时会检查是否存在 resolv.conf 文件。如果存在,它会使用 -d 选项启动它。

这与在 hosts 表中放置 YP_INTERDOMAIN 键具有相同效果——即,失败的 NIS 主机查找会被 NIS 服务器尝试通过 DNS 解析。

这是一个 **糟糕的事情 (tm)**!如果 NIS 本身尝试使用 DNS 解析名称,那么请求会通过 NIS 服务器串行化,从而造成瓶颈(这与 nscd 的基本问题相同)。因此,一个失败或缓慢的查找,如果 NIS 在服务交换文件中位于 DNS 之前(这是最常见的设置),可能会阻止所有其他正在进行的查找。

如果您在此类设置下运行,那么您将需要确保:

我们在这里进行了这些更改,平均查询时间下降了高达一个数量级(名称-IP 查询约 150 毫秒,IP-名称查询约 1.5 秒,后者仍然很高,我怀疑是因为这些查询失败和超时更多,因为它们不常进行,并且条目通常不存在)。

🔗 调整

请参阅 Jens-S. Voeckler 的《Tuning your TCP/IP stack and more》。

🔗 磁盘写入错误:(28) 设备上没有剩余空间

即使您的磁盘未满且没有用尽 inode,您也可能会收到此错误。检查您的 syslog 日志(通常是 /var/adm/messages)中的类似以下消息:

NOTICE: realloccg /proxy/cache: file system full
NOTICE: alloc: /proxy/cache: file system full

简而言之,Solaris 使用的 UFS 文件系统无法很好地处理 squid 对其造成的负载。文件系统最终会变得高度碎片化,直到出现不足以创建文件的可用块,只剩下碎片。此时,您将收到此错误,并且 squid 将重新评估其可用的空间量。您可以通过“fsck -n raw_device”(无需卸载,此命令以只读模式检查)来查看文件系统的碎片化程度。它可能会很高(>15%)。

Sun 提出了两个解决方案。一个需要付费,另一个免费但可能会导致性能下降(尽管 Sun 声称由于 squid 磁盘访问的高度随机性,它不应如此)。

第一个是购买 VxFS,即 Veritas Filesystem。这是一个 extent(区段)式文件系统,支持对已挂载文件系统进行在线碎片整理。但这需要付费(VxFS 并不便宜!)。

第二个是更改 UFS 文件系统的某些参数。卸载您的缓存文件系统,并使用 tunefs 将优化更改为“space”(空间),并将“minfree”(最小空闲空间百分比)值降低到 3-5%(在 Solaris 2.6 及更高版本中,非常大的文件系统几乎肯定已经有 2% 的 minfree,您不应增加此值)。通过这样做,您应该可以将碎片化程度降低到大约 3%,并相应地增加可用空间量。

感谢 Chris Tilbury

🔗 Solaris X86 和 IPFilter

作者:Jeff Madison

关于 Squid 在 Solaris x86 上运行的重要更新。我花了几个月的时间来解决在 Solaris x86 上运行 Squid 时出现的内存泄漏问题,无论使用何种 malloc。我发现了两个任何人在这平台上运行 Squid 都可能感兴趣的发现。

第一点:Squid 并没有内存泄漏,尽管系统运行一段时间后(具体时间取决于系统负载),Top 显示可用内存很少。正如我与之交谈的 Sun 工程师所声称的那样,Top 的这个统计数据是不正确的。奇怪的是,随着时间的推移,性能确实开始显著下降,并且唯一纠正这种情况的方法是重启系统。这引出了我的第二个发现。

第二点:IPFilter 在 Solaris x86 上存在某种类型的资源问题,可能是内存或其他。我没有花时间去调查问题是什么,因为我们不再使用 IPFilter。我们已经切换到 Alteon ACE 180 千兆交换机,它可以为您完成 trans-proxy。在将 trans-proxy 和重定向过程转移到 Alteon 交换机后,Squid 在巨大负载下连续运行了 3 天,没有任何问题。我们目前有 2 台机器,每台机器有 40 GB 的缓存对象。这 40 GB 是在这 3 天内积累的,从这可以看出这些机器的负载类型。在此更改之前,我们从未能够运行超过 4 小时。

由于问题似乎出在 IPFilter 上,我猜测只有在尝试将 Squid 用作使用 IPFilter 的拦截代理时才会遇到此问题。这很有意义。如果有人有信息表明我的发现不正确,我愿意进一步调查。

🔗 更改目录查找缓存大小

作者:Mike Batchelor

在 Solaris 上,目录名称查找缓存大小的内核变量是 ncsize。在 /etc/system 中,您可能需要尝试设置

set ncsize = 8192

甚至更高。在 Solaris 2.5.1 及更高版本中,内核变量 ufs_inode(即 inode 缓存本身的大小)会随 ncsize 缩放。早期版本的 Solaris 需要单独调整两者,但现在不建议在 2.5.1 及更高版本上直接调整 ufs_inode

您可以将 ncsize 设置得很高,但达到某个点后(取决于应用程序),过大的 ncsize 会增加查找的延迟。

默认值为:

Solaris 2.5.1 : (max_nprocs + 16 + maxusers) + 64
Solaris 2.6/Solaris 7 : 4 * (max_nprocs + maxusers) + 320

🔗 priority_paging 算法

作者:Mike Batchelor

Solaris 2.5.1、2.6 或 Solaris 7 中的另一个新可调参数(实际上是一个切换开关)是 priority_paging 算法。这实际上是对 Solaris 虚拟内存系统的一次彻底重写。如果您启用它(在 /etc/system 中设置 priority_paging = 1),它将最后页出应用程序数据,先页出文件系统页面。您可能知道,Solaris 缓冲区缓存会增长以填充可用页面,并且在旧的 VM 系统下,应用程序可能会被页出以腾出空间给缓冲区缓存,这可能导致交换空间颠簸和应用程序性能下降。新的 priority_paging 有助于将应用程序和共享库页面保留在内存中,防止缓冲区缓存将它们页出,直到内存变得非常稀缺为止。Solaris 2.5.1 需要补丁 103640-25 或更高版本,Solaris 2.6 需要 105181-10 或更高版本才能使用 priority_paging。Solaris 7 不需要补丁,但所有版本默认都关闭了它。

🔗 断言失败:StatHist.c:91: `statHistBin(H, max) == H->capacity - 1’

作者:Marc

在 Solaris 上,当编译时没有 “math.h” 文件时,会发生此崩溃。我猜在任何没有正确包含的系统上都可能发生,但我尚未验证。

configure 脚本只报告:“math.h: no” 并继续。数学函数声明错误,这会导致此崩溃。

对于 32 位 Solaris,“math.h” 在 SUNWlibm 包中。

🔗 FreeBSD

🔗 T/TCP 错误

我们发现 FreeBSD-2.2.2-RELEASE 存在 T/TCP 的一些错误。如果您启用了“TCP Extensions”,FreeBSD 将尝试使用 T/TCP。要禁用 T/TCP,请使用 sysinstall 禁用 TCP Extensions,或编辑 /etc/rc.conf 并设置:

tcp_extensions="NO"             # Allow RFC1323 & RFC1544 extensions (or NO).

或将此添加到您的 /etc/rc 文件中:

sysctl -w net.inet.tcp.rfc1644=0

🔗 处理 NIS

/var/yp/Makefile 包含以下部分:

# The following line encodes the YP_INTERDOMAIN key into the hosts.byname
# and hosts.byaddr maps so that ypserv(8) will do DNS lookups to resolve
# hosts not in the current domain. Commenting this line out will disable
# the DNS lookups.
B=-b

您需要注释掉 B=-b 行,这样 ypserv 就不会进行 DNS 查询。

🔗 jail 环境中的内部 DNS 问题

一些用户报告在 jail 环境中运行 Squid 时出现问题。特别是,Squid 会记录类似以下消息:

2001/10/12 02:08:49| comm_udp_sendto: FD 4, 192.168.1.3, port 53: (22) Invalid argument
2001/10/12 02:08:49| idnsSendQuery: FD 4: sendto: (22) Invalid argument

通过在 squid.conf 中将 jail 的网络接口地址添加到 'udp_outgoing_addr' 配置选项,可以消除此问题。

🔗 由于 TCP 黑洞导致的“零字节回复”错误

作者:David Landgren

在 FreeBSD 上,确保 TCP 黑洞未激活。您可以使用以下命令验证当前设置:

# /sbin/sysctl net.inet.tcp.blackhole

它应该返回以下输出:

net.inet.tcp.blackhole: 0

如果设置为正值(通常是 2),请使用以下命令将其禁用为零:

# /sbin/sysctl net.inet.tcp.blackhole=0

为确保设置在重启后仍然有效,请将以下行添加到文件 /etc/sysctl.conf 中:

net.inet.tcp.blackhole=0

🔗 Linux

🔗 通过 Squid 无法连接到某些站点

使用 Squid 时,某些站点可能会出现类似“(111) Connection refused”或“(110) Connection timed out”的错误,尽管这些站点在不通过 Squid 的情况下工作正常。

Linux 2.6 实现 了 显式拥塞通知 (ECN) 支持,这可能导致与具有损坏防火墙或损坏 TCP/IP 实现的某些站点建立 TCP 连接时失败。

截至 2006 年 6 月,启用 ECN 时失败的站点数量非常少,您可能会发现启用此功能比全局禁用它更有益。

为了解决这些损坏的站点问题,您可以使用以下命令禁用 ECN:

echo 0 > /proc/sys/net/ipv4/tcp_ecn

HenrikNordstrom 解释道:

ECN 是 TCP/IP 的一个标准扩展,可以使 TCP/IP 在可用带宽已用尽的过载条件下(即任何 WAN 链路的默认条件)表现更好。由 IETF 网络工作组定义的 Internet RFC3168 负责 TCP/IP 和其他核心 Internet 技术(如路由)的演进。它通过使用 TCP 头部中两个之前未使用的位(共 6 位),再加上重新定义 IP 头部中永不标准化的 TOS 字段的两位(将 TOS 分为 6 位 Diffserv 和 2 位 ECN 字段)来实现,允许路由器清晰地向参与计算机指示过载条件,而不是丢弃数据包并希望计算机意识到流量过多。主要问题是这些之前未使用的 TCP 头部位的使用。TCP/IP 标准一直规定这些位保留供将来使用,但许多旧防火墙假设这些位永远不会被使用,因此会丢弃所有使用此新功能(认为这是对 1981 年原始标准之外的 TCP/IP 的无效使用)的流量。ECN 的最终形式定义于 2001 年,但更早的规范在几年前就已经发布。

🔗 某些站点加载速度极慢或根本不加载

您偶尔可能会遇到 Linux 上的 TCP 窗口缩放问题。起初您可能能够建立 TCP 连接到站点,但之后无法在您的连接上传输任何数据,或者数据传输速度极慢。这是由于 Internet 上一些损坏的防火墙(不是 Linux 的错误)在建立 TCP 连接时篡改了窗口缩放选项。有关更多详细信息和解决方法,请访问 lwn.net

窗口缩放是一项标准的 TCP 功能,它可以使 TCP 在高速 WAN 链路上表现良好。没有窗口缩放,往返延迟会严重限制单个 TCP 连接可用的带宽。

之所以在 Linux 上会遇到此问题而不是大多数其他操作系统,是因为所有桌面操作系统都宣称一个相对较小的窗口缩放因子(如果宣称的话),因此防火墙错误在这些操作系统上不会被注意到。Windows 操作系统也以拥有大量解决方法而闻名,可以自动且静默地处理这些问题,而 Linux 社区的政策是不提供此类解决方法,最有可能的目的是试图给那些有问题的网络设备施加压力,迫使其修复。

要测试这是否是您问题的根源,请尝试以下操作:

echo 0 >/proc/sys/net/ipv4/tcp_window_scaling

但请注意,这会明显降低 TCP 性能。

其他可能的替代方案是在 squid.conf 中设置 tcp_recv_bufsize,或使用 /sbin/ip route … window=xxx 选项。

回到 FAQ 索引

导航: 网站搜索网站页面分类🔼 向上