Monday, 1 November 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 гигабайт забитых мусором. Что же делать, что же делать? Хранить кэш на диске :)

3 comments:

  1. ну, нет
    shm сегмент аллоцируется мастер процессом
    и в рамках одного "пула" он общий

    ReplyDelete
  2. Да нет там никаких пулов, 1 процесс - 1 блок памяти. Если 1 аккаунт обслуживает 4 процесса, то для всех будет выделено по блоку памяти. Я же привел данные ipcs -m не просто так. Практика также подтверждает, что система ведет себя именно так.

    ReplyDelete
  3. А X-Cache ведет себя так же?
    Не анализировали этот вопрос?

    ReplyDelete

Note: only a member of this blog may post a comment.