Большое кол-во подключений с ростом онлайна

b0bah1

Новичок
Задачка такая, есть сайт, онлайн каждый день больше и больше, после промоакций так вообще все виснуть начинает, проблема вся в mysql соединениях, кеширую все что можно и все что нельзя но не помогает. Каждый клик по кнопке вызывает соединение с базой данных и получение ответа. Не знаю есть ли такие технологии которые как бы делают 1 соединение с базой и все запросы посылают в него типа как на ноде, что бы не открывать одновременно 500 соединений.
MYSQL при нагрузках выдает такую ошибку:
Can't create a new thread (errno 11); if you are not out of available memory, you can consult the manual for a possible OS-dependent bug
 

fixxxer

К.О.
Партнер клуба
проблема вся в mysql соединениях
Это вряд ли. Соединения памяти почти не потребляют. Память потребляет выполнение sql-запросов.

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

b0bah1

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

b0bah1

Новичок
По поводу соединение памяти не потребляет, например в настройках mysql стоит пул из 300 соединений разрешенных, приходят например 400 человек и начинают гулять по сайту, одновременно, получается у всех открывается одновременно 300 соединений и остальные 100 выдаются ошибки.
 

fixxxer

К.О.
Партнер клуба
Ну а как это сделать? Если при загрузке страницы вызывается соединение с базой откуда беруться данные о пользователях в переменные по хешу из кук.
Кэшировать данные всех запросов, и смотреть сначала в кэш.
Возьмем для примера memcached (с redis, файлами итд принцип тот же).
Есть получение данных о пользователе - скажем, запрос вида select * from users where id = :id, пусть id = 42.
Сопоставим этому ключ в мемкеше user_42. Смотрим сначала в мемкеш, если там есть - отдаем оттуда. Если там нет - получаем из базы (и только в этот момент открываем соединение, если оно еще не было открыто), прочитанное из базы кладем в кэш. (Тут бы еще неплохо блокировку сделать, чтобы в базу лез только один процесс, но для начала сойдет и так).
Когда данные пользователя user_42 меняются - удаляешь из мемкеша ключик user_42.
 

b0bah1

Новичок
А как блокировку правильно сделать? Например при изменении 1 поля несколькими юзерами. Покупка вещи, или списания баланса, одновременно могут вещь купить несколько пользователей, а могут и 50 и 100. Баланс получается тоже кешировать надо т.к. он меняется во время покупки?
 

fixxxer

К.О.
Партнер клуба
Разреши в настройках 3000 соединений, это непринципиально.
Дело, еще раз повторяю, в запросах.
3000 запросов вида select 1 выполнятся без проблем и с минимальным потреблением памяти.

Вообще для начала лучше заняться профилированием запросов. Возможно, все проблемы из-за парочки запросов с группировкой/сортировкой без индексов, или какая-нибудь глупость типа select * from table order by rand() limit 1.
 

b0bah1

Новичок
Да и еще такой вопрос, где то читал что не надо закрывать принудительно соединение с базой данных при выполнении скрипта, типа пхп сам его закроет, но с каким то таймаутом, правда ли это, или все же принудительно лучше закрывать?
 

fixxxer

К.О.
Партнер клуба
Идет мент. Смотрит - фонарь стоит, под фонарем лужа, в луже мужик сидит.
- Чё здесь делаешь?
- Да вот, часы потерял. Теперь ищу.
Ну, мент думает - дай помогу. Искал-искал, весь перемазался - нету часов.
- Слушай, мужик. Нету тут никаких часов!
- Да я знаю. Я их вон там, возле забора потерял.
- А ПОЧЕМУ ТЫ ИХ ЗДЕСЬ ИЩЕШЬ???
- А тут светлее.
Забудь про число соединений уже и разбирайся с реальной проблемой.
 

Breeze

goshogun
Команда форума
Партнер клуба
или какая-нибудь глупость типа select * from table order by rand() limit 1
Я на днях опять столкнулся с другим творением программерского гения -- подсчёт баллов через select * where + affected_rows. Каждый запрос гоняет ~50к строк )
А потом слышу "у меня медленно, памяти не хватает, всё падает".
 

antson

Новичок
Партнер клуба
@b0bah1, вот тут я немного не понимаю. обычно в апаче 50 воркеров, в муське тоже 50 конектов .
завесить муську конечно можно, н-р
запрос select sleep(100) from любая таблица после чего на 30 секунде все отваливается не закрыв соединение

т.е. чтобы твоя ситуация воспроизводилась запросы должны тупить больше 30 сек
взаимные блокировки таблиц у тебя случаются ?

ну или по проше вопрос lock используется ?
 

antson

Новичок
Партнер клуба
попутно. Что у тебя в качестве 404 страницы ? случайно не главная сайта ?

Был у моих знакомых в прошлом веке случай. Сайт на вордпрессе. Хостер им претензию о высокой нагрузке ....
В результате оказалось, что на популярном ресурсе в размещенном ими флешбанере. одна из картинок отсутвувовала
и каждые 10 секунд вордпресс отдавал свою главную страницу вместо 404
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
да им доклад на highload надо по этой истории - каждые 10 секунд главную страницу выдавали, хостеру канал забили
 

antson

Новичок
Партнер клуба
@grigori, эта история была приблизительно в 1999 году.
Обычный шаред хостинг с апачем и пхп .
Посещаемость у них была 100-200 человек в сутки.
Заказали они флешовый банер в котором слайдшоу из некоторого кол-ва картинок товаров, показывающихся по кругу.
Разместили его на сайте с нормальной посещаемостью.
И вот не знаю по какой причине. Одну картинку удалили или забыли залить.

В результате у кучи народа крутиться этот флеш и получается, что главная страница сайта дергается как только должна показаться эта картинка.

Главная там была тяжелая с кучей обращений к субд.
Хостер и взвыл нагрузка резко возросла.

Меня знакомые попросили помочь разобраться с чего такие наезды.

Причину я им нашел , а себе взял за правило в начале index.php проверять , а не за статикой ли ко мне полезли .
 

fixxxer

К.О.
Партнер клуба
Хехе. У меня есть привычка класть статику с определенным префиксом, и его обслуживать только как статику, безо всяких try_files. По той же причине :)
 

antson

Новичок
Партнер клуба
@fixxxer, угу. http://static.site.ru или //img.... При чем без поддержки php отличный вариант для юзераплоад.
Но проверь еще свой код на ситуацию, что в тексте новости или описания товара
менеджер ухитрился загнать тег <img src="otsuvuet.png">
http://test.com/controler/method/otsuvuet.png

что у тебя вернеться ? скорее всего нормальная такая текстовая 404 страница ;)
а сколько запросов будет к базе, если пользователь авторизован ?
 

antson

Новичок
Партнер клуба
@fixxxer, ну а что это будет за cms где редактор не сможет в нужное место статьи вставить картинку ? ;)
еще в css можно наложать или js . Мало ли где еще наложают или отконфигурят не так, а все претензии к движку.

и внешние ресурсы вообще не под контролем.
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
гы-гы
Был у моих знакомых в прошлом веке случай. Сайт на вордпрессе.
эта история была приблизительно в 1999 году.
Обычный шаред хостинг с апачем и пхп .
WordPress появился в 2003
PHP4 - в 2000м
а в 1999 был Windows 98 на 486
ты десятилетием не ошибся, случайно?
 
Последнее редактирование:

fixxxer

К.О.
Партнер клуба
ну а что это будет за cms
Я как-то больше по веб-приложениям, чем по контентным сайтам.

не сможет в нужное место статьи вставить картинку
Это может быть визуальный редактор, а картинка указываться в виде внутренней ссылки с garbage collection. Я такое делал по принципу reference count для визуального конструктора а-ля wix. (Описываемой проблемы там, конечно, быть не могло бы в приципе, стораджи на отдельных серверах).
 
Сверху