减少PHP IO负载



我有一个PHP脚本,它为许多大小不超过10mb的较小文件(>100,000)提供服务。它基本上将请求的文件加载到内存中并将其提供给客户机。由于访问控制,我不能通过apache直接提供这些文件,需要一个脚本来包装它。

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

你会怎么做来减少IO负载?

谢谢

你会怎么做来减少IO负载?

我自己从来没有使用过它,但是X-Sendfile方法可能有助于减少一些负载。它将实际提供文件的任务传递给Apache。

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

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

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

在测试服务器上设置内容,使其具有高负载(使用ab或类似的),并使用apc.php检查您的统计信息。调整,调整,再调整!

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

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

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

通过将访问最频繁的文件存储在ramdisk中来减少IO负载,通过一些挂载魔法或符号链接将它们与常规文件系统集成,然后让Apache处理其余的。

你需要mod_xsendfile为Apache2或nginx与X-Accel-Redirect。lighttpd也有类似的解决方案。Nginx也可以从memcached中提供服务。

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

相关内容

最新更新