Назад | Перейти на главную страницу

Отделение сервера mySQL от LAMP и снижение производительности

В настоящее время я использую стек LAMP (поверх Centos 6.5) для наших сайтов и хочу попробовать отделить mySQL от «веб-сервера».

До сих пор я использовал VPS от DigitalOcean с четырехъядерным процессором и 8 ГБ оперативной памяти.
Вчера я создал новый DigitalOcean VPS для единой промежуточной среды (на данный момент) со следующими характеристиками и утилитами:

На веб-сервере работает сайт Drupal, на котором установлены APCu, opCACHE и memcached.

При проверке времени загрузки с помощью Chrome кажется, что сайт теперь загружается медленнее примерно на 0,5 - 1,5 секунды. К сожалению, NewRelic подтверждает мою правоту (см. Приложенный снимок экрана)

Поскольку я впервые настраиваю удаленный сервер mySQL, мне интересно, не пропустил ли я это? какие-либо конфигурации или настройки, которые могут улучшить производительность?

Несколько вещей, которые я порекомендую:
Убедитесь, что веб-сайт использует кеширование Memcached / APC / opcode.
Я бы порекомендовал Memcached для кеширования запросов к БД. Сделайте несколько настроек конфигурации Mysql, используя mysqltuner.pl


Оптимизация конфигурации memcached apc
Расположение файла конфигурации Memcached в ОС на базе Debian / Ubuntu:

/etc/memcached.conf

Файл конфигурации Memcached в ОС на базе Centos / RHEL:

/ и т.д. / sysconfig / memcached

Конфигурацию apc можно вставить в php.ini.

Выполнение этих шагов определенно должно повысить производительность.
И используйте NewRelic APM, чтобы получать данные о том, на что тратится время.
Если сеть является проблемой, я думаю, вы ничего не можете с этим поделать.
Дай мне знать.
Спасибо,
Шахриар

Я не уверен, почему вы удивитесь, ведь вашему серверу MySQL назначено меньше оперативной памяти, а размещение его на другом компьютере увеличивает нагрузку на сетевой интерфейс.

Вам следует контролировать свою сетевую активность, чтобы увидеть, не вызывает ли она каких-либо узких мест.

В зависимости от ваших SQL-запросов и PHP-скриптов, возможно, есть способы лучше оптимизировать эти задачи с точки зрения производительности запросов, а также улучшить результаты, отправляемые обратно в PHP, чтобы уменьшить нагрузку на сеть.

Мне удалось решить проблему, и я думаю, что пройденный мной путь может быть полезен другим.

  • Проверьте задержку между серверами, используя ping, mtr и traceroute чтобы узнать, связана ли проблема с задержкой
  • Проверьте загрузку сервера и свободную оперативную память, используя top (или htop) и free -m
  • Запустите тяжелый запрос на обоих серверах mysql (старый локальный и новый удаленный) и сравните время запроса, мы также можем использовать профилирование mySQL - см. SHOW PROFILE
  • Предполагая, что время запроса mysql аналогично (или, по крайней мере, почти одинаково), мы можем использовать фрагмент PHP для запуска того же кода и посмотреть, возможно, узкое место связано с PHP - я рекомендую использовать Профилирование PHP-приложения NewRelic - в моем случае это было «просветление», так как в конце концов я увидел, что проблема даже не связана с удаленным mySQL, а лишние 0,5–1,5 секунды были вызваны дополнительным вызовом сторонней службы (только при использовании удаленная БД ..)
  • Использовать mysqltuner.pl (как @Shahriar Shojib) предложил, и найдите, есть ли какие-то настройки конфигурации mySQL, которые мы должны иметь (в моем случае их нет ..)
  • Попробуйте отключить iptables или любой другой брандмауэр
  • Проверить сетевой трафик (я использовал iptraf и наши сторонние службы мониторинга), но есть и другие варианты, предложенные @Julie Pelletier

Дополнительный прирост производительности при использовании удаленного сервера mySQL

  • Используйте кеширование memcached, APCu и Opcode (хотя все они уже были установлены в нашем случае - они меняют правила игры ..)

  • И последнее, но не менее важное: используйте SSH-туннель вместо прямого подключения к серверу mySQL (похоже, это экономит около 200 мс на общем времени загрузки страницы)

Надеюсь, что чтение этого ответа сэкономит вам от 0,5 до 1,5 секунд :)