Php-Fpm

APC 奇怪的長響應

  • February 17, 2012

我的 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"

引用自:https://serverfault.com/questions/360345