Почему сайт с простейшими sql запросами «валит» VPS уже при 50 активных посетителей?

Есть сайт с достаточно большой посещаемостью. Раньше он находился на обычном хостинге и все хорошо работало. Максимальное время отклика не превышало секунду. Но из-за роста посетителей было решено перенести его на VPS.

После этого начались ужасные вещи. Уже при 3 запросах в секунду и 50 активных юзеров время отклика сайта перевалило за 30 секунд! Писал в поддержку хостера и там мне ответили, что проблема запросах к базе (mysql), которые съедают 97% ресурсов сервера и проблема в оптимизации самого VPS. Мол их сервера для хостинга максимально оптимизированы и поэтому там такая проблема не проявлялась.

И вот я теперь думаю как же так нужно оптимизировать VPS, чтобы он хотя бы 20 пользователей держал. Смех да и только.

Вот пример тех запросов, которые выполняет сайт:

$res = mysql_query("SELECT * FROM content WHERE category = 'new' AND title LIKE '%".mysql_real_escape_string($search)."%' GROUP BY thumb ORDER BY id DESC LIMIT $p, $limit") ;


Проще некуда и эти запросы уж при 50 пользователей точно не частые.

Далее покажу графики с тестов loadimpact (от 0 до 100 посетителей). Первые 2 картинки - это графики сайта с VPS (все плохо):

2f84acd4a012773a4909129a342ca859.jpg768291af76932cfb35610dbf41f67ca9.jpg

А теперь покажу для сравнения графики того же сайта, но с обычного хостинга:

89a828cc916605fbb32b831c4b79986c.jpgb065a74a9d7e9de8f772ab1a50870b3b.jpg

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

Если нужна какая-то дополнительная информация, то я ее предоставлю.

Заранее спасибо!
  • Вопрос задан
  • 5088 просмотров
Пригласить эксперта
Ответы на вопрос 13
@Masterme
Действительно. Какой-то глупый VPS. Разве может LIKE '%...' тормозить?
Ответ написан
Комментировать
@Masterme
А я вот раньше ездил на автобусе и за 20 минут доезжал до работы. А неделю назад купил машину, так в ней в пробки попадаю, и едет она медленно. В сервисе сказали, что машина оптимизирована для езды, должно быть всё в порядке. Вот графики моих поездок на машине
[картинка жпг]
а вот на автобусе раньше
[картинка жпг]
Пожалуйста подскажите, в чём может быть проблема.
Ответ написан
GeneMoss
@GeneMoss
void
Проблема в LIKE '%...'. Данный запрос не использует индексы и ведет построчный поиск. Для поиска лучше использовать Sphinx или что-нибудь вроде него.
Ответ написан
Комментировать
Делаете вывод этого запроса
echo "SELECT SQL_NO_CACHE * FROM content WHERE category = 'new' AND title LIKE '%".mysql_real_escape_string($search)."%' GROUP BY thumb ORDER BY id DESC LIMIT $p, $limit";


Затем идете в phpMyAdmin (или что у вас там стоит) и выполняем запрос.
Добавляем перед запросом EXPLAIN и смотрим что происходит.
Ответ написан
@Kaliha
Системный администратор хостинга
1. Oversell
2. Медленное хранилище
3. Все таки шаред хостинг может работать быстрее чем дешевые VPS.
Ответ написан
Комментировать
@Arik
1. Обычный хостинг сильнее многих VPS - на момент запроса вам доступна практически вся мощь физического сервера, очень редко хостеры делают ограничения здесь
2. Запрос может быть и простым, но вы не написали кол-во данных в этой таблице 100? 10 000 000?
3. У вас одна таблица? Почему грешите именно на этот запрос? Опять же сколько в БД данных и какая структура (индексы)
4. Бывало тормозила VPSка пока не перекинули на другую железку, бывают плохие соседи и они по полной насилуют жесткий диск.
Ответ написан
Для выявления причины тормозов воспользуйтесь Slow Query Log (можно почитать тут). Когда найдете тормозящие запросы, попытайтесь их оптимизировать. Возможно имеет смысл кешировать результаты медленных запросов в памяти (memcache, redis, etc.).

И еще небольшой совет для повышения производительности работы с БД - перейдите с mysql (которая уже deprecated) на mysqli или PDO. На Mysqli перевести существующую систему не составит труда, она может работать в функциональном режиме и похожа синтаксически на mysql.
Ответ написан
Roosso
@Roosso
Нетипичный программист
1. Ну про LIKE все сказали. Это очевидно. Теперь уже очевидно.
2. Что у вас с оперативкой на VPS? Что за ОС?
3. Убейте все расширения Apache и PHP которыми не пользуйтесь. Много это не даст, скажу честно.
4. Сколько у вас запросов приходится на одного пользователя при его обращении к одной странице!? А то вдруг у вас история как у vBulletin нашпигованного модами!? По 50 запросов с одного обращения пользователя.
5. Индексы в БД везде есть!? Может дополнительные сделать!? Пусть размер БД увеличится, зато скорость может подрасти.

Больше информации сообщите публике. А то все к LIKE и будут придираться.
Ответ написан
Комментировать
opium
@opium
Просто люблю качественно работать
это вы лайк то назвали простейшим запросом?
Ответ написан
Комментировать
@inkvizitor68sl
Linux-сисадмин с 8 летним стажем.
У вас виртуалка на openvz, скорее всего. Бегите оттуда )
Тем более, скорее всего, действительно плохо настроенная.
Приходите в жаббер, помогу поселиться на digitalocean (там kvm), расскажу как настроить. Первый месяц у do бесплатен.
Ответ написан
GeneMoss
@GeneMoss
void
Попробуйте LIKE '%...%' переписать с использованием MyISAM-овского FULLTEXT. Для этого достаточно добавить FULLTEXT индекс и немного переписать запрос. По ключевой фразе "MyISAM FULLTEXT search tutorial" в нагуглится много статей.
Ответ написан
@shagguboy
этот запрос вполне может использовать индекс по category для поиска category = 'new'
другой вопрос в том, что потом идет группировка при полном отсутствии аггрегатных функций.. зачем непонятно.
Ответ написан
Комментировать
Сам факт, что "обычный хостинг" у вас держит нагрузку лучше VPS, указывает, что на VPS что-то не так. Во-первых, что за MySQL у вас стоит? Попробуйте MariaDB, потюнингуйте ее. Попробуйте выделить ей как можно меньше ОЗУ (гуглите "mysql low memory", смотрите пример my-small.cnf). Какой движок хранения вы используете, InnoDB/MyISAM? Если не Inno, попробуйте с ним, а если он не актуален, отключите.
У вас может быть включен general_log в MySQL - это лог всех запросов к СУБД. Отключайте, он очень напрягает машинку, особенно если IO тормозит!
Ну и для начала, задумайтесь о создании кеша средствами софта, чтобы постоянно в СУБД не ходить.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы