针对大量小文件服务器的优化建议

针对大量小文件服务器的优化建议

我有 nginx+php-fpm+apc 设置。没有数据库。在数据文件夹中,我有一个简单的 php 脚本,当使用 filename 参数调用时,它会检查文件是否存在,如果存在,则将其释放,如果不存在,则将其下载到同一文件夹中,然后释放。速度非常重要,现在需要 70ms 才能在浏览器中输出文件。

这些文件是大小为 1-2kb 的图像。按照这个速度,几个月后该文件夹中将有数千张图像。并且该脚本每秒将被调用数十次(甚至更多)。所以我担心服务器会开始出现问题。

您能给我一些建议吗:

-Nginx 调整

-系统调整

-我是否应该时不时地运行某种硬盘维护?

在这种情况下您还有什么建议?

RAM:386MB(可升级)CPU:Xeon E5506 @ 2.13GHz CentOS 6

更新 #1 一个有趣的想法:不要让 PHP 检查文件是否存在 - 让 nginx 尝试直接提供文件,然后回退到 PHP 作为 404 处理程序。如果让 nginx 自行处理,它应该可以轻松提供约 1000 张 2kb 图像/秒,而无需进行任何调整。

答案1

很难具体说明,因为这需要更多信息。如果图像不是在每个请求时动态生成的,则不每次都通过脚本传递它们是有意义的,即使它们静态化。如果图像不经常更改,我会尝试将大部分图像缓存到内存中。由于图像非常小,因此可以将它们放入内存中,从而可以避免大量的磁盘 I/O。

我们在使用方面有很好的经验为此。它是一种所谓的反向代理缓存,这意味着它将接收来自客户端的传入请求,检查其缓存,然后直接从缓存中提供请求的对象或首先从后端 nginx 服务器检索它。Varnish 可以轻松处理每秒数千个请求,并且 CPU 和 I/O 使用率非常低。响应时间非常快。我们的响应时间为 20-30 毫秒,其中一半是电子往返所需的时间。

将 Varnish 放在 nginx 前面,确保每个唯一图像都有唯一的 URL。在服务器中放入几 GB 的 RAM,并配置 Varnish 以将其大部分用于缓存。如果您的图像为 1-2kB,则 1GB 或 RAM 可以缓存大约 500-1000 张图像。Varnish 可以很好地使用其默认规则集,但它非常可调,这使其比大多数其他代理缓存更具优势。

确保您的应用程序不会在域上设置 cookie,或者调整 Varnish 以丢弃指向图像的 URL 的 cookie,因为如果请求包含 cookie,它会采取谨慎的态度并且不会缓存该请求。此外,让您的应用程序返回足够远的过期标头(参见“Cache-Control: max-age”)以使缓存有用。设置几周的最大期限很容易,如果对象需要更早过期,您的应用程序可以从 Varnish 的缓存中清除该对象,或者只是在新的 URL 上提供新图像。

答案2

不要让 PHP 检查文件是否存在 - 让 nginx 尝试直接提供文件,然后返回 PHP 作为 404 处理程序。如果让 nginx 自行处理,它应该可以轻松提供 ~1000 张 2kb 图像/秒,无需任何调整。

答案3

老实说,如果你依赖底层操作系统来告诉你某个文件是否存在……那么当你的文件数量很多时,你就会遇到问题。目录中的文件越多……这种查找所需的时间就越长。不同的文件系统格式可以更好地改进这一点……但这仍然是一项耗时的工作。

当检查文件是否存在时...文件系统将从上到下检查每个文件,直到找到您要查找的文件。例如,使用 ext2,如果您正在寻找 zzzz...您必须从 a -> zzzz 浏览每个文件才能找到它。

你最好做一长串的调整来解决这些令人头痛的问题。例如,缓存搜索结果...限制目录中的文件数量...将文件解析到多个目录中......等等......

相关内容