Оптимизация сайта с большой базой на виртуальном хостинге

Тема в разделе "Администрирование серверов", создана пользователем Tadasi, 26 янв 2010.

Статус темы:
Закрыта.
Модераторы: mefish, stooper
  1. Tadasi

    Tadasi Постоялец

    Регистр.:
    6 май 2008
    Сообщения:
    145
    Симпатии:
    6
    Есть у меня сайт варез тематики на DLE 7.5 с базой новостей в 90 тыщ и размером базы в 600 Метров.
    Сайт, несмотря на посещаемость всего 400 человек в сутки создает огромную нагрузку на сервер (как мне писал хостер большая нагрузка на мускул).
    Хостинг тариф у меня виртуальный хостинг от _m-hoster с лимитом нагрузки на сервер в 25% - ибо такая пиковая нагрузка бывает.
    Сегодня решил по-удалять с сайта кучу дубликатов новостей - во-первых новость удаляется очень долго (порядка 5 секунд) и во-вторых, когда я не дожидаясь завершения подтверждения о удалении новости решил удалить ещё с пяток другой новостей - через некоторое время вылетела ошибка о блокировке доступа и пришло сообщения от хостера об огромной нагрузки моим сайтом, вот скрин:

    [​IMG]

    Скажите могу ли я как-то оптимизировать сайт, ибо нагрузка просто нереальная!?
    p.s. существенное увеличение нагрузки я стал наблюдать где-то после того как моя база мускул стала иметь более 50 тыщ новостей. Хотя мож и не только в этом...???
     
  2. Juri

    Juri

    Заблокирован
    Регистр.:
    5 окт 2007
    Сообщения:
    1.068
    Симпатии:
    197
    для начала уберите с сайта поиск... включите кеширование на сайте.
    попросите хостера что б предоставил логи долгих запросов... хотя готов поспорить кеширование решит проблему
     
  3. Tadasi

    Tadasi Постоялец

    Регистр.:
    6 май 2008
    Сообщения:
    145
    Симпатии:
    6
    вот моя конфигурация:

    [​IMG]

    как видно кеш включен... или ещё где включить?
     
  4. Juri

    Juri

    Заблокирован
    Регистр.:
    5 окт 2007
    Сообщения:
    1.068
    Симпатии:
    197
    хм странно, а тогда вы бы не могли в index.php в предпоследней строчке
    вот это
    GzipOut ();
    заменить на вот это
    GzipOut (1);
    это режим отладки в исходном коде будет показано сколько времени ушло на запросы в бд на генерацию странички и колличество запросов. Это поможет посмотреть проблемные места
     
  5. Tadasi

    Tadasi Постоялец

    Регистр.:
    6 май 2008
    Сообщения:
    145
    Симпатии:
    6
    gzip сжатие я поставил после первого сообщения, сори)
    ...и вот что написал мне хостер на вопрос нагрузки:

    очень много запросов вида:

    | 58118 | tadas105_kinowa | localhost | tadas105_kinowara | Query | 10 | converting HEAP to MyISAM | SELECT id, title, date, alt_name FROM dle_post WHERE approve='1' ORDER BY RAND() LIMIT 0, 10 |
    | 58119 | tadas105_kinowa | localhost | tadas105_kinowara | Query | 10 | converting HEAP to MyISAM | SELECT id, title, date, alt_name FROM dle_post WHERE approve='1' ORDER BY RAND() LIMIT 0, 10 |
    | 58121 | tadas105_kinowa | localhost | tadas105_kinowara | Query | 10 | Copying to tmp table on disk | SELECT id, title, date, alt_name FROM dle_post WHERE approve='1' ORDER BY RAND() LIMIT 0, 10 |
    | 58122 | tadas105_kinowa | localhost | tadas105_kinowara | Query | 10 | converting HEAP to MyISAM | SELECT id, title, date, alt_name FROM dle_post WHERE approve='1' ORDER BY RAND() LIMIT 0, 10 |
    | 58140 | tadas105_kinowa | localhost | tadas105_kinowara | Query | 10 | converting HEAP to MyISAM | SELECT id, title, date, alt_name FROM dle_post WHERE approve='1' ORDER BY RAND() LIMIT 0, 10 |
    | 58153 | tadas105_kinowa | localhost | tadas105_kinowara | Query | 10 | Copying to tmp table on disk | SELECT id, title, date, alt_name FROM dle_post WHERE approve='1' ORDER BY RAND() LIMIT 0, 10 |
    | 58165 | tadas105_kinowa | localhost | tadas105_kinowara | Query | 5 | Opening tables | SELECT DATE_FORMAT(date,'%b %Y') AS m_date, COUNT(*) AS cnt FROM dle_post WHERE approve AND date < ' |
    | 58214 | tadas105_kinowa | localhost | tadas105_kinowara | Query | 10 | converting HEAP to MyISAM | SELECT id, title, date, alt_name FROM dle_post WHERE approve='1' ORDER BY RAND() LIMIT 0, 10 |
    | 58118 | tadas105_kinowa | localhost | tadas105_kinowara | Query | 11 | converting HEAP to MyISAM | SELECT id, title, date, alt_name FROM dle_post WHERE approve='1' ORDER BY RAND() LIMIT 0, 10 |
    | 58119 | tadas105_kinowa | localhost | tadas105_kinowara | Query | 11 | converting HEAP to MyISAM | SELECT id, title, date, alt_name FROM dle_post WHERE approve='1' ORDER BY RAND() LIMIT 0, 10 |
    | 58121 | tadas105_kinowa | localhost | tadas105_kinowara | Query | 11 | Copying to tmp table on disk | SELECT id, title, date, alt_name FROM dle_post WHERE approve='1' ORDER BY RAND() LIMIT 0, 10 |
    | 58122 | tadas105_kinowa | localhost | tadas105_kinowara | Query | 11 | converting HEAP to MyISAM | SELECT id, title, date, alt_name FROM dle_post WHERE approve='1' ORDER BY RAND() LIMIT 0, 10 |
    | 58140 | tadas105_kinowa | localhost | tadas105_kinowara | Query | 11 | converting HEAP to MyISAM | SELECT id, title, date, alt_name FROM dle_post WHERE approve='1' ORDER BY RAND() LIMIT 0, 10 |
    | 58153 | tadas105_kinowa | localhost | tadas105_kinowara | Query | 11 | Copying to tmp table on disk | SELECT id, title, date, alt_name FROM dle_post WHERE approve='1' ORDER BY RAND() LIMIT 0, 10 |
    | 58165 | tadas105_kinowa | localhost | tadas105_kinowara | Query | 6 | Opening tables | SELECT DATE_FORMAT(date,'%b %Y') AS m_date, COUNT(*) AS cnt FROM dle_post WHERE approve AND date < ' |
    | 58214 | tadas105_kinowa | localhost | tadas105_kinowara | Query | 11 | converting HEAP to MyISAM | SELECT id, title, date, alt_name FROM dle_post WHERE approve='1' ORDER BY RAND() LIMIT 0, 10 |
    | 58288 | tadas105_kinowa | localhost | tadas105_kinowara | Query | 11 | converting HEAP to MyISAM | SELECT id, title, date, alt_name FROM dle_post WHERE approve='1' ORDER BY RAND() LIMIT 0, 10 |

    Связанно ли это с gzip? может нафих отключить его, вобще зачем он?

    p.s. в поисках решения наткнулся на следующую страницу _sysadmins.ru/topic221577.html но честно говоря толком не понял решение и вообще можно ли там что-то полезное для меня найти?

    Добавлено через 42 минуты
    И ещё, как я и говорил у меня проблемы с удалением новостей, вот к примеру что пхпмайадмин пишет при удалении:

    Удалено строк: 254. ( запрос занял 70.6683 сек. )
    DELETE FROM dle_post WHERE autor = 'geer13'

    70 секунд!!!! - да это ужас!
     
  6. Juri

    Juri

    Заблокирован
    Регистр.:
    5 окт 2007
    Сообщения:
    1.068
    Симпатии:
    197
    то что я вас попросил сделать это не гзип, это что то типа режима отладки в исходном кодебудет выводится вот такая вот статистика

    <!-- Время выполнения скрипта 0.03558 секунд -->
    <!-- Время затраченное на компиляцию шаблонов 0.00361 секунд -->
    <!-- Время затраченное на выполнение MySQL запросов: 0.00828 секунд-->
    <!-- Общее количество MySQL запросов 6 -->

    что поможет определить проблемные страницы. так что именно в исходном коде index.php поставьте 1

    а то что у вас в phpmyadmine удаление заняло столько времени то это в принципе нормально на таблице с такими объемами при условии что выборка идет по полю варчар.



    вот эти запросы
    | 58121 | tadas105_kinowa | localhost | tadas105_kinowara | Query | 11 | Copying to tmp table on disk | SELECT id, title, date, alt_name FROM dle_post WHERE approve='1' ORDER BY RAND() LIMIT 0, 10 |

    создает блок случайные 10 новостей... так что подумайте нужен ли он?
     
  7. Tadasi

    Tadasi Постоялец

    Регистр.:
    6 май 2008
    Сообщения:
    145
    Симпатии:
    6
    как мне выйти в режим отладки? это какой-то отдельный скрипт или в самом дле такое есть?
     
  8. Juri

    Juri

    Заблокирован
    Регистр.:
    5 окт 2007
    Сообщения:
    1.068
    Симпатии:
    197
    зайдите на свой сайт по фтп, откройте index.php для редактирования

    увидите что то такое

    PHP:
    <?php
    /*
    =====================================================
     DataLife Engine Nulled by M.I.D-Team
    -----------------------------------------------------
     http://www.mid-team.ws/
    -----------------------------------------------------
     Copyright (c) 2004,2009 SoftNews Media Group
    =====================================================
     Данный код защищен авторскими правами
    =====================================================
     Файл: index.php
    -----------------------------------------------------
     Назначение: Главная страница
    =====================================================
    */
    @session_start ();
    @
    ob_start ();
    @
    ob_implicit_flush );

    @
    error_reporting E_ALL E_NOTICE );
    @
    ini_set 'display_errors'true );
    @
    ini_set 'html_errors'false );
    @
    ini_set 'error_reporting'E_ALL E_NOTICE );

    define 'DATALIFEENGINE'true );

    $member_id FALSE;
    $is_logged FALSE;

    define 'ROOT_DIR'dirname __FILE__ ) );
    define 'ENGINE_DIR'ROOT_DIR '/engine' );

    require_once 
    ROOT_DIR '/engine/init.php';

    if (
    clean_url $_SERVER['HTTP_HOST'] ) != clean_url $config['http_home_url'] )) {
        
        
    $replace_url = array ();
        
    $replace_url[0] = clean_url $config['http_home_url'] );
        
    $replace_url[1] = clean_url $_SERVER['HTTP_HOST'] );

    } else
        
    $replace_url false;

    $tpl->load_template 'main.tpl' );

    $tpl->set '{calendar}'$tpl->result['calendar'] );
    $tpl->set '{archives}'$tpl->result['archive'] );
    $tpl->set '{tags}'$tpl->result['tags_cloud'] );
    $tpl->set '{vote}'$tpl->result['vote'] );
    $tpl->set '{topnews}'$topnews );
    $tpl->set '{login}'$login_panel );
    $tpl->set '{info}'"<span id='dle-info'>" $tpl->result['info'] . "</span>" );
    $tpl->set '{speedbar}'$tpl->result['speedbar'] );

    if (
    $config['allow_skin_change'] == "yes"$tpl->set '{changeskin}'ChangeSkin ROOT_DIR '/templates'$config['skin'] ) );

    if (
    count $banners ) and $config['allow_banner']) {
        
        foreach ( 
    $banners as $name => $value ) {
            
    $tpl->copy_template str_replace "{banner_" $name "}"$value$tpl->copy_template );
        }

    }

    $tpl->set_block "'{banner_(.*?)}'si""" );

    if (
    count $informers ) and $config['rss_informer']) {
        foreach ( 
    $informers as $name => $value ) {
            
    $tpl->copy_template str_replace "{inform_" $name "}"$value$tpl->copy_template );
        }
    }

    if (
    $do == "" and ! $subaction and $year$do "date";
    elseif (
    $do == "" and $catalog$do "catalog";
    elseif (
    $do == ""$do $subaction;

    if (
    $allow_active_news and $config['allow_change_sort'] and ! $config['ajax']) {
        
        
    $tpl->set '[sort]'"" );
        
    $tpl->set '{sort}'news_sort $do ) );
        
    $tpl->set '[/sort]'"" );

    } else {
        
        
    $tpl->set_block "'\\[sort\\](.*?)\\[/sort\\]'si""" );

    }

    if (
    strpos $tpl->copy_template"[aviable=" ) !== false) {
        
    $tpl->copy_template preg_replace "#\\[aviable=(.+?)\\](.*?)\\[/aviable\\]#ies""check_module('\\1', '\\2', '{$do}')"$tpl->copy_template );
    }

    if (
    strpos $tpl->copy_template"[not-aviable=" ) !== false) {
        
    $tpl->copy_template preg_replace "#\\[not-aviable=(.+?)\\](.*?)\\[/not-aviable\\]#ies""check_module('\\1', '\\2', '{$do}', false)"$tpl->copy_template );
    }

    if (
    strpos $tpl->copy_template"[not-group=" ) !== false) {
        
    $tpl->copy_template preg_replace "#\\[not-group=(.+?)\\](.*?)\\[/not-group\\]#ies""check_group('\\1', '\\2', false)"$tpl->copy_template );
    }

    if (
    strpos $tpl->copy_template"[group=" ) !== false) {
        
    $tpl->copy_template preg_replace "#\\[group=(.+?)\\](.*?)\\[/group\\]#ies""check_group('\\1', '\\2')"$tpl->copy_template );
    }

    if (
    strpos $tpl->copy_template"[category=" ) !== false) {
        
    $tpl->copy_template preg_replace "#\\[category=(.+?)\\](.*?)\\[/category\\]#ies""check_category('\\1', '\\2', '{$category_id}')"$tpl->copy_template );
    }

    if (
    strpos $tpl->copy_template"[not-category=" ) !== false) {
        
    $tpl->copy_template preg_replace "#\\[not-category=(.+?)\\](.*?)\\[/not-category\\]#ies""check_category('\\1', '\\2', '{$category_id}', false)"$tpl->copy_template );
    }

    if (
    strpos $tpl->copy_template"{custom" ) !== false) {
        
    $tpl->copy_template preg_replace "#\\{custom category=['\"](.+?)['\"] template=['\"](.+?)['\"] aviable=['\"](.+?)['\"] from=['\"](.+?)['\"] limit=['\"](.+?)['\"] cache=['\"](.+?)['\"]\\}#ies""custom_print('\\1', '\\2', '\\3', '\\4', '\\5', '\\6', '{$do}')"$tpl->copy_template );
    }

    $config['http_home_url'] = explode "index.php"strtolower $_SERVER['PHP_SELF'] ) );
    $config['http_home_url'] = reset $config['http_home_url'] );

    if (! 
    $user_group[$member_id['user_group']]['allow_admin']) $config['admin_path'] = "";

    $ajax .= <<<HTML
    <script language="javascript" type="text/javascript">
    <!--
    var dle_root       = '
    {$config['http_home_url']}';
    var dle_admin      = '
    {$config['admin_path']}';
    var dle_login_hash = '
    {$dle_login_hash}';
    var dle_skin       = '
    {$config['skin']}';
    var dle_wysiwyg    = '
    {$config['allow_comments_wysiwyg']}';
    var quick_wysiwyg  = '
    {$config['allow_quick_wysiwyg']}';
    var menu_short     = '
    {$lang['menu_short']}';
    var menu_full      = '
    {$lang['menu_full']}';
    var menu_profile   = '
    {$lang['menu_profile']}';
    var menu_fnews     = '
    {$lang['menu_fnews']}';
    var menu_fcomments = '
    {$lang['menu_fcomments']}';
    var menu_send      = '
    {$lang['menu_send']}';
    var menu_uedit     = '
    {$lang['menu_uedit']}';
    var dle_req_field  = '
    {$lang['comm_req_f']}';
    var dle_del_agree  = '
    {$lang['news_delcom']}';
    var dle_del_news   = '
    {$lang['news_delnews']}';\n
    HTML;

    if (
    $user_group[$member_id['user_group']]['allow_all_edit']) {
        
        
    $ajax .= <<<HTML
    var allow_dle_delete_news   = true;\n
    HTML;

    } else {
        
        
    $ajax .= <<<HTML
    var dle_login_hash = '';
    var allow_dle_delete_news   = false;\n
    HTML;

    }

    $ajax .= <<<HTML
    //-->
    </script>
    <script type="text/javascript" src="
    {$config['http_home_url']}engine/ajax/menu.js"></script>
    <script type="text/javascript" src="
    {$config['http_home_url']}engine/ajax/dle_ajax.js"></script>
    <div id="loading-layer" style="display:none;font-family: Verdana;font-size: 11px;width:200px;height:50px;background:#FFF;padding:10px;text-align:center;border:1px solid #000"><div style="font-weight:bold" id="loading-layer-text">
    {$lang['ajax_info']}</div><br /><img src="{$config['http_home_url']}engine/ajax/loading.gif"  border="0" alt="" /></div>
    <div id="busy_layer" style="visibility: hidden; display: block; position: absolute; left: 0px; top: 0px; width: 100%; height: 100%; background-color: gray; opacity: 0.1; -ms-filter: 'progid:DXImageTransform.Microsoft.Alpha(Opacity=10)'; filter:progid:DXImageTransform.Microsoft.Alpha(opacity=10); "></div>
    <script type="text/javascript" src="
    {$config['http_home_url']}engine/ajax/js_edit.js"></script>
    HTML;

    if (
    $allow_comments_ajax AND ($config['allow_comments_wysiwyg'] == "yes" OR $config['allow_quick_wysiwyg'])) $ajax .= <<<HTML

    <script type="text/javascript" src="
    {$config['http_home_url']}engine/editor/jscripts/tiny_mce/tiny_mce.js"></script>

    HTML;

    if (
    strpos $tpl->result['content'], "hs.expand" ) !== false or strpos $tpl->copy_template"hs.expand" ) !== false or $config['ajax'] or $pm_alert != "") {
        
        if (
    $pm_alert != ""$hs_prefix "-html";
        else 
    $hs_prefix "";
        
        
    $ajax .= <<<HTML

    <script type="text/javascript" src="
    {$config['http_home_url']}engine/classes/highslide/highslide{$hs_prefix}.js"></script>
    <script type="text/javascript">    
        hs.graphicsDir = '
    {$config['http_home_url']}engine/classes/highslide/graphics/';
        hs.outlineType = 'rounded-white';
        hs.numberOfImagesToPreload = 0;
        hs.showCredits = false;
        hs.lang = {
            loadingText :     '
    {$lang['loading']}',
            fullExpandTitle : '
    {$lang['thumb_expandtitle']}',
            restoreTitle :    '
    {$lang['thumb_restore']}',
            focusTitle :      '
    {$lang['thumb_focustitle']}',
            loadingTitle :    '
    {$lang['thumb_cancel']}'
        };
    </script>
    {$pm_alert}
    HTML;

    }

    $tpl->set '{AJAX}'$ajax );
    $tpl->set '{headers}'$metatags );

    $tpl->set '{content}'"<div id='dle-content'>" $tpl->result['content'] . "</div>" );
    $tpl->set '{THEME}'$config['http_home_url'] . 'templates/' $config['skin'] );

    $tpl->compile 'main' );

    if (
    $replace_url$tpl->result['main'] = str_replace $replace_url[0], $replace_url[1], $tpl->result['main'] );

    echo 
    $tpl->result['main'];
    $tpl->global_clear ();
    $db->close ();

    echo 
    "\n<!-- DataLife Engine Copyright SoftNews Media Group (http://dle-news.ru) -->\r\n";

    GzipOut ();
    ?>
    Вам нужна почти последняя строчка!

    вместо GzipOut ();
    надо написать GzipOut (1);
    и сохранить фаил.

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

    Но вот случайные 10 фильмов я бы посоветовал отключить...
     
    Tadasi нравится это.
  9. lift

    lift Читатель

    Заблокирован
    Регистр.:
    1 июл 2007
    Сообщения:
    2.226
    Симпатии:
    1.378
    Отключи похожие новости. Хотя на самом деле 400 уников на таком сайте это вообще ниочем. Рискну предположить что причина такой большой нагрузки кроется в кривости настроек самого мускуля на хостинге. Ну либо там дается 25% мощности от процессора в 1ггц 32 битного, тогда тут не сделаеш вообще ничего.
     
  10. Juri

    Juri

    Заблокирован
    Регистр.:
    5 окт 2007
    Сообщения:
    1.068
    Симпатии:
    197

    100 процентно из-за модуля 10 случайных новостей. Сотрим на первый скрин, очень большая нагрузка на процессор так, затем смотрим на те запросы которые предоставил хосетр, затем идем сюда
    http://blog.kron0s.com/top-20-mysql-best-practices
    и читаем 6 пункт. затем отключаем этот ненужный модуль и наслождаемся отличной работой скрипта.

    по своему опыту могу сказать что держу 3 дле с общей посещаемостью 10к уников в день, у каждой база по 4 -5 тысячи новостей и он-лайн сидит суммарно около 250 и все это висит на простом впс с 200 мегагерцами и 750 мб памяти. проблем не возникает...

    так что в топку этот модуль... он все равно ничего хорошего не дает.
     
Статус темы:
Закрыта.