我在一臺運行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緩存此文件?有問題的解決方案嗎?
是緩存內容純屬系統緩存條目(代碼),或者它包括用戶緩存條目。通常情況下,後者是碎片化的,因爲系統緩存條目一旦被加載到緩存中時通常是靜態的(除非在開發系統上)。如果這是一個生產系統,那麼無論何時運行腳本,都應將apc.stat = 0設置爲diable檢查新版本的代碼文件。 – 2010-10-06 13:41:39
謝謝你的回答。它僅包含系統緩存條目,我僅將其用於操作碼緩存。在apc.stat上:apc.stat可以影響碎片嗎? – 2010-10-06 14:18:49
apc.stat通常只是一個開銷:但如果APC不識別php文件的新版本,那麼將刪除舊的緩存條目,緩存新的,所以這可能會導致碎片......但只有當PHP文件本身被改變。 apc.stat = 1通常用於腳本受到定期更改的開發環境中;生產系統上的apc.stat = 0,文件不應該定期更改。 – 2010-10-06 14:58:10