mysql всегда использует максимальное соединение - PullRequest
1 голос
/ 19 декабря 2011

У меня есть сервер LAMP с 4-х ядерным процессором и 32 ГБ ОЗУ. На нем работает большой веб-сайт. У меня есть следующие проблемы на моем сервере.

Когда я использую инструмент Mysqlreport для мониторинга сервера MySQL, я всегда вижу использование соединения, как показано ниже. И пользователи, сообщающие о проблемах соединения на веб-сайте.

_

Connections _______________________________

Max used 251 of 250 %Max: 100.40 Total 748.71k 3.5/s

Но когда я использую команду "show process list", она ничего не выдаст. Мы используем движок MyISAM для всех наших БД.

Файл My Mysql Config вставлен ниже:

######################

[mysqld]

max_connections = 250

set-variable=local-infile=0

datadir=/var/lib/mysql

socket=/var/lib/mysql/mysql.sock

user=mysql

skip-name-resolve

skip-bdb

wait_timeout = 60

thread_cache_size = 100

table_cache = 1024

key_buffer = 384M

log_slow_queries=/mysql-log/mysql-slow.log

query-cache-size=512M

query-cache-type=1

query_cache_limit=20M

[mysqld_safe]

log-error=/var/log/mysqld.log

pid-file=/var/run/mysqld/mysqld.pid
# 

Кто использует мой пул соединений Mysql? Как я могу найти это?

И у меня есть еще одна проблема.

Sometimes the Load average goes beyond 4-8 range. See below:

13:40:02 up 2 days, 10:39, 0 users, load average: 5.03, 1.68, 0.93

В то время я вижу, что mysql является главным потребителем процессора. Нужна ли оптимизация в MySQL Server?

Пожалуйста, ответьте на мои два вопроса.

Заранее спасибо,

Aruns

Ответы [ 2 ]

1 голос
/ 21 декабря 2011

Добавьте следующие переменные в ваш my.cnf: Если вы собираетесь использовать только движок MyISAM, указанные ниже переменные дадут лучший результат в соответствии с вашей конфигурацией оборудования.

max_allowed_packet = 1M
table_open_cache = 250
sort_buffer_size = 2M
thread_stack = 128K
join_buffer_size = 1M
query_cache_limit = 400k
query_cache_size = 300M
key_buffer_size = 5G
read_buffer_size = 2M
read_rnd_buffer_size = 2M
bulk_insert_buffer_size = 8M
myisam_sort_buffer_size = 8M
myisam_max_sort_file_size = 6G
myisam_recover=FORCE,BACKUP

Но зависит от размера вашей БДи как ваше приложение получает (извлекает) данные, мы можем изменить вышеуказанные переменные.

Уменьшить wait_timeout = 30.

Относительно этого на самом деле я понятия не имею :( .. Соединения _ __ _ __ _ __ _ __ _ ____

Макс. Используется 251 из 250% Макс. 100,40 Итого 748,71 тыс. 3,5 / с

ПОКАЗАТЬ ПРОЦЕСС \ g

ДОЛЖЕН ПРЕДОСТАВЛЯТЬ СПИСОК ПРОЦЕССОВ, СВЯЗАННЫХ С БД В ЛЮБОМ СОСТОЯНИИ (СОН / ЧТЕНИЕ..... ETC.,)

Добавьте указанные выше переменные в my.cnf и перезапустите сервер.

1 голос
/ 19 декабря 2011

Я заметил, что вы уже используете MySQL Query Cache.

Вы пытались использовать MySQL Workbench для подключения к базе данных MySQL? Он предлагает графический способ проверки вашей базы данных MySQL, включая список процессов.

Если вы находитесь за брандмауэром, попробуйте использовать

show full processlist

Однако, я думаю, это не очень поможет.

Я бы предположил, что вы используете PHP - MySQL для раздачи веб-страниц. Таким образом, это означает, что вы в основном обнаружите, что MySQL-соединения сделаны из PHP. Чтобы увидеть, сколько потоков Apache работает одновременно. Вы можете попробовать:

ps aux |grep httpd |wc -l

Если у вас есть много потоков на apache, подключающихся к MySQL, то вы знаете, что у вас есть проблема.

Вы упомянули, что у вас загруженный сайт, поэтому реальным решением вашей проблемы является кэширование вашего контента, возможно, с использованием memcached. Идея состоит в том, чтобы уменьшить количество обращений к вашему серверу MySQL. Ваш сервер имеет много оперативной памяти и идеально подходит для memcached.

Эта идея заключается в повторном использовании контента в течение определенного периода времени, в зависимости от того, нуждается ли контент в свежести:

<?php

$cachedContent = $memcache->get("cacheKey");

if (!$cachedContent) {

    // retrieve from MySQL and formulate HTML here
    // you can use obstart so that you can reuse your previous code
    ob_start();

    // your previous code here
    // echo or
    ?>
    <div>
    previous generated content from mysql
    </div>
    <?php

    // now cachedContent contains your previous generated HTML
    $cachedContent = ob_get_contents();

    // set content into memcache
    $memcache->set("cacheKey", $cachedContent, false, 1800);

    // clear the  buffer 
    ob_end_flush(); 

}

echo $cachedContent;

?>

Вам нужно сначала найти, какое содержимое кэшировать. Хорошие места для начала:

  1. Неэффективные биты на странице index.php (я полагаю, это будет одна из самых популярных страниц)
  2. Проверьте свой GA для большинства популярных страниц.
  3. Проверьте медленные запросы MySQL и кэшируйте их содержимое.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...