URL: https://www.opennet.ru/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID1
Нить номер: 79457
[ Назад ]

Исходное сообщение
"apache+php = FATAL: emalloc(): Unable to allocate xxx bytes"

Отправлено Oloremo , 25-Мрт-08 18:19 
Приветсвую.

Проблемма:

Есть некое самописное 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,)

и их зависимости. Всё из портов.
(извиняюсь за большое кол-во сборочной информации, но мне кажется она
весьма важна в данной проблемме)


Содержание

Сообщения в этом обсуждении
"apache+php = FATAL: emalloc(): Unable to allocate xxx bytes"
Отправлено angra , 25-Мрт-08 20:15 
Если уж переставляли систему, то может стоит попробовать какой-нибудь линукс. Там другое ядро и malloc.

"apache+php = FATAL: emalloc(): Unable to allocate xxx bytes"
Отправлено Oloremo , 26-Мрт-08 10:13 
>Если уж переставляли систему, то может стоит попробовать какой-нибудь линукс. Там другое
>ядро и malloc.

Нет, задача поставить именно под FreeBSD, увы.


"apache+php = FATAL: emalloc(): Unable to allocate xxx bytes"
Отправлено Nimdar , 26-Мрт-08 13:01 
>Приветсвую.
>Есть некое самописное php4 приложение отдающееся через apache.

В этом вашем приложении, где-то пожет быть прописан
@ini_set("memory_limit", "");

И можете хоть обтюниться c php.ini - значение будет браться из скрипта.

> Оно использует как бекэнд mysql и memcached для кэширования запросов.

Как насчёт попробовать увеличить память, выделенную для memcached?


>Мы пробовали ставить разные версии Apache(2.0; 2.2), тюнить
>php.ini(memory_limit, etc), переустанавливать систему с нуля. Ничего
>ситуацию не изменило.

Следуя вашей логике, надо было попробовать ещё купить новый сервер.


>Буду рад любой помощи.


"apache+php = FATAL: emalloc(): Unable to allocate xxx bytes"
Отправлено Oloremo , 26-Мрт-08 13:54 
>>Приветсвую.
>>Есть некое самописное php4 приложение отдающееся через apache.
>
>В этом вашем приложении, где-то пожет быть прописан
>@ini_set("memory_limit", "");

Нет, этого нигде нет. Проблема не в memory_limit.
>> Оно использует как бекэнд mysql и memcached для кэширования запросов.
>Как насчёт попробовать увеличить память, выделенную для memcached?

Приложение без проблем работает и без memcached. Просто тогда оно ничего не кеширует что влияет на производительность. Мы пробовали его тестировать без memcached - ошибка присутствовала.

>Следуя вашей логике, надо было попробовать ещё купить новый сервер.

Мы пробовали разворачивать эту же конфигурацию на другом сервере. Ошибка присутствовала.


"apache+php = FATAL: emalloc(): Unable to allocate xxx bytes"
Отправлено Антон , 27-Мрт-08 17:36 
лимиты во фре пробовали проверять?
limits -U www (или под каким юзером это у вас работает?)
ulimit -a
попробуйте увеличить системные лимиты на процесс
/boot/loader.conf
kern.maxdsiz="1010612736" # 1.5GB
kern.dfldsiz="1010612736" # 1.5GB
kern.maxssiz="268435454" # 256MB


"apache+php = FATAL: emalloc(): Unable to allocate xxx bytes"
Отправлено Oloremo , 27-Мрт-08 18:01 
>лимиты во фре пробовали проверять?
>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


"apache+php = FATAL: emalloc(): Unable to allocate xxx bytes"
Отправлено Антон , 27-Мрт-08 18:03 
А сколько апач сжирает памяти перед тем как отвалиться?

"apache+php = FATAL: emalloc(): Unable to allocate xxx bytes"
Отправлено Oloremo , 27-Мрт-08 18:33 
>А сколько апач сжирает памяти перед тем как отвалиться?

В top`пе успевает мелькнуть 422 mb, и дальше он отваливается, возможно реальное значение больше.


"apache+php = FATAL: emalloc(): Unable to allocate xxx bytes"
Отправлено Oloremo , 27-Мрт-08 18:43 
>А сколько апач сжирает памяти перед тем как отвалиться?

Понаблюдал повнимательней.  
Максимальный размер перед падением был 482 Mb. Предпологаю что падает он где-то чуть выше.
512mb?...

Но из-за чего?


"apache+php = FATAL: emalloc(): Unable to allocate xxx bytes"
Отправлено Антон , 27-Мрт-08 18:48 
системный лимит freebsd в полгига на процесс. Поставь в loader.conf значения maxdsize повыше (как я написал)

" FATAL: emalloc(): Unable to allocate xxx bytes"
Отправлено Oloremo , 27-Мрт-08 19:11 
>системный лимит freebsd в полгига на процесс. Поставь в loader.conf значения maxdsize
>повыше (как я написал)

Я не знаю как вас благодарить. Спасибо вам огромное.

Оказывается апач раздувался до 817 (!!!) Mb. Сейчас будем думать из-за чего это.

Вы случаем не из Москвы? :-)  


" FATAL: emalloc(): Unable to allocate xxx bytes"
Отправлено Антон , 27-Мрт-08 19:41 
да собсно не за что :)

из нее самой ;)