Снижение нагрузки php+mysql

На сервере установлен nginx который успешно отдает статику и с этим проблем не возникает, но в основном контент динамический и когда количество посетителей в онлайне возрастает, процессы апача множатся пока не заканчивается вся память, и практически каждая страница выполняет по несколько запросов к mysql что тоже снижает производительность.

Вопросы:
1. Какие вообще есть методы оптимизации в подобных случаях, о которых я, возможно, не знаю ?

2. Часто видел сравнения xCache ,eAccelerator, memcached. Так и не понял толком что для чего предназначено. Посоветуйте чем лучше воспользоваться ? Слышал что xCache не использует TCP соединение и за счет это работает быстрей (если сайт расположен на одном сервере), так ли это ?

3. На сервере, 4 ГБ RAM, Вполне возможно всю базу держать в оперативке, как лучше это сделать ? Мне в голову приходит только использование MEMORY таблиц в mysql (запись делать в обычные таблицы и триггером их синхронизировать с MEMORY-таблицами, а вся выборка уже из них) насколько удачен такой способ? может быть Вы знаете другие более оптимальные ?

Еще как вариант хранить БД в tmpfs, но это для меня очень туманная перспектива. И что будет если сервер упадет и данные не успеют сохранится на диске ?

4. Так же интересны способы оптимизации самих php скриптов (допустим чтобы они держались в памяти а не прогонялись через транслятор каждый раз)

Заранее спасибо.

1 ответов


Я бы посоветовал начать с определения бутылочного горлышка в проекте. обычно оно в mysql
С mysql логгировать запросы смотреть какие из них slow query и кроме того все temp table и filesort. может быть где-то поможет грамотное построение индекса, где-то небольшое изменение структуры базы. Это самый неприятный и трудоемкий момент, но и самый продуктивный. Иногда ( а по факту почти всегда) помогает вынести часть функционала из базы в PHP, или в другую программу. Например, если регулярно встречаются запросы вида like '%что-то там%' по таблицам за 100 000 записей то это повод вынести поиск из mysql наружу. В тот же сфинкс.
Следующий этап - осмотр PHP поиск узких мест. Особенно повторных запросов в базу. Очень часто помогает локальное кеширование переменных в пределах одного скрипта или в пределах сессии.
После этого всего можно переходить к обдумыванию процедуры кеширования промежуточных данных в тот же memcache или даже на диск.
Ну и заодно если до сих пор не сделано, настройте nginx в качестве реверсного проски для апача. Это очень и очень помогает разгрузить апача и php при наличии медленных клиентов.
Ну и из личного опыта. Есть еще метод быдлооптимизации. Как правило это единственный метод, когда проект чудой, большой, куча говнокода. Все тормозит и становится колом, а заказчик не дает времени и все должно заработать вчера. Тупая обертка над всем, которая складывает сгенеренные страницы в файловый кеш. Как правило позвляет хотя-бы поднять лежащий проект и найти время на все то, что я написал выше.