FastNetMon

Показаны сообщения с ярлыком eAccelerator. Показать все сообщения
Показаны сообщения с ярлыком eAccelerator. Показать все сообщения

суббота, 5 февраля 2011 г.

PHP Warning: PHP Startup: eAccelerator: Unable to initialize module

Вот такая ошибка:
php -m
PHP Warning: PHP Startup: eAccelerator: Unable to initialize module
Module compiled with module API=20060613
PHP compiled with module API=20090626
These options need to match
in Unknown on line 0

Может возникать тогда, когда новому PHP (допустим, 5.3) было подложено бинарное расширение, собранное под старую версию PHP (допустим, 5.2).

Для фикса нужно пересобрать eAccelerator и / или сменить путь в конфиге php.ini.

суббота, 4 декабря 2010 г.

CentOS + PHP 5.1.6 + eAccelerator 0.9.6.1 = не собирается

/usr/src/eaccelerator-0.9.6.1/ea_store.c: In function 'store_property_access_check':
/usr/src/eaccelerator-0.9.6.1/ea_store.c:683: error: 'zend_property_info' has no member named 'ce'

Это баг 0.9.6.1 версии eAccelerator: http://eaccelerator.net/ticket/426

Очевидный фикс: юзаем 0.9.6 версию.

среда, 10 ноября 2010 г.

вторник, 2 ноября 2010 г.

mod_fcgid +eAccelerator + SHM

Как бы это глупо ни звучало, но при использовании eAccelerator в режиме PHP FastCGI он создает блок shm памяти для КАЖДОГО рабочего процесса PHP. То есть, если Вы ставитие лимит в 64 мегабайта кэша, то будет выделено дополнительно N*64мб памяти. Жуть не правда ли? Также, очевидно, все скрипты перекомпилируются заново при запуске очередного рабочего процесса, что сводит весь профит на нет.

А вот пруфлинк в баг-трекере eAccelerator: http://eaccelerator.net/ticket/3

На практике же все именно так и есть, имеем 3 рабочих процесса пользователя v001001:
ps aux | grep v001001
v001001 20588 0.2 0.2 336936 69056 ? S 00:33 0:15 /usr/bin/php5-cgi php
root 22492 0.0 0.0 87884 800 pts/2 S+ 02:32 0:00 grep v001001
v001001 24284 0.4 0.2 335060 63152 ? S 00:49 0:30 /usr/bin/php5-cgi php
v001001 24285 0.0 0.2 336712 57952 ? S 00:49 0:05 /usr/bin/php5-cgi php

И смотрим использование SHM памяти:
ipcs -m | grep v001001
0x00000000 266010721 v001001 600 33554432 1 dest
0x00000000 259981492 v001001 600 33554432 1 dest
0x00000000 266043689 v001001 600 33554432 1 dest
0x00000000 1069875720 v001001 600 1048576 0

То есть, 3 по 32 мегабайта. Ну что же, немного... но если у Вас таких процессов сотни 3:

ps aux | grep php5-cgi | wc -l
320

А это ни много ни мало, а целых 9 гигабайт забитых мусором. Что же делать, что же делать? Хранить кэш на диске :)

понедельник, 31 мая 2010 г.

Как научить eAccelerator не работать c shm/sysvipc памятью, а переключить его на mmap

Имеем: eAccelerator + shm валит сервер с ошибками:

eAccelerator: shmmax should be at least 2MBPHP Warning: [eAccelerator] Can not create shared memory area in Unknown on line 0
PHP Fatal error: Unable to start eAccelerator module in Unknown on line 0
eAccelerator: Could not allocate 33554432 bytes, the maximum size the kernel allows is 1048576 bytes. Lower the amount of memory request or increase the limit in /proc/sys/kernel/shmmax.


При его сборке есть следующее:

checking for sysvipc shared memory support... yes
checking for mmap shared memory support... yes
checking for mmap on /dev/zero shared memory support... yes
checking for anonymous mmap shared memory support... yes
checking for posix mmap shared memory support... no
checking for best shared memory type... sysvipc


То есть, есть выбор между различными хранилищами, так как мой баг явно связан с sysvipc / shm, то логично будет его заменить на... на кого? В коде posix map явно указан как NOT TESTED, так что он отпадает.

Далее в configure можно найти кой что интересное:
5365 echo $ECHO_N "checking for best shared memory type... $ECHO_C" >&6; }
5366 if test "$mm_shm_ipc" = "yes"; then
5367
5368 cat >>confdefs.h <<\_ACEOF 5369 #define MM_SHM_IPC 1 5370 _ACEOF 5371 5372 msg="sysvipc" 5373 elif test "$mm_shm_mmap_anon" = "yes"; then 5374 5375 cat >>confdefs.h <<\_ACEOF 5376 #define MM_SHM_MMAP_ANON 1 5377 _ACEOF 5378 5379 msg="anonymous mmap"



Отсюда следует, что shm_mmap_anon (он же MM_SHM_MMAP_ANON) следующий в списке предпочтений.

Так что делаем следующее:
vi configure


Накатываем патч:

- 5366 if test "$mm_shm_ipc" = "yes"; then
+ 5366 if false; then


Потом перезапускаем configure и получаем все, как надо:

checking for sysvipc shared memory support... yes
checking for mmap shared memory support... yes
checking for mmap on /dev/zero shared memory support... yes
checking for anonymous mmap shared memory support... yes
checking for posix mmap shared memory support... no
checking for best shared memory type... anonymous mmap


То есть, теперь он будет собран с anonymous_mmap и, возможно, прекратит сваливать сервер.

APC vs XCache vs eAccelerator

http://itst.net/654-php-on-fire-three-opcode-caches-compared и еще вот http://2bits.com/articles/benchmarking-drupal-with-php-op-code-caches-apc-eaccelerator-and-xcache-compared.html

среда, 10 февраля 2010 г.

Magento 1.3.2.4 в связке с PHP 5.2 и eAccelerator 0.9.6 = проблемы

При входе в админку Magento возникает следующая проблема:

There has been an error processing your request.
Strict Notice: Only variables should be passed by reference in /var/www/nrg/data/www/z-support.ru/lib/Zend/Db/Select.php on line 216
Trace:
#0 /var/www/nrg/data/www/z-support.ru/lib/Zend/Db/Select.php(216): mageCoreErrorHandler(2048, 'Only variables ...', '/var/www/nrg/da...', 216, Array)
#1 /var/www/nrg/data/www/z-support.ru/app/code/core/Mage/Eav/Model/Mysql4/Entity/Attribute/Collection.php(70): Zend_Db_Select->columns(Array)
#2 /var/www/nrg/data/www/z-support.ru/app/code/core/Mage/Eav/Model/Config.php(606): Mage_Eav_Model_Mysql4_Entity_Attribute_Collection->useLoadDataFields()
#3 /var/www/nrg/data/www/z-support.ru/app/code/core/Mage/Eav/Model/Entity/Collection/Abstract.php(367): Mage_Eav_Model_Config


Открываем файл Select.php на строке 216

Там будет следующее:
$correlationName = current(array_keys($this->_parts[self::FROM]));


Заменяем это на:
$arrayKeys = array_keys($this->_parts[self::FROM]);
$correlationName = current($arrayKeys);


(c) http://www.magentocommerce.com/boards/viewthread/56007/

воскресенье, 3 января 2010 г.

Установка eAccelerator на Debian 5 Lenny для PHP в FastCgi режиме

На офсайте говорится "eAccelerator only works with mod_php or php in fastcgi mode. It can't be used in cgi or cli because eAccelerator needs to set up shared memory, and this can only be done when all php instances that need to access it are forks of the first process".

Что по-русски означает, что eAccelerator работает только, если PHP подключен как модуль Апача либо как FastCGI.

Будем ставить версию 0.9.6.1

Ставим все необходимое для сборки:

apt-get install -y php5-dev bzip2 make


Компилируем:


cd /usr/src
wget http://bart.eaccelerator.net/source/0.9.6.1/eaccelerator-0.9.6.1.tar.bz2
tar -xf eaccelerator-0.9.6.1.tar.bz2
cd eaccelerator-0.9.6.1
phpize
./configure
make install


Очищаем систему после сборки
apt-get remove php5-dev
cd
rm -rf /usr/src/eaccelerator-0.9.6.1
rm -f /usr/src/eaccelerator-0.9.6.1.tar.bz2


Кстати, крайне рекомендую обратить внимание на файлик control.php в дистрибутиве, который предназначен для управления и мониторинга eAccelerator :) (спасибо Котеровским наблам, где это упомянуто)

--prefix тут, к сожалению, не работает, т.к. configure берет путь до библиотек из:

php-config --extension-dir
/usr/lib/php5/20060613



Создаем конфиг файл:

vi /etc/php5/conf.d/eaccelerator.ini


Вариантов подключения к PHP два - Zend Extension и обычное расширение, мне почему-то второй больше импонирует.

Вот стандартный конфиг:

extension="eaccelerator.so"
# eaccelerator.shm_size="16" # иначе получите проблемы на своем VPS
eaccelerator.cache_dir="/tmp/eaccelerator"
eaccelerator.enable="1"
eaccelerator.optimizer="1"
eaccelerator.check_mtime="1"
eaccelerator.debug="0"
eaccelerator.filter=""
eaccelerator.shm_max="0"
eaccelerator.shm_ttl="0"
eaccelerator.shm_prune_period="0"
eaccelerator.shm_only="0"
eaccelerator.compress="1"
eaccelerator.compress_level="9"


А вот мой оптимизированный:

extension="eaccelerator.so"
; размер shm памяти в мегабайтах
eaccelerator.shm_size="32"
eaccelerator.cache_dir="/tmp/eaccelerator"
eaccelerator.enable="1"
eaccelerator.optimizer="1"
eaccelerator.check_mtime="1"
eaccelerator.debug="0"
eaccelerator.filter=""
eaccelerator.shm_max="0"
eaccelerator.shm_ttl="0"
eaccelerator.shm_prune_period="0"
; памяти у нас много, будем кэшировать в ней
eaccelerator.shm_only="1"
; рекомендую отлючить
eaccelerator.compress="0"
eaccelerator.compress_level="9"


Создаем папки для кэша (тут, как понимаете, будут проблемы с FastCGI, т.к. в нем скрипты работают от имени юзеров, а не от имени Апача, как это победить - я хз пока что). Кстати, в случае SHM памяти все будет очень безопасно по причине, что shm блоки будут создаваться от имени пользователя, от которого запускается скрипт. Так что самый лучший вариант в случае FastCGI - отключение файлового кэша и расположение скомпилированного кода только в shm.

Это в случае использования только shm не требуется:

mkdir /tmp/eaccelerator
chmod 0777 /tmp/eaccelerator


А испытать работоспособность можно командой:

php -m | grep eAcc
eAccelerator


И, наконец, перезапускаем Апача:

/etc/init.d/apache2 restart


Также в результате может сломаться phpmyadmin, фиксить его так: http://phpsuxx.blogspot.com/2009/11/g-phpmyadmin.html

Основано на: http://www.eaccelerator.net/wiki/InstallFromSource

Обращаю внимание, в мане баг! В Дебияне /tmp/eaccelerator будет удалена при ребуте.

Также обращаю внимание, что при устанвоке размера памяти SHM более 32 бегабайт возможен облом в виде:
eAccelerator: Could not allocate 67108864 bytes, the maximum size the kernel allows is 33554432 bytes. Lower the amount of memory request or increase the limit in /proc/sys/kernel/shmmax.

Это, конечно, тоже фиксится, но нужно немного подтюнить ядро :)

четверг, 29 октября 2009 г.

Eaccelerator + cannot create shared memory area

Столкнулся с ошибкой:

[Thu Oct 29 18:44:18 2009] [error] [client 95.79.241.196] PHP Warning: [eAccelerator] Can not create shared memory area in Unknown on line 0



Фиксица внесением в файл eaccelerator.ini

eaccelerator.shm_size="0"