Форум программистов, компьютерный форум, киберфорум
PHP
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
1 / 1 / 0
Регистрация: 13.11.2013
Сообщений: 130
1

Какие есть способы борьбы с нагрузкой на скрипт

22.11.2014, 15:26. Показов 1224. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте, уважаемые форумчане!

Меня давно интересует вопрос: допустим написал я скрипт, выложил его на свой сайт, и тут к нему захотели обратиться сразу 100 пользователей. Что будет с моим сайтом в этом случае?
Слышал, что сайт должен упасть в этом случае, если не применять так называемое распаралеливание. Так мне сказал один программист, к сожалению, время на обьяснение у него не было...
Обьясните, пожалуйста, новичку, что же такое распаралеливание, и может есть еще какие нибудь способы борьбы с нагрузкой на скрипт?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.11.2014, 15:26
Ответы с готовыми решениями:

Какие способы самые удобные/рациональные способы регистрации ошибок есть?
Задался вопросом, а как регистрировать ошибки? При этом чтобы и выглядело это красиво, и понятно...

Какие есть способы улучшения интерфейса?
Привет, есть какие то способы улучшить интерфейс, кроме как менять цвета контролов?

Какие есть способы подключения к бд в РНР?
Всем привет. Был вчера на собеседовании, меня спросили - Какие есть способы работы с БД в РНР, ну...

Какие есть способы увеличения скорости
Добрый вечер. Найти 3^N. 1<=N<=300000.Максимальное время работы 5 секунд. Тупая ДА с...

7
19 / 19 / 8
Регистрация: 25.11.2013
Сообщений: 122
22.11.2014, 15:28 2
Сервер сам разберется что делать. Если хотите чтобы сайт не упал - берите сервер получше.
0
1 / 1 / 0
Регистрация: 13.11.2013
Сообщений: 130
22.11.2014, 15:37  [ТС] 3
Gouvere, т.е, на этапе написания скрипта можно не предпринимать никаких действий, даже если знаешь, что скрипт будет порядком загружен? Достаточно купить дорогой хостинг?
0
19 / 19 / 8
Регистрация: 25.11.2013
Сообщений: 122
22.11.2014, 15:43 4
alexhd, ну конечно желательно оптимизировать, как сможете. Кешировать данные, например. Но ни про какое распараллеливание не слышал.
1
1 / 1 / 0
Регистрация: 13.11.2013
Сообщений: 130
22.11.2014, 15:48  [ТС] 5
Gouvere, понял)спасибо)
0
88 / 88 / 34
Регистрация: 22.05.2012
Сообщений: 404
23.11.2014, 02:30 6
Цитата Сообщение от alexhd Посмотреть сообщение
так называемое распаралеливание
Не не слышал )
В php на *nix серверах есть возможность управления процессами PCNTL http://php.net/manual/ru/book.pcntl.php
Но применение этого подхода может не только повысить производительность а и свести ее на нет
Итого... Для нормальной работы достаточно грамотного кода + хороший сервер... Но чаще всего, самым узким местом является БД
0
F́́́́́́́ŕ́́́́́́́é́́́ ́ak
259 / 223 / 109
Регистрация: 07.07.2014
Сообщений: 965
23.11.2014, 14:51 7
Лучший ответ Сообщение было отмечено Eva Rosalene как решение

Решение

Не-не-не, давайте-ка все по-честному =)

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

Про фоновые задачи. Вот прилетело от клиента сложный запрос, например перегенерируй превьюшки всех картинок на сайте (как раз та задача, где БД вобщем-то побоку, а вся нагрузка уйдет по-сути на процессор). Мы эту задачу такие запомнили куда-нибудь (по-хорошему сервер очереди, какой-нибудь RabbitMQ или подписки в redis тоже неплохи, но можно и в базу), потом пришел консольный скрипт, забрал задачу, начал делать.

Теперь про распараллеливание - т.к. код для ответа на HTTP-запросы теперь не требует много ресурсов - там нет необходимости что-либо распараллеливать. Это важно, т.к. параллелизм с mod_php или php-fpm может привести к некоторым трудностям (например это может упростить DDoS).

Соответственно для параллельного решения задач в PHP есть несколько разных методов:
1. Самый известный костыль, - используем curl_multi который делает десяток HTTP-запросов к нужному скрипту. Преимущество в том, что работает на любом shared-хостинге, минус в том что это костылище и тянет за собой весь HTTP-стек, что плохо.
2. pcntl_fork, - этот метод создает копию процесса в котором он был вызван (а за счет copy-on-write, - он не так уж и медлителен), минус в том что общаться с дочерними/родительским процессами довольно затруднительно. Я использую для общения между такими процессами stream_socket_pair, но он какой-то неторопливый по каким-то причинам, поэтому если нужно передать много данных из мастер-процесса - стараюсь сохранить их в переменную до fork'а, тогда у всех детей есть эти данные. Впрочем создание нового процесса - операция в все равно довольно затратная.
3. Исконно правильный и православный способ, - pthreads (для расширения потребуется php thread safe, что может оказаться довольно затруднительным - пакет под Debian (одна из наиболее популярных серверных платформ) просто отказывается перекомпилироваться с флагом --enable-maintainer-zts (конфликтует с патчами от Debian), в Debian про это знают, но не шевелятся: приходится либо брать сурс с php.net, либо брать пакет с gotdeb с php5.6 с включенным thread safe: это не очень круто, т.к. такой подход убивает основное преимущество дистрибутива - его стабильность). Собственно говоря это расширение реализует POSIX-треды со всеми присущими им недостатками и преимуществами, оно довольно сыровато, но я уже разбираюсь с ним с целью внедрить у себя в продакшн.

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

-------------------------

И непосредственно ответ на вопрос автора. Если к тебе на сайте обратится сразу 100 пользователей произойдет примерно следующее (может варьироваться в зависимости от используемого ПО и конфигураций, я буду говорить на примере своих серверов):
1. В первую очередь у меня запросы обрабатывается nginx, - 100 запросов для него не проблема, он их прочитает, распарсит и отдаст в php-fpm на обработку.
2. php-fpm в рамках настроенных у себя ограничений начнет параллельно обрабатывать запросы, если у него стоит ограничение на 64 параллельных запроса, - то соответственно 36 запросов будут в очереди ждать, пока какой-либо запрос завершит обработку.
Собственно все. Запросы просто обработаются в порядке очереди и никакого кошмара не произойдет, а т.к. среднее время обработки запроса 0.001 сек - то проблем это не доставит ровным счетом никаких, даже если прилетит тыща одновременных запросов - они довольно сносно обработаются, пользователи скорее всего не заметят особых тормозов в работе ресурса.

--------------------------------

Интересно становится, если на сервер придет сразу 100 тыс или даже миллион запросов: здесь уже начинается масштабирование (по-сути тоже распараллеливание, но на уровне физических или виртуальных серверов), для решения этой задачи используется простая схема: один сервер занимается только приемом запросов, которые потом round-robin'ом передает на сервера которые их обрабатывают (nginx, кстати, с этим прекрасно справляется).

В какой-то момент начинается нехватать одного балансера для того чтобы справится с текущей нагрузкой, тогда на помощь приходит dns round-robin - просто отдаем разные IP-адреса балансеров по принципу round-robin, что тоже проблем не представляет - тот же bind прекрасно выполняет эту задачу.

Резюмируя все вышенаписанное - каких-либо особых сложностей в работе с большой нагрузкой нет, нужно просто изучить какие-то основы и можно смело делать проекты под миллионы пользователей =) Ну и никогда не ползволять серверам быть загруженными выше 50%.
2
F́́́́́́́ŕ́́́́́́́é́́́ ́ak
259 / 223 / 109
Регистрация: 07.07.2014
Сообщений: 965
26.11.2014, 14:32 8
Насчет pthreads походу погорячился, - как-то плохо он завелся, масса сегфолтов на ровном месте и других странных штук. Продолжаю использовать форки =)
0
26.11.2014, 14:32
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.11.2014, 14:32
Помогаю со студенческими работами здесь

Какие есть способы поднятия тиц/пр
Подскажите, какие есть способы поднятия тиц/пр? Только каталоги и морды?

Нестандартные способы конкурентной борьбы.
Столкнулся с неожиданным падением ПР. Нашел возможный источник. Ранее уже сталкивался с подобным....

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

Visual C++, какие есть способы создания GUI?
Стоит вопрос переписать программу с delphi на Visual с++,на зло программа сама сложная. Но в С++ не...

Какие есть способы указать размерность массива?
В общем,какие есть способы указать размерность массива,кроме константы? Уровень знаний стремится к...

Какие есть способы отделения галлия от стекла?
Здравствуйте. При переливании галлия из стеклянной ёмкости на её стенках осталось много металла....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru