Ниже мой файл .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, я вижу рост потребления ЦП.
Я подозреваю, что у вас здесь несколько проблем, которые накапливаются и вызывают проблемы.
Если ни один из этих способов не повысит производительность до желаемого уровня, возможно, пришло время масштабировать сервер базы данных. 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
команда. Выходные данные расскажут вам, как ваши запросы используют индексы таблиц, что напрямую влияет на производительность.