2010-10-06 139 views
4

我在一臺運行php 5.3.3的CentOS服務器5上運行帶有4Gb內存的APC 3.1.4的中型網站(每日13 000次訪問)運行APC(php緩存)。在過去的幾周裏,我在日誌中遇到了很多「unable to allocate memory for pool」錯誤,而且網站經常出現故障。APC緩存碎片問題

我認爲問題出在APC上。從統計數據中可以看出,緩存在一兩個小時後已滿,碎片總是跳到100%。這是apc.ini我的配置設置:

apc.cache_by_default 1 
apc.canonicalize 0 
apc.coredump_unmap 0 
apc.enable_cli 0 
apc.enabled 1 
apc.file_md5 0 
apc.file_update_protection 2 
apc.filters 
apc.gc_ttl 3600 
apc.include_once_override 0 
apc.lazy_classes 00 
apc.lazy_functions 0 
apc.max_file_size 1M 
apc.mmap_file_mask /dev/zero 
apc.num_files_hint 0 
apc.preload_path  
apc.report_autofilter 0 
apc.rfc1867 0 
apc.rfc1867_freq 0 
apc.rfc1867_name APC_UPLOAD_PROGRESS 
apc.rfc1867_prefix upload_ 
apc.rfc1867_ttl 3600 
apc.shm_segments 1 
apc.shm_size 512M 
apc.slam_defense 1 
apc.stat 1 
apc.stat_ctime 0 
apc.ttl 7200 
apc.use_request_time 1 
apc.user_entries_hint 0 
apc.user_ttl 7200 
apc.write_lock 1 

從APC統計數據我可以看到緩存文件的數量是非常高的(40 000),這是由於PHPBB的緩存文件過多和的mediawiki。我是否必須使用apc.filters來阻止APC緩存此文件?有問題的解決方案嗎?

+0

是緩存內容純屬系統緩存條目(代碼),或者它包括用戶緩存條目。通常情況下,後者是碎片化的,因爲系統緩存條目一旦被加載到緩存中時通常是靜態的(除非在開發系統上)。如果這是一個生產系統,那麼無論何時運行腳本,都應將apc.stat = 0設置爲diable檢查新版本的代碼文件。 – 2010-10-06 13:41:39

+0

謝謝你的回答。它僅包含系統緩存條目,我僅將其用於操作碼緩存。在apc.stat上:apc.stat可以影響碎片嗎? – 2010-10-06 14:18:49

+0

apc.stat通常只是一個開銷:但如果APC不識別php文件的新版本,那麼將刪除舊的緩存條目,緩存新的,所以這可能會導致碎片......但只有當PHP文件本身被改變。 apc.stat = 1通常用於腳本受到定期更改的開發環境中;生產系統上的apc.stat = 0,文件不應該定期更改。 – 2010-10-06 14:58:10

回答

7

你真的應該在你的生產服務器上設置apc.stat = 0,它會阻止APC實際去IO檢查文件是否已經改變。

還設置apc.slam_defense = 0,因爲它是過時

退房文檔其他選項:http://php.net/manual/en/apc.configuration.php

+0

我已搜查我的php.ini並沒有關於[APC]任何部分(我已經安裝了APC和正常工作)。我可以在我的php.ini中添加這兩行來獲取它嗎? '[APC] apc.stat = 0' – dynamic 2011-07-07 14:33:27

+0

當然可以,因爲默認設置爲 「1」。閱讀http://si2.php.net/manual/en/apc.configuration.php – palmic 2011-11-28 11:44:42

2

我想你應該設置apc.mmap_file_mask = /tmp/apc-yourusernamehere.XXXXXX的文件 - 支持的mmap;通過添加您的唯一字符串使文件掩碼唯一; XXXXXX(剛好6個X的)必須保持,使APC添加隨機字符串或設置爲/ dev /零匿名映射如果您能抽出內存。

我可以看到您正在使用/ dev/zero,這會不必要地佔用內存。