Php-Fpm
APC 奇怪的長響應
我的 debian 6 + nginx + apc 3.1.9 + php-fpm 5.3.10 伺服器有響應緩慢的問題。我的網站基於 symfony 1.4。
我的設置是 512MB ram 的 VPS,幾乎每次都使用到 250MB。僅當我打開 APC 時才會發生這種情況。沒有 APC 記憶體的網站響應速度較慢,但表現穩定。
當我打開 APC 時,大約 1/20 的請求表現得像等待某些文件解鎖或類似的東西,大約 5-6 秒後發送響應。(相同請求的常見響應在大約 100 毫秒內提供)我有這個 APC 設置:
extension=apc.so apc.enabled="1" apc.shm_size="32M" apc.num_files_hint = 100 apc.ttl="7200" apc.gc_ttl="600" apc.cache_by_default="1" apc.filters = "apc\.php$,apc_clear\.php$" apc.canonicalize="0" apc.mmap_file_mask="/tmp/apc-php5.XXXXXX" apc.enable_cli="0" apc.max_file_size = 5M apc.report_autofilter="0" apc.include_once_override="0" apc.write_lock="0" apc.stat="0"
fpm 就像 nginx 一樣是多執行緒的,所以我教了它鎖定的會話文件,好的,將會話移到 memcache 中 - 網站要快得多(平均大約 50 毫秒),但有時響應很長的奇怪行為仍然存在。
我在 fpm 中記錄慢響應(門檻值為 3 秒)並擷取其中一些:
第二個日誌中提到的 config_core_compile.yml.php:3851 只包含 $path 和現有 php 文件的有效路徑。
(第一個花了大約 20 秒!)
[15-Feb-2012 13:39:12] [pool www] pid 2205 script_filename = /www/www.site.com/current/web/index.php [0x0000000001d415f0] session_start() /www/www.site.com/releases/20120214220306/cache/frontend/prod/config/config_core_compile.yml.php:3779 [0x0000000001d41410] initialize() /www/www.site.com/releases/20120214220306/cache/frontend/prod/config/config_core_compile.yml.php:1507 [0x0000000001d3f0e0] __construct() /www/www.site.com/releases/20120214220306/cache/frontend/prod/config/config_factories.yml.php:114 [0x0000000001d3ea38] +++ dump failed [15-Feb-2012 12:39:00] [pool www] pid 2186 script_filename = /www/www.site.com/current/web/index.php [0x0000000001b80670] renderFile() /www/www.site.com/releases/20120214220306/cache/frontend/prod/config/config_core_compile.yml.php:3851 [0x0000000001b7f820] renderFile() /www/www.site.com/releases/20120214220306/lib/vendor/symfony/view/sfPartialView.class.php:124 [0x0000000001b7f138] render() /www/www.site.com/releases/20120214220306/lib/vendor/symfony/helper/PartialHelper.php:220 [0x0000000001b7f040] get_partial() /www/www.site.com/releases/20120214220306/lib/vendor/symfony/helper/PartialHelper.php:182 [0x0000000001b7ebe0] include_partial() /www/www.site.com/releases/20120214220306/apps/frontend/modules/hotel/templates/_list_tabs_boxmain.php:8 [0x0000000001b7e770] +++ dump failed
奇怪的是,它只是偶爾發生……
找到了..
這是因為 apc.mmap_file_mask 設置為“直接文件支持的 mmap”,就像官方 APC 文件所說的那樣。由於伺服器設置是多執行緒的,並且 apc 儲存在 fysical 文件中,因此由於文件鎖定而卡住了。
將其設置為共享記憶體非常重要。
所以現在我的 apc.ini 是:
apc.gc_ttl="600" apc.cache_by_default="1" apc.filters = "apc\.php$,apc_clear\.php$" apc.canonicalize="0" apc.mmap_file_mask=/apc.shm.XXXXXX apc.enable_cli="0" apc.max_file_size = 5M apc.report_autofilter="0" apc.include_once_override="0" apc.stat="0"