我有一个生产 squid 服务器,它在提供内容并报告它没有文件描述符时遇到了一些问题。我成功地将它从 1024(默认)增加到 4096,它似乎解决了我在日志中的错误。对于某些未缓存的调用,我仍然看到响应代码 0 和 0 字节,这让我相信在高峰量(启动风暴)中,我的文件描述符计数仍然太低。
我已经阅读了一些帖子,可以将设置设置为 24k、40k 甚至 70k。由于这是一个专用的 squid 盒,我不担心其他进程/用户在系统范围内竞争文件描述符,但我真的很想知道粗略计算我应该配置多少个文件描述符的最佳实践是什么对于 ulimit -n。
在我的配置中,我有最多 3000 个客户端 TCP 连接,最多 3000 个服务器端 TCP 连接,以及一些在 squid 配置中默认配置的日志文件(cache.log、squid.log)。是否像说我应该将我的 ulimit -n 设置为 3000 + 3000 + 2 + (一些开销)一样简单?由于缺乏有关此事的文档,我可能会将其设置为 24k 只是为了永远不必处理它,但我更喜欢遵循最佳实践公式 - 就像使用 apache2 一样,您可以计算多少请求所需的内存希望能够同时处理。
编辑:忘了提到我没有将这些缓存文件写入磁盘,它们保留在内存中。这是几百个文件(总共<5 MB)网站是唯一通过这个加载的页面,所以这就是我省略磁盘读/写文件描述符的原因。
在最坏的情况下,对 squid 服务器的每个请求都需要三个文件描述符;
然后是开销,包括日志文件、任何进程间通信,例如帮助程序和空闲连接。因此,粗略估计每个传入 TCP 连接需要三个文件描述符,然后将任何开销考虑在内。
在寻找更多“最佳实践”信息的过程中,Nasoo 专注于如何计算您应该配置的打开文件的数量。我发现浏览器处理并行下载文件的方式很复杂,因此实际上有 3000 个客户端使用大约 25-30 个套接字来下载完整的网页和动态内容。其中一些取决于浏览器如何并行下载以及 javascript API 如何处理下载动态内容。
因此,虽然如果没有大量额外测试,我无法准确确定正确的数字,但我也偶然发现了一本手册,其中指出可以为每 4MB 的 RAM 设置 256 个文件句柄。所以这应该绰绰有余,即使我为这个盒子拥有的 8GB RAM 的一半也将是多余的。
http://www.tldp.org/LDP/solrhe/Securing-Optimizing-Linux-RH-Edition-v1.3/chap6sec72.html
编辑:我还开始通过 cronjob 每分钟记录一次 RRD 文件的文件描述符使用情况。这是一个非常基本的 bash 脚本,可以将其全部记录下来,您可以在没有监控服务器或任何东西的情况下生成非常方便的图表。如果有人对此感兴趣,请告诉我,我会从中总结出一个要点。