Назад | Перейти на главную страницу

MySQL забирает слишком много ЦП

Ниже мой файл .cnf, и если я вижу, что мой процессор потребляет 99,99%, мои команды mysqld. Сервер MySQL подключен к удаленным машинам, которые часто обновляют данные на нем, но я удостоверяюсь, что удаленный сервер открывает соединение, читает / пишет / обновляет, а затем закрывает его. Также удаленный сервер много читает.

Что я могу сделать, чтобы уменьшить потребление процессора. К вашему сведению, я использую 2-ядерный процессор с 4 ГБ оперативной памяти.

[client]
port          = 3306
socket      = /var/run/mysqld/mysqld.sock

[mysqld_safe]
socket      = /var/run/mysqld/mysqld.sock
nice          = 0

[mysqld]
user          = mysqluser
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
wait_timeout    = 20
interactive_timeout = 60

bind-address            = <IP-ADDRESS>
key_buffer            = 16M
max_allowed_packet  = 16M
thread_stack            = 192K
thread_cache_size   = 8
myisam-recover      = BACKUP
max_connections     = 300

query_cache_limit   = 20M
query_cache_size        = 128M

log_error = /var/log/mysql/error.log
log_slow_queries    = /var/log/mysql/mysql-slow.log
long_query_time = 4
log-queries-not-using-indexes

expire_logs_days    = 10
max_binlog_size         = 100M

[mysqldump]
quick
quote-names
max_allowed_packet  = 16M

[mysql]

[isamchk]
key_buffer      = 16M

Также вставляем вывод mysqltuner.

 >>  MySQLTuner 1.4.0 - Major Hayden <major@mhtx.net>
 >>  Bug reports, feature requests, and downloads at http://mysqltuner.com/
 >>  Run with '--help' for additional options and output filtering
[OK] Logged in using credentials from debian maintenance account.
[OK] Currently running supported MySQL version 5.5.38-0ubuntu0.14.04.1-log
[OK] Operating on 64-bit architecture

-------- Storage Engine Statistics -------------------------------------------
[--] Status: +ARCHIVE +BLACKHOLE +CSV -FEDERATED +InnoDB +MRG_MYISAM 
[--] Data in InnoDB tables: 2G (Tables: 26)
[--] Data in PERFORMANCE_SCHEMA tables: 0B (Tables: 17)
[!!] Total fragmented tables: 26

-------- Performance Metrics -------------------------------------------------
[--] Up for: 21m 51s (37K q [28.525 qps], 31K conn, TX: 6M, RX: 7M)
[--] Reads / Writes: 97% / 3%
[--] Total buffers: 304.0M global + 2.7M per thread (5000 max threads)
[!!] Maximum possible memory usage: 13.4G (347% of installed RAM)
[!!] Slow queries: 18% (6K/37K)
[OK] Highest usage of available connections: 0% (16/5000)
[OK] Key buffer size / total MyISAM indexes: 16.0M/100.0K
[OK] Query cache efficiency: 20.2% (7K cached / 36K selects)
[OK] Query cache prunes per day: 0
[OK] Sorts requiring temporary tables: 0% (0 temp sorts / 6K sorts)
[OK] Temporary tables created on disk: 25% (54 on disk / 215 total)
[OK] Thread cache hit rate: 99% (16 created / 31K connections)
[OK] Table cache hit rate: 25% (74 open / 289 opened)
[OK] Open file limit used: 0% (49/25K)
[OK] Table locks acquired immediately: 100% (29K immediate / 29K locks)
[!!] InnoDB  buffer pool / data size: 128.0M/2.9G
[OK] InnoDB log waits: 0
-------- Recommendations -----------------------------------------------------
General recommendations:
    Run OPTIMIZE TABLE to defragment tables for better performance
    MySQL started within last 24 hours - recommendations may be inaccurate
    Reduce your overall MySQL memory footprint for system stability
Variables to adjust:
  *** MySQL's maximum memory usage is dangerously high ***
  *** Add RAM before increasing MySQL buffer variables ***
    innodb_buffer_pool_size (>= 2G)

У меня вообще не было этой проблемы, но когда я начал подключаться к этому серверу MySQL как 10 удаленных серверов и когда эти десять серверов начали делать SELECT и UPDATE запросов к этому единственному серверу MySQL, я вижу рост потребления ЦП.

Я подозреваю, что у вас здесь несколько проблем, которые накапливаются и вызывают проблемы.

  1. Дисковый ввод-вывод фрагментирован и, вероятно, неэффективен. OPTIMIZE TABLE для каждой из ваших таблиц должна разобраться в этом и немного помочь.
  2. Память настроена ужасно, что может вызвать проблемы с частой подкачкой.
  3. Медленные запросы - это большая проблема для вашей высокой загрузки ЦП. Я бы проверил ваш медленный журнал и посмотрел, что вы можете оптимизировать, добавляя индексы / реорганизуя запросы и т. Д. Вероятно, существует довольно распространенный запрос, который выполняет десятки или сотни тысяч сравнений, которые убивают вашу производительность.

Если ни один из этих способов не повысит производительность до желаемого уровня, возможно, пришло время масштабировать сервер базы данных. 2 ядра ничего не говорят мне о вычислительной мощности машины, а 4 ГБ оперативной памяти в наши дни довольно мало.

Чтобы получить более конкретный совет, добавьте подробности к своему описанию. SSD или вращающиеся диски? Какой процессор? Какой класс барана? Сколько запросов в минуту? Сколько клиентов и т. Д.?

Если вы можете немного поиграться с настройками, я бы попробовал это в my.cnf:

innodb_buffer_pool_size = 3000M

затем перезапустите mysql и проверьте свою производительность. Это позволит вам хранить гораздо больше вашей базы данных в памяти, уменьшая нагрузку на диск / память, которую вы можете наблюдать. Учитывая, что у вас есть память 4 Гб, и если этот сервер ТОЛЬКО сервер db, вы можете увеличить размер буферного пула примерно до 80% системной памяти.

Что происходит: вы пытаетесь посадить слона в клубок хомячка.

Что делать: уменьшить объем памяти для mysql

. . . . .
. . . . .
[mysqld]
user                    = mysqluser
pid-file                = /var/run/mysqld/mysqld.pid
socket                  = /var/run/mysqld/mysqld.sock
log_error               = /var/log/mysql/error.log
log_slow_queries        = /var/log/mysql/mysql-slow.log
long_query_time         = 10
log-queries-not-using-indexes
expire_logs_days        = 10
max_binlog_size         = 100M

port                    = 3306
basedir                 = /usr
datadir                 = /var/lib/mysql
tmpdir                  = /tmp
lc-messages-dir         = /usr/share/mysql
skip-external-locking
wait_timeout            = 20
interactive_timeout     = 60

bind-address            = <IP-ADDRESS>
myisam-recover          = BACKUP

## REASONABLE MEMORY PARAMETERS
max_connections         = 64
thread_cache_size       = 2
thread_concurrency      = 4
key_buffer_size         = 64M
join_buffer_size        = 2M
sort_buffer_size        = 2M
read_buffer_size        = 2M
read_rnd_buffer_size    = 8M
myisam_sort_buffer_size = 16M
query_cache_limit       = 2M
query_cache_size        = 32M
table_open_cache        = 512
max_allowed_packet      = 1M
. . . . .
. . . . .

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