Требуется разгрузить сайт на Yii

imsot
Сообщения: 3
Зарегистрирован: 2012.02.08, 18:00

Требуется разгрузить сайт на Yii

Сообщение imsot »

При создании сайта "а _ м _ и _ л _ а точка ru" использовался Yii фреймворк. Однако я в нем в некотором роде разочаровался, так как сайт одновременно выдерживает только 25 активных посетителей. Когда количество посетителей превышает примерно 25-30 человек, нагрузка на процессор на виртуальном хостинге превышает 7%, из-за чего хостер на некоторое время отключает сайт (чтобы из-за меня не страдали другие клиенты хостинг-провайдера).

Говорят что Yii предназначается как раз для высоко-нагруженных сайтов, если это действительно так и если имеется специалист который разберется в причинах вызывающих высокую процессорную нагрузку и сможет её исправить (необходимо выдерживать одновременно 200 посетителей) - то было бы хорошо обратится за помощью к такому специалисту.
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Требуется разгрузить сайт на Yii

Сообщение samdark »

Сразу скажу, что дело не в самом Yii, а в том, как написано приложение. Некторые проекты на Yii выдерживают много большие нагрузки даже на shared-хостинге.
Аватара пользователя
timlar
Сообщения: 1382
Зарегистрирован: 2009.09.19, 17:49
Откуда: Украина, Днепропетровск
Контактная информация:

Re: Требуется разгрузить сайт на Yii

Сообщение timlar »

У нас в проекте одновременно на сайте до 1000 человек, никаких тормозов, никакой особо нагрузки на процессор нет. Проводили небольшое нагрузочное тестирование, 50 коннектов в секунду держал без проблем.
Twitter: @timlar_ua
Аватара пользователя
andy_s
Сообщения: 127
Зарегистрирован: 2012.01.22, 13:15

Re: Требуется разгрузить сайт на Yii

Сообщение andy_s »

Поддерживаю, именно с процессором никогда проблем не было, только с памятью, но это решается ограничением использования ActiveRecord, кэшированием или банальным её увеличением :)
Аватара пользователя
timlar
Сообщения: 1382
Зарегистрирован: 2009.09.19, 17:49
Откуда: Украина, Днепропетровск
Контактная информация:

Re: Требуется разгрузить сайт на Yii

Сообщение timlar »

andy_s писал(а):Поддерживаю, именно с процессором никогда проблем не было, только с памятью, но это решается ограничением использования ActiveRecord, кэшированием или банальным её увеличением :)
Либо принудительным уничтожением переменных с целью освобождения памяти. Частая проблема в долгоживущих скриптах (парсеры, воркеры, демоны и т.д.).
Twitter: @timlar_ua
imsot
Сообщения: 3
Зарегистрирован: 2012.02.08, 18:00

Re: Требуется разгрузить сайт на Yii

Сообщение imsot »

Могут ли поисковые фильтры, реализованные на сайте, быть причиной высоких нагрузок?
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Требуется разгрузить сайт на Yii

Сообщение samdark »

Так гадать смысла нет. Нужно ставить себе да смотреть, в чём там дело.
Аватара пользователя
andy_s
Сообщения: 127
Зарегистрирован: 2012.01.22, 13:15

Re: Требуется разгрузить сайт на Yii

Сообщение andy_s »

Кстати, насчет потребления памяти ActiveRecord'ом.

Скачал базу данных отсюда: http://www.classbase.ru/download (ОКАТО, почти 4000 записей).
Создал тестовое приложение, сгенерировал модель Okato со связями parent и children, дальше в actionIndex() пишу следующее:

Код: Выделить всё

$criteria = new CDbCriteria;
$criteria->limit = 1000;
$models = Okato::model()->with(array('parent', 'children'))->findAll($criteria);
$this->render('index', array(
    'models'=>$models,
)); 
Можно ли было предположить, что всё отработает почти моментально? :) В представлении данные выводятся табличкой в стандартном серо-голубом интерфейсе:

Код: Выделить всё

<table>
    <tr>
        <th>ID</th>
        <th>Название</th>
        <th>Родитель</th>
        <th>Дочерние элементы</th>
    </tr>
    <?php foreach ($models as $model): ?>
    <tr>
        <td><?php echo $model->id; ?></td>
        <td><?php echo $model->name; ?></td>
        <td><?php echo $model->parent ? $model->parent->name : ''; ?></td>
        <td><?php foreach($model->children as $child) echo $child->name.', '; ?></td>
    </tr>
    <?php endforeach; ?>
</table>
Итоговое потребление памяти:
Memory Usage: 14,011 KB
Memory Peak Usage: 14,653 KB

Увеличиваю $criteria->limit до 3000 и получаю следующие цифры:
Memory Usage: 26,084 KB
Memory Peak Usage: 28,815 KB

При этом ограничение в php.ini стоит 64 МБ, так что "с запасом".
Каждая модель имеет родителя и множество дочерних (где-то от 0 до 20).

Я ожидал, что будут какие-то запредельные цифры, может я что-то не так сделал? :D
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Требуется разгрузить сайт на Yii

Сообщение samdark »

Ну, в случае данного проекта упирается как раз не в память, как я понял.
kukuruku
Сообщения: 1318
Зарегистрирован: 2011.02.14, 11:36

Re: Требуется разгрузить сайт на Yii

Сообщение kukuruku »

andy_s писал(а):Кстати, насчет потребления памяти ActiveRecord'ом.

Скачал базу данных отсюда: http://www.classbase.ru/download (ОКАТО, почти 4000 записей).
Создал тестовое приложение, сгенерировал модель Okato со связями parent и children, дальше в actionIndex() пишу следующее:

Код: Выделить всё

$criteria = new CDbCriteria;
$criteria->limit = 1000;
$models = Okato::model()->with(array('parent', 'children'))->findAll($criteria);
$this->render('index', array(
    'models'=>$models,
));
Можно ли было предположить, что всё отработает почти моментально? :) В представлении данные выводятся табличкой в стандартном серо-голубом интерфейсе:

Код: Выделить всё

<table>
    <tr>
        <th>ID</th>
        <th>Название</th>
        <th>Родитель</th>
        <th>Дочерние элементы</th>
    </tr>
    <?php foreach ($models as $model): ?>
    <tr>
        <td><?php echo $model->id; ?></td>
        <td><?php echo $model->name; ?></td>
        <td><?php echo $model->parent ? $model->parent->name : ''; ?></td>
        <td><?php foreach($model->children as $child) echo $child->name.', '; ?></td>
    </tr>
    <?php endforeach; ?>
</table>
Итоговое потребление памяти:
Memory Usage: 14,011 KB
Memory Peak Usage: 14,653 KB

Увеличиваю $criteria->limit до 3000 и получаю следующие цифры:
Memory Usage: 26,084 KB
Memory Peak Usage: 28,815 KB

При этом ограничение в php.ini стоит 64 МБ, так что "с запасом".
Каждая модель имеет родителя и множество дочерних (где-то от 0 до 20).

Я ожидал, что будут какие-то запредельные цифры, может я что-то не так сделал? :D
15 и 25 мегабайт?
разве это мало? и это на 1 запрос, а если 10 запросов одновременно?
Аватара пользователя
andy_s
Сообщения: 127
Зарегистрирован: 2012.01.22, 13:15

Re: Требуется разгрузить сайт на Yii

Сообщение andy_s »

kukuruku писал(а):15 и 25 мегабайт?
разве это мало? и это на 1 запрос, а если 10 запросов одновременно?
Ну тут речь о единоразовой операции, а не о том, что где-то на сайте придется выводить 3000 записей.

Вот если бы ActiveRecord еще умел возвращать что-то вроде CDbDataReader (хотя бы в случае без использования with), создающий объекты по мере необходимости (например, при проходе этого массива из 3000 элементов в цикле), тогда бы потребление памяти точно уменьшилось на несколько мегабайт. Навеяно прочтением статьи на хабре :) Сорри, что разговор немного не по теме пошел.
R3D3
Сообщения: 352
Зарегистрирован: 2010.04.11, 14:52

Re: Требуется разгрузить сайт на Yii

Сообщение R3D3 »

imsot писал(а):нагрузка на процессор на виртуальном хостинге превышает 7%, из-за чего хостер на некоторое время отключает сайт.
необходимо выдерживать одновременно 200 посетителей
Без исходников ничего определенного сказать нельзя, но скорее всего в коде есть "плохо написанные" места, в которых проводятся ресурсоемкие вычислительные операции, что и нагружает процессор. Тем не менее на мой взгляд, даже при хорошо написанном коде 200 одновременных посетителей для простого хостинга это перебор.
Yii Jabber Conference: yii@conference.jabber.ru
Аватара пользователя
art0s
Сообщения: 18
Зарегистрирован: 2011.08.30, 07:34

Re: Требуется разгрузить сайт на Yii

Сообщение art0s »

У меня была подобная проблема, я уже писал в курилке - скрипт делал вычисления с числами с плавающей запятой итерационным методом.
Он и подвешивал и само приложение и процессор.
Была переписана функция расчета на С - и все сразу стало нормально.
В nginx+php-fpm есть параметры request_slowlog_timeout и slowlog,
можно с ними поиграться и попробовать вычислить "тормозящие" скрипты...
А там уже оптимизировать "требуха" данных макросов...


Вполне может сложиться и так что - база у вас не оптимальной структуры, и yii тут тогда вообще не при чем...
Jampire
Сообщения: 207
Зарегистрирован: 2011.01.28, 11:45
Откуда: Гомель
Контактная информация:

Re: Требуется разгрузить сайт на Yii

Сообщение Jampire »

kukuruku писал(а): разве это мало? и это на 1 запрос, а если 10 запросов одновременно?
Для этого и придумано кеширование.
Изображение
Человек, говорящий, что это невозможно сделать, не должен мешать тому, кто это делает.
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Требуется разгрузить сайт на Yii

Сообщение samdark »

Так, мне стало жутко интересно, что же там внутри. Взялся посмотреть.
kukuruku
Сообщения: 1318
Зарегистрирован: 2011.02.14, 11:36

Re: Требуется разгрузить сайт на Yii

Сообщение kukuruku »

ждем отчет
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Требуется разгрузить сайт на Yii

Сообщение samdark »

Это только с разрешения заказчика. Одно скажу: возможно, конечно, что разработчик просто недоделал, но кое-где хочется поотрывать руки. Особенно за то, что с нормальным уровнем error_reporting вообще не работает.
kukuruku
Сообщения: 1318
Зарегистрирован: 2011.02.14, 11:36

Re: Требуется разгрузить сайт на Yii

Сообщение kukuruku »

так код сайта выкладывать не нужно, а только описать в чем косяки с памятью и как правильно делать
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Требуется разгрузить сайт на Yii

Сообщение samdark »

Косяки не с памятью, что было ясно с первого же поста. Пока глобальных косяка два:
1. Разрабатывали с пониженным error_reporting (это особого отношения к делу не имеет).
2. Влили на хостинг в отладочном режиме и без какой-либо настройки, да ещё и с профайлингом на всю катушку.

С ними стало легче, но так как ресурсы на хостинге ужаты до неприличного, надо лезть ещё и в код.
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Требуется разгрузить сайт на Yii

Сообщение samdark »

- В view, которые вызываются в цикле кучу раз дёргался asset manager.
- access control вызывается только за тем, чтобы всё разрешить.
- Страшное увлечение виджетами. Вложенность до пяти на строку грида. Строк на главной 25…
Ответить