mysql оптимизация

12
D
На сайте с 26.12.2012
Offline
37
4875

Здравствуйте у меня проблема с аномальной нагрузкой на mysql.

Собственно стоит задача игровой сервер в обычное время показатели в atop показывают:


DSK | sda | busy 31% | read 0 | write 397 | avio 7.66 ms |
DSK | sdb | busy 29% | read 0 | write 397 | avio 7.23 ms |

Но есть у наших проектов такое как автосейф игроков 1 раз в 15 минут. 2 игровых проекта.

Нагрузка возрастает до 90% в связи с чем начинаются те же лаги. Бывает и без сейвов нагрузка достигает 85% опять же начинаются лаги..

На повестке дня возник еще 1 проект игровой с большей уже базой. Но меньше игроков(значит отдача будет меньше)

Вопрос стоит в том, есть ли смысл покупать SSD диски на сервер? Сейчас имеется в распоряжении машина:

Intel Xeon W3520
4 c/ 8 t
2.66 GHz+
32 GB
2 x 2 TB SATA

Что касается процессора и оперативки то процессор нагружен от силы 10-15% оперативка в среднем при аптайме от 3 дней работы серверов достигает 15 гигабайт. На борту Debian linux 7.5

Сам конфиг mysql:

#

# The MySQL database server configuration file.
#
# You can copy this to one of:
# - "/etc/mysql/my.cnf" to set global options,
# - "~/.my.cnf" to set user-specific options.
#
# One can use all long options that the program supports.
# Run program with --help to get a list of available options and with
# --print-defaults to see which it would actually understand and use.
#
# For explanations see
# http://dev.mysql.com/doc/mysql/en/server-system-variables.html

# This will be passed to all mysql clients
# It has been reported that passwords should be enclosed with ticks/quotes
# escpecially if they contain "#" chars...
# Remember to edit /etc/mysql/debian.cnf when changing the socket location.
[client]
port = 3306
socket = /var/run/mysqld/mysqld.sock

# Here is entries for some specific programs
# The following values assume you have at least 32M ram

# This was formally known as [safe_mysqld]. Both versions are currently parsed.
[mysqld_safe]
socket = /var/run/mysqld/mysqld.sock
nice = 0

[mysqld]
#
# * Basic Settings
#
user = mysql
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
port = 3306
basedir = /usr
datadir = /var/lib/mysql
tmpdir = /tmp
lc-messages-dir = /usr/share/mysql
skip-external-locking
memlock
#
# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure.
#bind-address = 127.0.0.1
#
# * Fine Tuning
#
join_buffer_size = 2M
tmp_table_size = 512M
max_heap_table_size = 512M
key_buffer = 150M
key_buffer_size = 200M
max_allowed_packet = 16M
thread_stack = 192K
thread_cache_size = 8
read_buffer_size = 1024K
# This replaces the startup script and checks MyISAM tables if needed
# the first time they are touched
myisam-recover = BACKUP
max_connections = 1024
table_cache = 452152
table_definition_cache = 1024
thread_concurrency = 10
#
# * Query Cache Configuration
#
query_cache_limit = 512M
query_cache_size = 1024M
#
# * Logging and Replication
#
# Both location gets rotated by the cronjob.
# Be aware that this log type is a performance killer.
# As of 5.1 you can enable the log at runtime!
#general_log_file = /var/log/mysql/mysql.log
#general_log = 1
#
# Error logging goes to syslog due to /etc/mysql/conf.d/mysqld_safe_syslog.cnf.
#
# Here you can see queries with especially long duration
log_slow_queries = /var/log/mysql/mysql-slow.log
long_query_time = 2
#log-queries-not-using-indexes
#
# The following can be used as easy to replay backup logs or for replication.
# note: if you are setting up a replication slave, see README.Debian about
# other settings you may need to change.
#server-id = 1
#log_bin = /var/log/mysql/mysql-bin.log
expire_logs_days = 10
max_binlog_size = 100M
#binlog_do_db = include_database_name
#binlog_ignore_db = include_database_name
#
# * InnoDB
#
# InnoDB is enabled by default with a 10MB datafile in /var/lib/mysql/.
# Read the manual for more InnoDB related options. There are many!
#
# * Security Features
#
# Read the manual, too, if you want chroot!
# chroot = /var/lib/mysql/
#
# For generating SSL certificates I recommend the OpenSSL GUI "tinyca".
#
# ssl-ca=/etc/mysql/cacert.pem
# ssl-cert=/etc/mysql/server-cert.pem
# ssl-key=/etc/mysql/server-key.pem
innodb_buffer_pool_size = 5000M
innodb_file_per_table = 1


[mysqldump]
quick
quote-names
max_allowed_packet = 150M

[mysql]
#no-auto-rehash # faster start of mysql but no tab completition

[isamchk]
key_buffer = 16M

#
# * IMPORTANT: Additional settings that can override those from this file!
# The files must end with '.cnf', otherwise they'll be ignored.
#
!includedir /etc/mysql/conf.d/

Тюнер говорит вот что:

>> MySQLTuner 1.1.1 - Major Hayden <major@mhtx.net>
>> Bug reports, feature requests, and downloads at http://mysqltuner.com/
>> Run with '--help' for additional options and output filtering
Please enter your MySQL administrative login: root
Please enter your MySQL administrative password:

-------- General Statistics --------------------------------------------------
[--] Skipped version check for MySQLTuner script
[OK] Currently running supported MySQL version 5.5.41-0+wheezy1-log
[OK] Operating on 64-bit architecture

-------- Storage Engine Statistics -------------------------------------------
[--] Status: +Archive -BDB -Federated +InnoDB -ISAM -NDBCluster
[--] Data in MyISAM tables: 1G (Tables: 714)
[--] Data in InnoDB tables: 4G (Tables: 266)
[--] Data in PERFORMANCE_SCHEMA tables: 0B (Tables: 17)
[!!] Total fragmented tables: 119

-------- Security Recommendations -------------------------------------------
[OK] All database users have passwords assigned

-------- Performance Metrics -------------------------------------------------
[--] Up for: 29d 2h 32m 56s (591M q [235.131 qps], 11M conn, TX: 591B, RX: 87B)
[--] Reads / Writes: 30% / 70%
[--] Total buffers: 6.1G global + 35.4M per thread (3048 max threads)
[!!] Maximum possible memory usage: 111.6G (354% of installed RAM)
[OK] Slow queries: 0% (2K/591M)
[OK] Highest usage of available connections: 17% (532/3048)
[OK] Key buffer size / total MyISAM indexes: 200.0M/104.2M
[OK] Key buffer hit rate: 100.0% (754M cached / 33K reads)
[OK] Query cache efficiency: 90.1% (410M cached / 455M selects)
[OK] Query cache prunes per day: 0
[OK] Sorts requiring temporary tables: 0% (2K temp sorts / 7M sorts)
[OK] Temporary tables created on disk: 1% (69K on disk / 5M total)
[OK] Thread cache hit rate: 99% (21K created / 11M connections)
[!!] Table cache hit rate: 17% (2K open / 13K opened)
[OK] Open file limit used: 0% (2K/907K)
[OK] Table locks acquired immediately: 99% (149M immediate / 149M locks)
[!!] InnoDB data size / buffer pool: 4.8G/4.4G

-------- Recommendations -----------------------------------------------------
General recommendations:
Run OPTIMIZE TABLE to defragment tables for better performance
Reduce your overall MySQL memory footprint for system stability
Increase table_cache gradually to avoid file descriptor limits
Variables to adjust:
*** MySQL's maximum memory usage is dangerously high ***
*** Add RAM before increasing MySQL buffer variables ***
table_cache (> 452152)
innodb_buffer_pool_size (>= 4G)

В конфиге много значений в основном это старый конфиг и составлять его помогала еще тех поддержка со временем я поднял некоторые значения.. Прочитав в интернете про почти все параметры, я так и не понял про параметр table_cache.

Ах.. Ну и memlock мы поставили уже сами без тех. поддержки вычитав это в интернете.

Дак вот.. Есть ли смысл покупать SSD диски? Или можно тут подрегулировать параметры некоторые. Спасибо за помощь!:)

LEOnidUKG
На сайте с 25.11.2006
Offline
1774
#1
Есть ли смысл покупать SSD диски?

Купите и не парьтесь. Главное бэкапы делайте и всё.

✅ Мой Телеграм канал по SEO, оптимизации сайтов и серверов: https://t.me/leonidukgLIVE ✅ Качественное и рабочее размещение SEO статей СНГ и Бурж: https://getmanylinks.ru/ ✅ Настройка и оптимизация серверов https://getmanyspeed.ru/
D
На сайте с 26.12.2012
Offline
37
#2
LEOnidUKG:
Купите и не парьтесь. Главное бэкапы делайте и всё.

Купить конечно не проблема, но всё же интересно насчёт парметров моих mysql скажем так у конкурентов по слухам нагрузка 10-15. Когда у меня она же составляет 25-30

pupseg
На сайте с 14.05.2010
Offline
364
#3

innodb_buffer_pool_size увеличте до 5Гб

query_cache_size=1G - не многовато?

http://www.mysql.ru/docs/man/Table_cache.html тут читали ?

Качественная помощь в обслуживании серверов. (/ru/forum/661100) Бесплатных консультаций не даю, не помогаю, не обучаю. Минималка от 100$. Как пропатчить KDE-просьба не спрашивать. Есть форумы (http://linux.org.ru) и полезные сайты (http://www.opennet.ru/).
D
На сайте с 26.12.2012
Offline
37
#4
pupseg:
innodb_buffer_pool_size увеличте до 5Гб
query_cache_size=1G - не многовато?
http://www.mysql.ru/docs/man/Table_cache.html тут читали ?

Насчёт 1g это тех поддержка так поставила.

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

table_cache = 452152

ну и еще напрягает тот момент

[!!] Maximum possible memory usage: 111.6G (354% of installed RAM)

:)

И в данном случае он еще требует увеличить это значение?

Variables to adjust:

*** MySQL's maximum memory usage is dangerously high ***

*** Add RAM before increasing MySQL buffer variables ***

table_cache (> 452152)

baas
На сайте с 17.09.2012
Offline
171
#5

хмм, можно попробвать убрать резолвинг адресов, тоетсь что бы все шло к примеру по ип адресу (127,0,0,1)

skip-name-resolve

У меня сервер на интеловских ссд 3500 серии, ссд выносливые.

иннодб я оптимизирую так.

по умолчанию иннодб использует один инстант.

Общий объем каждого инстатнта.

innodb_buffer_pool_size = 4096M

четыре блока(инстанта) по одному гигу.

innodb_buffer_pool_instances = 4

Чтение/запись диска, максимум 8 помоему.

innodb_write_io_threads = 8

Чтение/запись диска, максимум 8 помоему.

innodb_read_io_threads = 8

Использовать все 12ядер.

innodb_thread_concurrency = 12

skip-networking

skip-name-resolve

Подробнее можно прочитать тут.

http://habrahabr.ru/company/bitrix/blog/148874/

У вас реально так много таблиц в базе?

table_cache = 452152

Настройка BSD систем. (https://www.fryaha.ru) Знание сила, незнание Рабочая сила!
D
На сайте с 26.12.2012
Offline
37
#6
baas:
хмм, можно попробвать убрать резолвинг адресов, тоетсь что бы все шло к примеру по ип адресу (127,0,0,1)

У меня сервер на интеловских ссд 3500 серии, ссд выносливые.
иннодб я оптимизирую так.
по умолчанию иннодб использует один инстант.
Общий объем каждого инстатнта.

четыре блока(инстанта) по одному гигу.

Чтение/запись диска, максимум 8 помоему.

Чтение/запись диска, максимум 8 помоему.

Использовать все 12ядер.
innodb_thread_concurrency = 12
skip-networking
skip-name-resolve
Подробнее можно прочитать тут.
http://habrahabr.ru/company/bitrix/blog/148874/

У вас реально так много таблиц в базе?
table_cache = 452152

Спасибо посмотрю ваши настройки обязательно! Ну у нас каждый проект кушает по 3 базы в каждой базе по 100-150 таблиц +apache-2 базы по 10-20 таблиц

N
На сайте с 06.05.2007
Offline
419
#7

У вас есть лог медленных запросов. Почему вы не начали с их анализа ?

denisakajacob:
Насчёт 1g это тех поддержка так поставила.

А вы все равно уменьшайте. 128M даже достаточно.

Сделайте еще innodb_flush_log_at_trx_commit=2

или 0. Да, это может быть опасно, но не в онлайн играх.

Битрикс, например, рекомендовал так делать. А битрикс - голова!

denisakajacob:
[!!] Maximum possible memory usage: 111.6G (354% of installed RAM)
И в данном случае он еще требует увеличить это значени

mysqltuner ничего не требует. Вы сами легко все испортите.

Если известно, что количество подключений ограничено другими факторами, например MaxClients в apache, то потребляемая память никогда этого значения не достигнет.

Кнопка вызова админа ()
D
На сайте с 26.12.2012
Offline
37
#8
netwind:
У вас есть лог медленных запросов. Почему вы не начали с их анализа ?


А вы все равно уменьшайте. 128M даже достаточно.

Сделайте еще innodb_flush_log_at_trx_commit=2
или 0. Да, это может быть опасно, но не в онлайн играх.
Битрикс, например, рекомендовал так делать. А битрикс - голова!


mysqltuner ничего не требует. Вы сами легко все испортите.
Если известно, что количество подключений ограничено другими факторами, например MaxClients в apache, то потребляемая память никогда этого значения не достигнет.

Спасибо!

Хорошо сделаю как вы посоветовали, но можно поподробнее насчёт innodb_flush_log_at_trx_commit = 2 пока что поставил 2 боюсь насчёт 0 :) В интернете пишут что потеря данных при аварийной остановке mysql значит ли это, что я потеряю всю базу? или что я потеряю если при 0 просто убью процесс через killall к примеру

N
На сайте с 06.05.2007
Offline
419
#9

denisakajacob, может потеряться новая информация за несколько последних секунд.

Z
На сайте с 06.09.2012
Offline
129
#10

Можно решить проблему кардинально и заменить innodb на tokudb, который оптимизирован под подобные нагрузки, много пишущие в базу, во много раз больше вытянет:

http://www.tokutek.com/tokudb-for-mysql/

Черный список врунов и обманщиков: ua-hosting.company, riaas.ru, takewyn.ru, yahoster/cadedic, Andreylab
12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий