Мы пытаемся развернуть пользовательский кеш APC в среде с высокой нагрузкой как локальный кэш второго уровня на каждом сервере для нашей центральной службы кеширования (redis), для кэширования запросов к базе данных с редко меняющимися результатами и конфигурацией. Мы в основном посмотрели, что сделал Facebook (лет назад):
http://www.slideshare.net/guoqing75/4069180-caching-performance-lessons-from-facebook http://www.slideshare.net/shire/php-tek-2007-apc-facebook
Он работает довольно хорошо в течение некоторого времени, но через несколько часов при высокой нагрузке APC сталкивается с проблемами, поэтому весь mod_php больше не выполняет никакого PHP. Даже простой PHP script, который больше не отвечает, а статические ресурсы все еще доставляются Apache. Это действительно не сбой, нет segfault. Мы пробовали последнюю стабильную и последнюю бета-версию APC, мы пробовали pthreads, spin locks, каждый раз с той же проблемой. Мы предоставили APC гораздо больше памяти, которую он может когда-либо потреблять, за 1 минуту до крушения у нас есть 2% фрагментации и около 90% памяти бесплатно. Когда он "сбой", мы не находим ничего в журналах ошибок, только перезапуск Apache помогает. Только со спин-замками мы получаем ошибку php, которая:
PHP Неустранимая ошибка: Неизвестно: Застрял спин-блокировка (0x7fcbae9fe068), обнаруженная в Неизвестно в строке 0
Кажется, это своего рода тайм-аут, который не возникает с pthreads, потому что они не используют таймауты.
Вероятно, что-то вроде этого: http://notmysock.org/blog/php/user-cache-timebomb.html
Некоторые номера: сервер имеет около 400 APC-запросов в секунду в секунду и около 30 вставок в секунду (что, по-моему, много), один запрос содержит около 20-100 запросов пользователя. В пользовательском кеше имеется около 300 000 переменных, все с ttl (мы сохраняем без ttl только в нашем центральном redis).
Наши настройки APC:
apc.shm_segments=1
apc.shm_size=4096M
apc.num_files_hint=1000
apc.user_entries_hint=500000
apc.max_file_size=2M
apc.stat=0
В настоящее время мы используем версию 3.1.13-бета, собранную со спин-блокировками, используемую со старым PHP 5.2.6 (ее устаревшим приложением, Ive слышал, что эта версия PHP тоже может быть проблемой?), Linux 64bit.
Сложно отлаживать, мы создали сценарии мониторинга, которые собирают столько данных, сколько мы могли бы получить каждую минуту от apc, системы и т.д., но мы не видим ничего необычного - даже за 1 минуту до сбоя.
Здесь я видел много подобных проблем, но теперь мы не смогли найти решение, которое решает проблему. И когда я читаю что-то вроде этого:
http://webadvent.org/2010/share-and-enjoy-by-gopal-vijayaraghavan
Я не уверен, что если переход с APC для локального кэша пользователя - лучшая идея в средах с высокой нагрузкой. Мы уже работали с memcached здесь, но APC намного быстрее. Но как добиться стабильности?
С наилучшими пожеланиями, Andreas