Анализ производительности базы данных MySQL

30 Май 2008
Опубликовано VladSavitsky
Задача: 

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

Задача

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

Решение

Начнём с простых методов анализа.

Варианты

  • Стандартные возможности Друпал
  • Скрипт "tuning primer" (Matt Mongomery)
  • Включение полного лога запросов

Включение полного лога запросов

Включение полного лога в my.cnf:

[mysqld]
log=/var/log/mysql_full.log

Стандартные возможности Друпал

Откройте в браузере страницу "SQL"
Друпал 6: admin/reports/status/sql
Друпал 5: admin/logs/status/sql

Вы увидите 3 таблицы:

  • Счетчики команд - статистика запросов к базе данных
  • Производительность запросов - должно быть по нулям. Иначе нужно что-то менять.
  • Информация о кеше запросов - можно проверить использует ли MySQL кеш для запросов. Лучше, если использует.

Скрипт "tuning primer" (Matt Mongomery)

Matt Mongomery из MySQL написал отличный скрипт "tuning primer", который предоставляет общие настройки для улучшения производительности.
Скрипт можно скачать: http://www.day32.com/MySQL/
База данных MySQL должна быть в работе как минимум 48 часов, перед запуском скрипта, чтобы предложенные настройки были наилучшими.

Скрипт выдаёт рекомендации по таким вопросам:

  • Slow Query Log
  • Max Connections
  • Worker Threads
  • Key Buffer
  • Query Cache
  • Sort Buffer
  • Joins
  • Temp Tables
  • Table (Open & Definition) Cache
  • Table Locking
  • Table Scans (read_buffer)
  • Innodb Status

Запуск скрипта

Для использования этого скрипта нужен SSH (шел) доступ к серверу...
Выгрузить скрипт на сервер
Установить права доступа: chmod u+x tuning-primer.sh
Запустить скрипт из командной строки: bash /path-to-script/tuning-primer.sh или sh /path-to-file/tuning-primer.sh

Пример работы скрипта №1

Были вырезаны некоторые рекомендации, чтобы уместить на одной странице:

./tuning-primer.sh

        — MYSQL PERFORMANCE TUNING PRIMER –
             - By: Matthew Montgomery -

MySQL Version 4.1.20 i686

Uptime = 5 days 10 hrs 46 min 5 sec
Avg. qps = 4
Total Questions = 2020809
Threads Connected = 1

Server has been running for over 48hrs.
It should be safe to follow these recommendations

———– вырезано ————–

QUERY CACHE
Query cache is enabled
Current query_cache_size = 8 M
Current query_cache_used = 7 M
Current query_cach_limit = 1 M
Current Query cache fill ratio = 89.38 %
However, 254246 queries have been removed from the query cache due to lack of memory
Perhaps you should raise query_cache_size
MySQL won't cache query results that are larger than query_cache_limit in size

———– вырезано ————–

Код выше показывает, что нужно увеличить кеш запросов. Он был равен 8Мб, но он очищается слишком часто.

———– вырезано ————–

TEMP TABLES
Current max_heap_table_size = 16 M
Current tmp_table_size = 32 M
Of 35170 temp tables, 74% were created on disk
Effective in-memory tmp_table_size is limited to max_heap_table_size.
Perhaps you should increase your tmp_table_size and/or max_heap_table_size
to reduce the number of disk-based temporary tables
Note! BLOB and TEXT columns are not allow in memory tables.
If you are using these columns raising these values might not impact your
ratio of on disk temp tables.

———– вырезано ————–

Пример работы скрипта №2

[root@server1 root]# wget http://www.day32.com/MySQL/tuning-primer.sh
--20:41:15--  http://www.day32.com/MySQL/tuning-primer.sh
           => `tuning-primer.sh'
Resolving www.day32.com... 209.61.186.89
Connecting to www.day32.com|209.61.186.89|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 34,309 (34K) [application/x-sh]
100%[====================================>] 34,309        --.--K/s            
20:41:15 (279.14 KB/s) - `tuning-primer.sh' saved [34309/34309]
[root@server1 root]# bash tuning-primer.sh
        -- MYSQL PERFORMANCE TUNING PRIMER --
             - By: Matthew Montgomery -
MySQL Version 3.23.58
Uptime = 23 days 21 hrs 28 min 54 sec
Avg. qps = 17
Total Questions = 36204146
Threads Connected = 5
Server has been running for over 48hrs.
It should be safe to follow these recommendations
To find out more information on how each of these
runtime variables effects performance visit:
http://dev.mysql.com/doc/refman/4.1/en/server-system-variables.html
SLOW QUERIES
Current long_query_time = 10 sec.
You have 526 out of 36204146 that take longer than 10 sec. to complete
The slow query log is NOT enabled.
Your long_query_time may be too high, I typically set this under 5 sec.
MAX CONNECTIONS
Current max_connections = 200
Current threads_connected = 5
Historic max_used_connections = 166
The number of used connections is 83% of the configured maximum.
Your max_connections variable seems to be fine.
WORKER THREADS
Current thread_cache_size = 0
Current threads_cached = 0
Current threads_per_sec = 1
Historic threads_per_sec = 0
Your thread_cache_size is fine
MEMORY USAGE
Max Memory Ever Allocated : 28 M
Configured Max Memory Limit : 30 M
Total System Memory : 2028 M
KEY BUFFER
Current MyISAM index space = 239 M
Current key_buffer_size = 7 M
Key cache miss rate is 1 / 126
Key buffer fill ratio = Unknown %
Your key_buffer_size seems to be fine
QUERY CACHE
You are using MySQL 3.23.58, no query cache is supported.
I recommend an upgrade to MySQL 4.0 or better
SORT OPERATIONS
Current sort_buffer_size = 2 M
Current record/read_rnd_buffer_size = 128.00 K
Sort buffer seems to be fine
JOINS
Current join_buffer_size = 128.00 K
You have had 108378 queries where a join could not use an index properly
You should enable "log-long-format"
Then look for non indexed joins in the slow query log.
If you are unable to optimize your queries you may want to increase your
join_buffer_size to accomidate larger joins in one pass.
TABLE CACHE
Current table_cache value = 64 tables
You have a total of 842 tables
You have 64 open tables.
Current table_cache hit rate is 0%, while 100% of your table cache is in use
You should probably increase your table_cache
TEMP TABLES
Current tmp_table_size = 32 M
48% of tmp tables created were disk based
Perhaps you should increase your tmp_table_size
TABLE SCANS
Current read_buffer_size = 128.00 K
Current table scan ratio = 43 : 1
read_buffer_size seems to be fine
TABLE LOCKING
Current Lock Wait ratio = 1 : 3294
You may benefit from selective use of InnoDB.
If you have long running SELECT's against MyISAM tables and perform frequent updates consider setting 'low_priority_updates=1'
[root@server1 root]# free -m
             total       used       free     shared    buffers     cached
Mem:          1001        881        119          0         81        548
-/+ buffers/cache:        252        749
Swap:         1027         58        969

Внесение изменений в my.cnf

  • Нужно сделать резервную копию: cp -a /etc/my.cnf /etc/my.cnf.bak
  • Внести изменения
  • Перезапустить сервер базы данных, чтобы внесённые изменения вступили в силу
    Это можно сделать через панель управления или командную строку (в некоторых UNIX: /etc/rc.d/init.d/mysqld restart)
  • Через несколько дней снова запустите скрипт, чтобы убедиться, что вы ничего не упустили.

Использованные материалы

MySQL Performance Tuning

Полезные ссылки

Tools, tips, and links on optimizing mysql
Using a MySQL Performance Tuning Analyzer Script
Tuning MySQL for Drupal
Tuning a MySQL server in 5 minutes
MySQL 6.0 Reference Manual :: 5 MySQL Server Administration :: 5.1 The MySQL Server :: 5.1.3 System Variables

 
 
 

RSS-лента новостей

Dries Buytaert по-русски
]]>Русский поиск Drupal]]>

Перенос сайта из Joomla в Drupal
Перенос сайта из WordPress в Drupal

]]> Drupal - это бесплатная система управления контентом с открытым исходным кодом ]]>