Приветсвую.Проблемма:
Есть некое самописное php4 приложение отдающееся через apache. Оно
использует как бекэнд mysql и memcached для кэширования запросов. Оно
активно используется вот уже несколько лет и сейчас для него поднимается
новый сервер(собственно говоря вот этот). Мы начали проводить стрес тест
приложения и наткнулись на проблемму.
Стресс тест проводился следющим образом:
Через это приложение с многих компьютеров запрашивались несколько
больших отчётов(обьём от 5 до 20 мб). Первые отчёты приходили, но через
некоторое время(около 30 минут) всё ломалось и приложение переставало
работать. В логах апача было следующе:FATAL: emalloc(): Unable to allocate xxx bytes
xxx = постоянно менялось от 1 байта до 100.
И после этого праграмма больше не работала. Рестарт апача возвращал всё
на исходную позицию.Сразу скажу что это НЕ зависит от php.ini memory_limit, от нехватки ОЗУ
или swap.Ошибка возникает при делолтных конфигах mysql(my.cnf) и php(php.ini) так
и без них.Мы пробовали ставить разные версии Apache(2.0; 2.2), тюнить
php.ini(memory_limit, etc), переустанавливать систему с нуля. Ничего
ситуацию не изменило.Мы пробовали пускать эти запросы, которые убивают приложени в sql виде
и никаких проблем не было. Проблема где-то именно в взаимодействии php и
mysql, imho.Я долго гуглил эту ошибку и прочитал пол интернета в том числе и все
баги на багтрекере php. Но нигде не нашёл решение для нашей ситуации.Буду рад любой помощи.
---------
Железо:
CPU: Intel(R) Xeon(R) CPU E5335 @ 2.00GHz (2000.08-MHz 686-class CPU)
3 Gb RAMУвы не могу сказать точнее про ОЗУ и ничего не знаю про материнскую
плату. Когда узнаю - обновлю информацию.Система:
FreeBSD 6.3-RELEASE /usr/obj/usr/src/sys/SMP i386
Express install.Утановленные пакеты:
Apache-2.0.63
Mysql-server-5.0.51a
Memcached-1.2.4
Php4-4.4.8
(WITH_CLI=true, WITHOUT_CGI=true, WITH_APACHE=true, WITHOUT_DEBUG=true,
WITH_SUHOSIN=true, WITH_MULTIBYTE=true, WITHOUT_IPV6=true
WITHOUT_MAILHEAD=true, WITHOUT_REDIRECT=true, WITHOUT_DISCARD=true
WITHOUT_FASTCGI=true, WITHOUT_PATHINFO=true, WITH_OPENSSL=true
WITH_ZLIB=true)
+ extensions
(WITHOUT_BCMATH=true, WITHOUT_BZ2=true, WITH_CALENDAR=true,
WITHOUT_CRACK=true, WITH_CTYPE=true, WITH_CURL=true, WITHOUT_DBA=true
WITHOUT_DBASE=true, WITHOUT_DBX=true, WITHOUT_DIO=true,
WITH_DOMXML=true, WITH_EXIF=true, WITHOUT_FILEINFO=true,
WITHOUT_FILEPRO=true, WITHOUT_FRIBIDI=true, WITHOUT_FTP=true,
WITH_GD=true, WITHOUT_GETTEXT=true, WITHOUT_GMP=true, WITH_ICONV=true,
WITHOUT_IMAP=true, WITHOUT_INTERBASE=true, WITHOUT_LDAP=true,
WITH_MBSTRING=true, WITHOUT_MCAL=true, WITHOUT_MCRYPT=true,
WITHOUT_MCVE=true, WITH_MHASH=true, WITHOUT_MNOGOSEARCH=true
WITHOUT_MSSQL=true, WITH_MYSQL=true, WITHOUT_NCURSES=true,
WITHOUT_ODBC=true, WITHOUT_OPENSSL=true, WITHOUT_ORACLE=true,
WITH_OVERLOAD=true, WITHOUT_PCNTL=true, WITH_PCRE=true, WITHOUT_PDF=true
WITHOUT_PFPRO=true, WITHOUT_PGSQL=true, WITH_POSIX=true,
WITHOUT_PSPELL=true, WITHOUT_READLINE=true, WITHOUT_RECODE=true,
WITH_SESSION=true, WITHOUT_SHMOP=true, WITHOUT_SNMP=true,
WITHOUT_SOCKETS=true, WITHOUT_SYBASE_CT=true, WITHOUT_SYSVMSG=true,
WITHOUT_SYSVSEM=true, WITHOUT_SYSVSHM=true, WITH_TOKENIZER=true,
WITHOUT_WDDX=true, WITH_XML=true, WITH_XMLRPC=true, WITH_XSLT=true,
WITHOUT_YAZ=true, WITHOUT_YP=true, WITHOUT_ZIP=true, WITH_ZLIB=true,)и их зависимости. Всё из портов.
(извиняюсь за большое кол-во сборочной информации, но мне кажется она
весьма важна в данной проблемме)
Если уж переставляли систему, то может стоит попробовать какой-нибудь линукс. Там другое ядро и malloc.
>Если уж переставляли систему, то может стоит попробовать какой-нибудь линукс. Там другое
>ядро и malloc.Нет, задача поставить именно под FreeBSD, увы.
>Приветсвую.
>Есть некое самописное php4 приложение отдающееся через apache.В этом вашем приложении, где-то пожет быть прописан
@ini_set("memory_limit", "");И можете хоть обтюниться c php.ini - значение будет браться из скрипта.
> Оно использует как бекэнд mysql и memcached для кэширования запросов.
Как насчёт попробовать увеличить память, выделенную для memcached?
>Мы пробовали ставить разные версии Apache(2.0; 2.2), тюнить
>php.ini(memory_limit, etc), переустанавливать систему с нуля. Ничего
>ситуацию не изменило.Следуя вашей логике, надо было попробовать ещё купить новый сервер.
>Буду рад любой помощи.
>>Приветсвую.
>>Есть некое самописное php4 приложение отдающееся через apache.
>
>В этом вашем приложении, где-то пожет быть прописан
>@ini_set("memory_limit", "");Нет, этого нигде нет. Проблема не в memory_limit.
>> Оно использует как бекэнд mysql и memcached для кэширования запросов.
>Как насчёт попробовать увеличить память, выделенную для memcached?Приложение без проблем работает и без memcached. Просто тогда оно ничего не кеширует что влияет на производительность. Мы пробовали его тестировать без memcached - ошибка присутствовала.
>Следуя вашей логике, надо было попробовать ещё купить новый сервер.
Мы пробовали разворачивать эту же конфигурацию на другом сервере. Ошибка присутствовала.
лимиты во фре пробовали проверять?
limits -U www (или под каким юзером это у вас работает?)
ulimit -a
попробуйте увеличить системные лимиты на процесс
/boot/loader.conf
kern.maxdsiz="1010612736" # 1.5GB
kern.dfldsiz="1010612736" # 1.5GB
kern.maxssiz="268435454" # 256MB
>лимиты во фре пробовали проверять?
>limits -U www (или под каким юзером это у вас работает?)
>ulimit -a
>попробуйте увеличить системные лимиты на процесс
>/boot/loader.conf
>kern.maxdsiz="1010612736" # 1.5GB
>kern.dfldsiz="1010612736" # 1.5GB
>kern.maxssiz="268435454" # 256MBПод www.
%limits -U www
Resource limits for class default:
cputime infinity secs
filesize infinity kB
datasize infinity kB
stacksize infinity kB
coredumpsize infinity kB
memoryuse infinity kB
memorylocked infinity kB
maxprocesses infinity
openfiles infinity
sbsize infinity bytes
vmemoryuse infinity kB
%ulimit -a
ulimit: Command not found.%limit
cputime unlimited
filesize unlimited
datasize 524288 kbytes
stacksize 65536 kbytes
coredumpsize unlimited
memoryuse unlimited
vmemoryuse unlimited
descriptors 11095
memorylocked unlimited
maxproc 5547
sbsize unlimited
А сколько апач сжирает памяти перед тем как отвалиться?
>А сколько апач сжирает памяти перед тем как отвалиться?В top`пе успевает мелькнуть 422 mb, и дальше он отваливается, возможно реальное значение больше.
>А сколько апач сжирает памяти перед тем как отвалиться?Понаблюдал повнимательней.
Максимальный размер перед падением был 482 Mb. Предпологаю что падает он где-то чуть выше.
512mb?...Но из-за чего?
системный лимит freebsd в полгига на процесс. Поставь в loader.conf значения maxdsize повыше (как я написал)
>системный лимит freebsd в полгига на процесс. Поставь в loader.conf значения maxdsize
>повыше (как я написал)Я не знаю как вас благодарить. Спасибо вам огромное.
Оказывается апач раздувался до 817 (!!!) Mb. Сейчас будем думать из-за чего это.
Вы случаем не из Москвы? :-)
да собсно не за что :)из нее самой ;)