APC 奇怪的长回应

APC 奇怪的长回应

我的 debian 6 + nginx + apc 3.1.9 + php-fpm 5.3.10 服务器存在响应缓慢的问题。我的网站基于 symfony 1.4。

我的设置是 VPS,内存为 512MB,几乎每次都用到 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

奇怪的是,这种情况只是偶尔发生……

答案1

找到了..

这是因为 apc.mmap_file_mask 设置为“直接文件支持的 mmap”官方 APC 文档由于服务器设置是多线程的,并且 apc 存储在物理文件中,因此由于文件锁定而卡住。

将其设置到共享内存中非常重要。

所以现在我的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"

相关内容