Как поправить нагрузку на mysql?

palec

Профессор
Регистрация
6 Дек 2006
Сообщения
282
Реакции
49
Всем привет!

Нужна ваша помощь! Ребята строго не судите, не спец по настройкам сервера... Проблема следующая есть сайт на DLE, база 400мб + ~4000 посетителей в сутки. При добавление новости или комментария идет нагрузка на MYSQL (так понимаю на запись) и сайт долго открывается, то же самое если робот поисковика посещает, весь сайт зависает на минут 5. В целом сайт оптимизирован и работает быстро... Кроме вышесказанных моментов. Уже перерыл все, не понимаю где я лоханулся в настройках. :( Готов отблагодарить за помощь! :glob:

Данные сервера: (Диск ssd)
image.jpg


Веб-сервер nginx frontend apache backend:
конфиг nginx + vhost
user nginx nginx;

worker_processes 2;
timer_resolution 100ms;
worker_rlimit_nofile 10000;

error_log /var/log/nginx/error.log;
#error_log /var/log/nginx/error.log notice;
#error_log /var/log/nginx/error.log info;

pid /run/nginx.pid;

events {
worker_connections 2048;
use epoll;
}

http {
include /etc/nginx/mime.types;
default_type application/octet-stream;

log_format main '$remote_addr - $remote_user [$time_local] $status '
'"$request" $body_bytes_sent "$http_referer" '
'"$http_user_agent" "http_x_forwarded_for"';

access_log /var/log/nginx/access.log main;

sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 30;
server_tokens off;

gzip on;
#gzip_vary on;
gzip_proxied any;
gzip_comp_level 3;
#gzip_static off;
gzip_min_length 1100;
gzip_buffers 64 8k;
gzip_http_version 1.1;
gzip_disable "msie6";
gzip_types text/plain application/xml application/x-javascript text/css;

include /etc/nginx/vhosts.conf;

}
===========================================
server {
listen 80;
server_name site.org Для просмотра ссылки Войди или Зарегистрируйся
access_log off;

location / {
proxy_pass Для просмотра ссылки Войди или Зарегистрируйся
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 10m;
client_body_buffer_size 128k;
proxy_connect_timeout 630;
proxy_send_timeout 630;
proxy_read_timeout 630;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 10m;
}

location ~* \.(jpg|jpeg|gif|png|css|bmp|js|swf|ico|woff|svg)$
{
expires 30d;
root /home/webz/site.org;
}
location ~ /\.ht {
deny all;
}
}
конфиг MariaDB my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

max_connections=150
innodb_buffer_pool_size=128M
innodb_additional_mem_pool_size=20M

query_cache_size=32M
thread_cache_size=8

max_heap_table_size=64M
tmp_table_size=64M

max_allowed_packet=1M

innodb_use_sys_malloc=0

interactive_timeout=30
wait_timeout=30

table_open_cache=1600

#slow_query_log=1
#slow_query_log_file=/var/log/mysql-slow.log
#long_query_time=10
#log_queries_not_using_indexes

# Settings user and group are ignored when systemd is used.
# If you need to run mysqld under a different user or group,
# customize your systemd unit file for mysqld/mariadb according to the
# instructions in Для просмотра ссылки Войди или Зарегистрируйся

# Currently, there are mariadb and community-mysql packages in Fedora.
# This particular config file is included in respective RPMs of both of them,
# so the following settings are general and will be also used by both of them.
# Otherwise the RPMs would be in conflict.
# Settings for particular implementations like MariaDB are then
# defined in appropriate sections; for MariaDB server in [mariadb] section in
# /etc/my.cnf.d/server.cnf (part of mariadb-server).
# It doesn't matter that we set these settings only for [mysqld] here,
# because they will be read and used in mysqld_safe as well.
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

[mysqld_safe]

#
# include all files from the config directory
#
!includedir /etc/my.cnf.d
результат mysqltuner.pl
image.jpg

конфиг apache + MPM module
Для просмотра ссылки Войди или Зарегистрируйся
 

Вложения

  • httpd.txt
    13,1 KB · Просмотры: 11
может стоит копать в самих запросах к базе? странно что при записи может нагрузка возникнуть...
 
Поясню нагрузку...

Сразу после добавления новости обнуляется кэш всех новостей.Отсюда и нагрузка. Одновременно идёт нагрузка от пересчёта похожих материалов.
Проблема усугубляется наличием тегов custom - каждый из них так же пересчитывает свой кэш.

Собственно - вот Вам и нагрузка.

Вообще, странно, что оно приводит к столь печальным последствиям.

Как вариант решения проблемы - у тебя база не такая большая, всего 400 метров. При этом у тебя полупустая оператика. Как минимум выносим сэш в оперативку, т.е. ставим мемкэш и дружим с ДЛЕ. Далее туда же выносим кэш MySQL и индексы - уже не помню что именно там можно в раму выносить, профи подскажут.

Если не поможет - можно плюнуть и вынести всю базу в раму и синхронизировать с хардом только запись. При этом чтение будет с RAM, что в разы быстрее.

Так же оптимизируем сам ДЛЕ - откулючаем всякую неиспользуемую хрень, типа календаря, публикацию на запланированную дату... В общем, там реально куча чего отрубить можно.

На выходе получаем быстрый сайт.

P.s. а что у тебя за такая волшебная 2-х ядерная машина, которая была загружена на 3,13 ядра за 15 минут до скрина? :crazy:
P.p.s. если такая нагрузка, как на скрине, у тебя постоянно - пора докупать CPU
 
Последнее редактирование:
  • Нравится
Реакции: javx
сори за флуд но мну катиться что 145 ранинг тасков это както многовато... дефакто слушает загрузка цп хоть мариа и менее требовательна к ресурсам цп чем мускла... в общем смотри лог медленных запросов и ситуация станет яснее...
 
Поясню нагрузку...

Сразу после добавления новости обнуляется кэш всех новостей.Отсюда и нагрузка. Одновременно идёт нагрузка от пересчёта похожих материалов.
Проблема усугубляется наличием тегов custom - каждый из них так же пересчитывает свой кэш.

Собственно - вот Вам и нагрузка.

Вообще, странно, что оно приводит к столь печальным последствиям.

Как вариант решения проблемы - у тебя база не такая большая, всего 400 метров. При этом у тебя полупустая оператика. Как минимум выносим сэш в оперативку, т.е. ставим мемкэш и дружим с ДЛЕ. Далее туда же выносим кэш MySQL и индексы - уже не помню что именно там можно в раму выносить, профи подскажут.

Если не поможет - можно плюнуть и вынести всю базу в раму и синхронизировать с хардом только запись. При этом чтение будет с RAM, что в разы быстрее.

Так же оптимизируем сам ДЛЕ - откулючаем всякую неиспользуемую хрень, типа календаря, публикацию на запланированную дату... В общем, там реально куча чего отрубить можно.

На выходе получаем быстрый сайт.

P.s. а что у тебя за такая волшебная 2-х ядерная машина, которая была загружена на 3,13 ядра за 15 минут до скрина? :crazy:
P.p.s. если такая нагрузка, как на скрине, у тебя постоянно - пора докупать CPU

Да том то и дело что всякое барахло как календарь, публикация на запланированную дату убраны... да есть похожие новости и custom... ставил memcache проблема осталась... :( по поводу 3,13 это как раз при добавлении новости! я уже отключал все возможные модули результат 0... Может есть среди нас спец по настройкам и глянуть на конфиги которые я выставил?
 
добавь в my.cnf в блок [mysqld] следующие строки
Код:
slow_query_log = 1
slow_query_log_file = /var/log/mysql-slow-query.log
long_query_time = 1
log_slow_verbosity = query_plan
log-queries-not-using-indexes
и картина станет яснее.
и глянь что пишется в /var/log/mysqld.log
 
Последнее редактирование:
Есть на форуме такой странный тип, @latteo зовут... Странный он тем, что знает ответ на любой вопрос по MySQL... :yeeeah:

Стукни ему, по цене не скажу, но если он не сможет - я и не знаю кого посоветовать :nezn:
 
Хотелось бы выразить всем огромное спасибо за поддержку (@Горбушка, @latteo, @rekfast) ! По советам начал рыться в логах slow_query_log и увидел что идут небольшие но огромная куча запросов к базе, при добавлении новости... Виноватым оказался хак от Sander который я когда то у него заказывал, задача хака была подсчитывать и выводить количество новых новостей к определенной категории... (+1, +2 итд.). Убрал его и проблема пропала. :sun:

Вот сам хак:
Открыть файл engine/modules/functions.php

ПЕРЕД строкой:
?>
Вставить:

function catamount($id,$all = false){
global $cat_info,$_TIME,$db,$config;
$id = intval($id);
if(!$id) return;
$catconf = array(
'new_prefix' => "+",
'sub_cats' => true,
);
if($config['allow_cache']!='yes'){$config['allow_cache'] = 'yes';$tcache = true;}
$catam = unserialize(dle_cache('news_catcount'));
if(empty($catam[$id])){
$where = array();
$now = date("Y-m-d H:i:s", $_TIME);
$today = date("Y-m-d", $_TIME);
if($catconf['sub_cats']) $ids = get_sub_cats($id);
else $ids = $id;
$where[] = "category regexp '[[:<:]]({$ids})[[:>:]]'";
$where[] = "date <= '{$now}'";
$where[] = "approve";
$where = implode(" AND ", $where);
$row = $db->super_query("SELECT (SELECT COUNT(*) FROM " . PREFIX . "_post WHERE {$where} ) as pall, (SELECT COUNT(*) FROM " . PREFIX . "_post WHERE {$where} AND date > '$today') as today");
$catam[$id]['today'] = intval($row['today']);
$catam[$id]['pall'] = intval($row['pall']);
unset($row,$where,$ids);
create_cache('news_catcount',serialize($catam));
}
if($tcache) $config['allow_cache'] = 'no';
if(empty($catam[$id]['today'])){ $catconf['new_prefix']='';$catam[$id]['today']='';}
if($all) return $catam[$id]['pall'];
return $catconf['new_prefix'].$catam[$id]['today'];
}

Открыть файл index.php
ПЕРЕД строкой:

if (strpos ( $tpl->copy_template, "[category=" ) !== false) {
Вставить:
if (strpos ( $tpl->copy_template, "{catnew=" ) !== false) $tpl->copy_template = preg_replace ( "#\\{catnew=(.+?)\\}#ies", "catamount('\\1')", $tpl->copy_template );
if (strpos ( $tpl->copy_template, "{catall=" ) !== false) $tpl->copy_template = preg_replace ( "#\\{catall=(.+?)\\}#ies", "catamount('\\1', true)", $tpl->copy_template );

В main.tpl использовать теги:
{catnew=ID} - количество новостей опубликованных в нынешний день;
{catall=ID} - общее количество новостей в категории.

где: ID - id категории.

Еще раз всем огромное спасибо!!!
 
Назад
Сверху