减少PHP IO负载

时间:2011-08-23 08:52:44

标签: php caching filesystems io

我有一个PHP脚本,可以提供大量小于10mb的较小文件(> 100,000)。它基本上将请求的文件加载到内存中并将其提供给客户端。由于访问控制,我不能直接通过apache提供这些文件,并且需要一个包裹它的脚本。

如果流量很高(> 150mbit),我的硬盘被大量使用,并且代表了缩放的限制。我有一个想法,我可以使用memcached来减少hdd负载,因为我有10gig ram可用,但memcached的最大项目大小为1MB。然后我想我可以使用PHP-APC,但是如果缓存耗尽内存(完全重置),它的行为是不可接受的。

您将如何减少IO负载?

由于

5 个答案:

答案 0 :(得分:1)

  

您将如何减少IO负载?

我自己从未使用过它,但X-Sendfile方法可能有助于消除一些负担。它将实际提供文件的任务传递回Apache。

答案 1 :(得分:0)

我认为你不能这样做,除非你有2个HDD可以拆分这些文件。

答案 2 :(得分:0)

您需要mod_xsendfile for Apache2nginx with X-Accel-Redirect。 lighttpd也有类似的解决方案。 Nginx也可以serve from memcached

如果您正在考虑将经常使用的文件存储在tmpfs中,请不要这样做。这不是一个真正的解决方案,因为即使你直接从磁盘提供文件,后续请求也会达到系统缓存,你会得到类似于tmpfs的速度。

答案 3 :(得分:0)

我会使用PHP-APC将这些文件加载​​到缓存中。

apc_add()apc_fetch()apc_delete()是您想要的。您可以通过使用apc_cache_info()确定可用内存级别来确保不会溢出。您还可以设置apc.user_ttl INI设置以防止填充时清除总缓存。

在测试服务器上进行设置,使其受到高负荷(使用ab等)并使用apc.php检查您的统计信息。调整,调整和调整更多!

答案 4 :(得分:0)

您可以使用支持访问控制的CDN。

但是,如果您想继续自己提供服务,您可以采取各种方法。您总是希望避免通过PHP提供文件,因为这是您的瓶颈。但这些都不是很优雅。

  • 将文件存储在HTTP根目录之外,每隔X分钟生成一个新的符号链接。符号链接在Y时间后删除。然后,您的PHP身份验证脚本只会将用户重定向到存在(临时有效)符号链接的URL。非常短的PHP执行时间,Apache提供的文件。
  • 将文件保留在HTTP根目录中,但更改.htacess文件中的重写规则,而不是实现相同的目的。

通过将最常访问的文件存储在ramdisk中来减少IO负载,通过一些安装魔术或符号链接将它们与常规文件系统集成,然后让Apache处理剩下的工作。