簡體   English   中英

Memcache內存耗盡PHP會話

[英]Memcache running out of memory for PHP sessions

我在AWS中有一個運行Nginx + PHP-fpm的Web層,使用ElastiCache上的memcache進行會話。 在過去的6個月左右的時間里,我們遇到了一個非常奇怪的問題,即大約6周左右的時間,ElastiCache節點耗盡內存並開始驅逐密鑰,導致一些用戶失去會話,被注銷以及當然很沮喪,失去了他們在應用程序中的位置。

我嘗試過幾件事。 一個是利用ini中的php-memcached模塊:

session.save_handler = memcached
session.save_path = "<aws elasticache dns:port>"

是的,我確認我實際使用的save_path網址是正確的,並接收網絡連接。 我還通過CloudWatch指標驗證了緩存節點確實正在接收網絡連接和數據。

這個配置不起作用,所以我用Zend框架會話管理器和保存處理程序替換它。 我通過phpinfo()驗證了session.save_handler已設置為user並且還驗證了瀏覽器正在獲取我在Zend會話中配置的正確cookie。

盡管如此,我們遇到了與以下CloudWatch屏幕截圖中所示相同的問題:

memcache節點的cloudwatch指標

內存中的垂直尖峰是我認為由於memcache清除過期密鑰,似乎每24小時發生一次。 最后一個(最右邊)尖峰是重新啟動節點的地方。 奇怪的是,每次清除鍵時,它都不夠清晰。 我們最終得到的可用內存最終呈下降趨勢,這在某種程度上會導致內存耗盡,而memcache會開始驅逐密鑰。

我不知道可能出現什么問題,以及在調試時要嘗試下一步的內容。 有什么想法嗎? 謝謝!

這不是一個錯誤,只是Memcached應​​該如何工作。 根據作為緩存的本質,數據應該(相對)短暫。 如果您當前節點沒有足夠的內存來支持您嘗試存儲的所有值,則它別無選擇,只能驅逐密鑰。 如果您只是存儲會話並且您正在填充整個緩存實例,那么您最好的選擇是升級緩存節點的大小(這就是很多會話!),或者在AWS的情況下,添加另一個節點。

如果您還要在緩存節點上存儲其他數據,請為這些項設置智能到期時間,以便它們過期並定期釋放空間。

更新:我還要補充一點,如果你習慣使用cookies,那么有時間限制的cookie來重新創建丟棄的會話也是一個很好的補充。 基本的“保持登錄” 代碼應該足夠了

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM