Вернуться   Форум SAPE.RU > Общие вопросы > Разработка и сопровождение сайтов

-->
Ответ
 
Опции темы
Старый 10.01.2011, 18:57   #1
Эксперт
 
Регистрация: 05.03.2008
Сообщений: 1,095
Вес репутации: 249
boric - прекрасное будущееboric - прекрасное будущееboric - прекрасное будущееboric - прекрасное будущееboric - прекрасное будущееboric - прекрасное будущееboric - прекрасное будущееboric - прекрасное будущееboric - прекрасное будущееboric - прекрасное будущееboric - прекрасное будущее
По умолчанию Как ограничить нагрузку на сайт?

Глянул в top, пишет нагрузку что-то типа: 23, 22, 21.
Сайт притормаживает.
Посмотрел логи: пара чел (т.е. с пары IP) скачивают все страницы моего сайта в несколько потоков.

В принципе я догадываюсь, в чем дело: кто-то написал и выложил в инете API к моему сервису. Там и так около сотни посетителей одновременно всегда висит (около 1000 посетителей в час приходит), а тут еще тысячи страниц в несколько потоков без задержек скачиваются.

Банить за это дело я не хочу (пусть качают), но вот когда сразу в несколько потоков качают, надо как-то ограничить. Как яндекс капчу "вы робот" делать тоже не хочу делать. Как быть?

Пока думаю над такими вариантами:

1) Вставлять небольшую задержку для качальщиков. Но как без записи в БД из потока определить, что в несколько потоков и непрерывно открываются страницы?

2) Включить в движке кеширование. Без кеширования движок (он на джанго) по производительности раза в два быстрее Джумлы 1.5 (с парой модулей), делается 10-15 запросов к БД на страницу. Если включить кеширование, то будет 2-3 коротких запросов к БД + запросы модулей, в которых будет отключено кеширование (в движке можно это гибко настраивать). Но этот вариант я в любом случае задействую, однако боюсь его не хватит.

3) Включить обратный кеширующий прокси в апаче, но такое кеширование крайне неудобно.

4) Предоставить свое собственное API. Но его еще надо продумать и разработать. Также архив всех страниц для скачки может быть предоставить?

5) Фронтэндом поставитьь ngix. Но это врядли поможет, ибо узкое горлышко в скриптах и БД.

В общем основной вопрос - как из скрипта определить, что с данного IP идет большая активность?

Сервер у меня выделенный Феном 2-х ядерный 3 ГГц, 4 Гига оперативки. А посещаемость все растет и растет, а я еще один проект запустил... В общем надо уже меры принимать к качальщикам всех страниц скопом, т.к. без них нагрузка <1.

Последний раз редактировалось boric; 10.01.2011 в 19:06.
boric вне форума   Ответить с цитированием
Старый 10.01.2011, 19:17   #2
Специалист
 
Регистрация: 28.07.2009
Сообщений: 240
Вес репутации: 188
poiuty - луч света в тёмном царствеpoiuty - луч света в тёмном царствеpoiuty - луч света в тёмном царствеpoiuty - луч света в тёмном царствеpoiuty - луч света в тёмном царстве
Отправить сообщение для poiuty с помощью ICQ
По умолчанию

Можно так:
Цитата:
Если непрерывно открываются страницы
http://sysoev.ru/nginx/docs/http/ngx...tml#limit_conn
limit_conn.
Если много коннектов с 1 ИП или ему вывести предупреждение - мол друг подожди чуть чуть

Цитата:
В общем основной вопрос - как из скрипта определить, что с данного IP идет большая активность?
Кстати если включаете limit_conn - в эрор лог nginx будет идти запись с ip`ом.Оттуда можете выдирать их(из лога) и делать с ними, что душе угодно.

Добавлено через 7 минут
Так же желательно всю статику отдавать nginx`ом - так быстрее и жрет ресурсов меньше.

Последний раз редактировалось poiuty; 10.01.2011 в 19:21. Причина: Добавлено сообщение
poiuty вне форума   Ответить с цитированием
Старый 10.01.2011, 19:43   #3
Специалист
 
Регистрация: 25.06.2009
Адрес: Красноярск
Сообщений: 443
Вес репутации: 201
BIOHAZARD - за этого человека можно гордитсяBIOHAZARD - за этого человека можно гордитсяBIOHAZARD - за этого человека можно гордитсяBIOHAZARD - за этого человека можно гордитсяBIOHAZARD - за этого человека можно гордитсяBIOHAZARD - за этого человека можно гордитсяBIOHAZARD - за этого человека можно гордитсяBIOHAZARD - за этого человека можно гордитсяBIOHAZARD - за этого человека можно гордится
Отправить сообщение для BIOHAZARD с помощью ICQ
По умолчанию

к индейцу тоже какой-то модуль был, ограничивающий скорость скачки с одного ip
__________________
Решил стать бессмертным. Пока получается.
Не получается воткнуть код на сайт? Могу помочь. ася: 858-368. Рефералам бесплатно
BIOHAZARD вне форума   Ответить с цитированием
Старый 10.01.2011, 20:03   #4
Специалист
 
Регистрация: 28.07.2009
Сообщений: 240
Вес репутации: 188
poiuty - луч света в тёмном царствеpoiuty - луч света в тёмном царствеpoiuty - луч света в тёмном царствеpoiuty - луч света в тёмном царствеpoiuty - луч света в тёмном царстве
Отправить сообщение для poiuty с помощью ICQ
По умолчанию

Цитата:
Фронтэндом поставитьь ngix.
Если ТС будет ставить nginx, то лучше им "рубить" все.
poiuty вне форума   Ответить с цитированием
Старый 10.01.2011, 20:58   #5
Эксперт
 
Регистрация: 05.03.2008
Сообщений: 1,095
Вес репутации: 249
boric - прекрасное будущееboric - прекрасное будущееboric - прекрасное будущееboric - прекрасное будущееboric - прекрасное будущееboric - прекрасное будущееboric - прекрасное будущееboric - прекрасное будущееboric - прекрасное будущееboric - прекрасное будущееboric - прекрасное будущее
По умолчанию

poiuty, Спасибо за ссылку, но мне не надо обрубать качальщиков, мне хочется просто притормозить их активность. Указанный там механизм я хочу реализовать в самом скрипте.

Пока такие идеи:

В оперативной памяти будет таблица mysql, в которой будут фиксироваться ip и временная метка посетителей (например: ip, time).

Далее в начале главного скрипта проверять наличие этой талицы (если ее нет, то создать), записать туда (ip, time), сделать выборку по этому ip за последние например 1000 милисекунд, проанализировать, удалить из таблицы все записи старее 1000 мс, выставить задержку (зависящую от активности, например 1 сек) и продолжить выполнение скрипта.

Что думаете? Вроде быстро должно все отрабатываться и посетитель не будет блокироваться (как в яндексе - "ты робот"), а будет лишь притормаживаться.
boric вне форума   Ответить с цитированием
Старый 10.01.2011, 22:12   #6
Специалист
 
Регистрация: 28.07.2009
Сообщений: 240
Вес репутации: 188
poiuty - луч света в тёмном царствеpoiuty - луч света в тёмном царствеpoiuty - луч света в тёмном царствеpoiuty - луч света в тёмном царствеpoiuty - луч света в тёмном царстве
Отправить сообщение для poiuty с помощью ICQ
По умолчанию

Цитата:
Сообщение от boric Посмотреть сообщение
poiuty, Спасибо за ссылку, но мне не надо обрубать качальщиков, мне хочется просто притормозить их активность. Указанный там механизм я хочу реализовать в самом скрипте.



Далее в начале главного скрипта проверять наличие этой талицы (если ее нет, то создать), записать туда (ip, time), сделать выборку по этому ip за последние например 1000 милисекунд, проанализировать, удалить из таблицы все записи старее 1000 мс, выставить задержку (зависящую от активности, например 1 сек) и продолжить выполнение скрипта.
Ну так:
Цитата:
Директива задаёт максимальное число одновременных соединений для одной сессии. При превышении этого числа запрос завершается кодом "Service unavailable" (503).
Сделайте error_page 503 /путь/503.html;
И далее на 503.html сделайте таймер -> прошел таймер -> перекинули пользователя снова на сайт.

Добавлено через 3 минуты
В противном случае вы получите тучу селектов и инсертов.Так как каждый ип будет фиксироваться.
Т.е. человек зашел на сайт - проверяем ип.Обновил страницу - проверяем ип.
100 человек за секунду обновили ваш сайт ~ 100 запросов в базу.Айс.

Последний раз редактировалось poiuty; 10.01.2011 в 22:12. Причина: Добавлено сообщение
poiuty вне форума   Ответить с цитированием
Старый 10.01.2011, 22:21   #7
Эксперт
 
Регистрация: 05.03.2008
Сообщений: 1,095
Вес репутации: 249
boric - прекрасное будущееboric - прекрасное будущееboric - прекрасное будущееboric - прекрасное будущееboric - прекрасное будущееboric - прекрасное будущееboric - прекрасное будущееboric - прекрасное будущееboric - прекрасное будущееboric - прекрасное будущееboric - прекрасное будущее
По умолчанию

poiuty,
Цитата:
В противном случае вы получите тучу селектов и инсертов.Так как каждый ип будет фиксироваться.
Т.е. человек зашел на сайт - проверяем ип.Обновил страницу - проверяем ип.
100 человек за секунду обновили ваш сайт ~ 100 запросов в базу.Айс.
Но таблица будет во-первых короткой (т.к. данные старее нескольких секунд будут удаляться), а во-вторых эта таблица будет находиться в оперативной памяти, т.е. должна работать очень быстро, ведь записи на диск не будет.
boric вне форума   Ответить с цитированием
Старый 10.01.2011, 22:23   #8
Мне повезёт!
 
Аватар для Alexey
 
Регистрация: 05.05.2007
Сообщений: 1,076
Вес репутации: 276
Alexey - прекрасное будущееAlexey - прекрасное будущееAlexey - прекрасное будущееAlexey - прекрасное будущееAlexey - прекрасное будущееAlexey - прекрасное будущееAlexey - прекрасное будущееAlexey - прекрасное будущееAlexey - прекрасное будущееAlexey - прекрасное будущееAlexey - прекрасное будущее
По умолчанию

boric, курить в сторону nginx, limit и limit_req.
__________________
Everything will be great in the end.
If it's not great, it's not the end.
Alexey вне форума   Ответить с цитированием
Старый 10.01.2011, 22:43   #9
Специалист
 
Регистрация: 28.07.2009
Сообщений: 240
Вес репутации: 188
poiuty - луч света в тёмном царствеpoiuty - луч света в тёмном царствеpoiuty - луч света в тёмном царствеpoiuty - луч света в тёмном царствеpoiuty - луч света в тёмном царстве
Отправить сообщение для poiuty с помощью ICQ
По умолчанию

Цитата:
Сообщение от boric Посмотреть сообщение
poiuty,

Но таблица будет во-первых короткой (т.к. данные старее нескольких секунд будут удаляться), а во-вторых эта таблица будет находиться в оперативной памяти, т.е. должна работать очень быстро, ведь записи на диск не будет.
Делайте, как вам удобнее.
poiuty вне форума   Ответить с цитированием
Старый 10.01.2011, 22:51   #10
Эксперт
 
Регистрация: 05.03.2008
Сообщений: 1,095
Вес репутации: 249
boric - прекрасное будущееboric - прекрасное будущееboric - прекрасное будущееboric - прекрасное будущееboric - прекрасное будущееboric - прекрасное будущееboric - прекрасное будущееboric - прекрасное будущееboric - прекрасное будущееboric - прекрасное будущееboric - прекрасное будущее
По умолчанию

Alexey,
Цитата:
курить в сторону nginx, limit и limit_req.
Но там, как я понимаю, просто 503-я ошибка выдаваться будет по превышению лимита, а мне надо лишь ограничить частоту обращения к страницам. Ставить таймер в 503.html странице мне кажется усложненным вариантом по сравнению с задержкой прямо в скрипте. Правда скрипт во время задержки будет память отъедать, но таких активистов мало - ничего страшного в плане памяти не произойдет, а вот процессорные ресурсы можно сильно разбавить. Также я хочу более гибко управлять - возможно притормаживать даже в одном потоке обращения. Также не думаю, что работа с таблицей в оперативной памяти сильно будет медленней, чем работа ngix с файлами сессий.
boric вне форума   Ответить с цитированием
Ответ


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как уменьшить нагрузку на хостинг Kiparis Вопросы по работе системы 18 06.10.2010 10:48
Как определить, какую нагрузку на сервер создаёт сайт? Штрафная РОТА Общие вопросы оптимизации 14 05.05.2010 16:26
Как уменьшить нагрузку на сайт? kamar87 Вопросы по работе системы 6 08.11.2009 14:17
Как уменьшить нагрузку на сервак? двиг Джумла. Maniak Разработка и сопровождение сайтов 11 23.04.2009 17:45
Sape создает нагрузку на сервер websar Вопросы по работе системы 20 28.08.2008 20:05


Часовой пояс GMT +3, время: 02:25.