2011-08-23 41 views
1

我有一個PHP腳本,可以處理大小不超過10MB的較小文件(> 100,000)。它基本上將請求的文件加載到內存中並將其提供給客戶端。由於訪問控制,我不能通過apache直接提供這些文件,並需要一個包裹它的腳本。減少PHP IO負載

如果流量很高(大於150mbit),我的硬盤驅動器會大量使用,並且表示縮放限制。我有想法,我可以使用memcached來減少硬盤加載,因爲我有10g的ram可用,但memcached的最大項目大小爲1MB。然後我認爲我可以使用PHP-APC,但是如果緩存內存不足(完全重置),它的行爲是不可接受的。

如何減少IO負載?

謝謝

回答

1

你會怎麼做,以減少IO負荷?

我從來沒有用過它,但X-Sendfile方法可能會有助於帶走一些負載。它將實際提供文件的任務傳回給Apache。

0

我認爲你不能這樣做,除非你有2個硬盤將分裂這些文件。

0

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

如果您正在考慮將經常使用的文件存儲在tmpfs中,請不要。這不是一個真正的解決方案,因爲即使您從磁盤上直接提供文件,後續請求也會觸發系統緩存,並且您將獲得類似於tmpfs的速度。

0

我會使用PHP-APC將這些文件加載​​到緩存中。

apc_add(),apc_fetch()apc_delete()是你想要的。通過使用apc_cache_info()來確定可用內存級別,可以確保不會溢出。您還可以設置apc.user_ttl INI設置以防止填充時總緩存清除。

在測試服務器上進行設置,並將其設置爲高負載(使用ab或類似方法),並使用apc.php檢查統計信息。調整,調整和調整更多!

+0

或者我剛剛收到一封來自亞馬遜的郵件,他們現在有http://aws.amazon.com/elasticache/ - 你不是爲他們做腳步嗎? ;) – mjec

+0

我剛試過。我已將apc.user_ttl和apc.ttl設置爲30,並多次使用apc_add。緩存在超過限制後總是被徹底清除:-( – Philip

+0

@Philip令人失望,APC對於GC來說有點不可靠,您可以使用'apc_cache_info()'來確定緩存是否接近大小,並且不會在這種情況下添加?或者如果接近極限,用'apc_delete()'和一個包含項目,大小,年齡和訪問時間的數據庫來完成自己的GC,以便從最舊的項目中釋放所需的內存? – mjec

0

您可以使用支持訪問控制的CDN。

但是,如果您想繼續自己提供服務,可以採取多種方法。你總是希望避免通過PHP提供文件,因爲那是你的瓶頸。這些都不是很優雅。

  • 將文件存儲在HTTP根目錄之外並每X分鐘生成一個新的符號鏈接。符號鏈接在Y時間後被刪除。您的PHP身份驗證腳本會將用戶重定向到其中存在(臨時有效)符號鏈接的URL。非常短的PHP執行時間,Apache提供的文件。
  • 將文件保留在HTTP根目錄中,但更改.htacess文件中的重寫規則,以實現同樣的目的。

減少IO負載由最經常訪問的文件存儲在ramdisk中,一些安裝魔術或符號連接它們與常規文件系統進行集成,然後讓Apache的處理其餘部分。