timon_timonich


Заметки суриката

Я в этой жизни ничего не добился. Зато сам!


Previous Entry Share Next Entry
Рабочие будни. APC, PHP, Nginx, Mysql, Memcache. Ода оптимизации
timon_timonich
Красивая картинка для привлечения внимания.



Долгое время, я всячески с особыми извращениями мучался с одним своим проектом. Тормозит зараза, чтобы я не делал. Долго оптимизировал запросы к БД, потом решили замутить кэширование запросов к БД на файлах, и все что можно вынести вообще на  файлы. Работа с БД стала шустрой, но теперь ацко нагибалась файловая система. Думаю ну хрен с ним SSD винт, вот наш выбор, он то спасет бедную файловую систему. Привезли винт, поставили. Ну вначале показалось, что вот оно счастье, но как обычно херушки. Долго чесал репу что делать, в итоге родилась мыслишка перенести файлы базы на второй винт, который старый жесткий.. Стало работать быстрее, прилично быстрее, процентов на 20, но иногда раз в 10-15 минут все дико висло на короткое время и дальше работало как надо. Но через неделю пипец подкрался откуда не ждали, если вкратце кэширование запросов к БД на файлах. Со временем их скапливается столько, что файловая система начинает орать помогите и загибаться. Раньше это решалось еженедельной чисткой всего этого кэша, метод топорный, но работал.

В общем меня это достало, и я решил поковыряться в инете. В несколько шагов по разным ссылкам привели меня на замечательную статью "Сервер на стероидах: FreeBSD, nginx, MySQL, PostgreSQL, PHP и многое другое". Картинка кстати оттуда же. Написано там много про что, но вот что для себя почерпнул я.

1. Nginx
Из статьи взял банальную оптимизацию, дальше особо не копался, ибо считаю что фронтенд и так ведет себя отлично.

reset_timedout_connection on;
sendfile on;
tcp_nopush on;
tcp_nodelay on;

2. Mysql
Про кэширование запросов встроенный в Mysql я знаю, но решил что не стоит его использовать так как, у нас ну очень часто обновляются данные, причем везде. Не знаю насколько это правильно, но не вижу смысла, так как то что надо мы и так кэшируем в скриптах. 

По статье нашел две ссылочки на скрипты подсказывающие оптимальные настройки.
  • tuningprimer
  • mysqltuner кстати как тут скачать скрипт я не могу врубиться минут 5, замаскировали они ссылку.
Они правда обе очень просили включить кэш запросов, но я их таки не послушал :)

3. APC

В принципе он и так стоял, но стоял топорно с рекомендуемыми настройками. В статье я обнаружил ссылочку на занятный материал на эту же тему от Facebook. По результатам статьи было изменено следующее:
  • Вместо крайне тормознутого File Locking, APC был пересобран с поддержкойspin locking. Долго не мог понять почему не собирался с поддержкой pthread mutex, как рекомендовали фейсбуковцы, оказалось не поддерживает архитектура.
  • добавлена директива apc.stat=0, теперь APC не будет каждый раз проверять изменение файла, правда на момент редактирования скрипта надо перезапускать процесс и выставлять параметр на значение 1
4. Самое интересное - Memcache
Проблему с  кучей кэширующих файлов решил довольно просто, memcache - это обычная база данных ключ - значение, которая все это держит в памяти. Совершенно спокойно поставил её из портов, ставить лучше оттуда ибо тогда в rc.d появляется скрипт автозапуска, запустил как демон выделив 2 гига памяти. 

Дальше меня ждал нюанс, модулей для работы с Memcache у php два: memcache  и memcached. Установить решил первый ибо он судя по всему понадежнее. Я их немного перепутал. Когда по мануалу php ищешь нужное не совсем разница заметна, у обоих заявлена поддержка сессий, долгое время катастрофически тупил и не мог понять почему сессии не сохраняются да и БД тупило, оказывается перепутал имена. 

Включить поддержку сессий довольно просто
session.save_handler = memcache
session.save_path = "127.0.0.1:11211"

А класс для работы с БД у меня оказывается тоже имел встроенную поддержку кэширования с помощью memcache.

Итого общий прирост составил около 80 процентов. Еще можно переставить операционку на поддержку 64Bit, но дял этого надо тушить сервер на всю ночь. Для чего я это написал? Не знаю, по большей части чтобы сохранить ссылки, ну и может кому нить пригодится и человек не наступит на те же грабли что и я.

?

Log in

No account? Create an account