我有一个PHP脚本,可以提供大量小于10mb的较小文件(> 100,000)。它基本上将请求的文件加载到内存中并将其提供给客户端。由于访问控制,我不能直接通过apache提供这些文件,并且需要一个包裹它的脚本。
如果流量很高(> 150mbit),我的硬盘被大量使用,并且代表了缩放的限制。我有一个想法,我可以使用memcached来减少hdd负载,因为我有10gig ram可用,但memcached的最大项目大小为1MB。然后我想我可以使用PHP-APC,但是如果缓存耗尽内存(完全重置),它的行为是不可接受的。
您将如何减少IO负载?
由于
答案 0 :(得分:1)
您将如何减少IO负载?
我自己从未使用过它,但X-Sendfile
方法可能有助于消除一些负担。它将实际提供文件的任务传递回Apache。
答案 1 :(得分:0)
我认为你不能这样做,除非你有2个HDD可以拆分这些文件。
答案 2 :(得分:0)
您需要mod_xsendfile for Apache2或nginx 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提供文件,因为这是您的瓶颈。但这些都不是很优雅。
.htacess
文件中的重写规则,而不是实现相同的目的。通过将最常访问的文件存储在ramdisk中来减少IO负载,通过一些安装魔术或符号链接将它们与常规文件系统集成,然后让Apache处理剩下的工作。