我们有一个 MySQL DB 正常运行超过 2 年的站点。
然而,2 周前我们注意到负载突然飙升。我们启动了 MySQL 服务并规范了负载。我们认为这个问题是一次性的并且忘记了它。
但是在过去的 1 周里,MySQL 负载几乎每天都很高。有时重启后几分钟。它使网站几乎无法使用。
对日志的检查没有显示任何会导致峰值的查询。大多数查询(约 90%)花费的时间少于 10 毫秒。少数(约 9%)需要 10 到 20 毫秒。还有一些需要 20 到 30 毫秒。但这都是微不足道的,约占1%。除了在应用程序启动时运行的 2 个长时间运行的查询外,我还没有看到任何超过 30 毫秒的常规查询。
$ uname -a
Linux 3.10.0-229.7.2.el7.x86_64 #1 SMP Tue Jun 23 22:06:11 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
$ mysql --version
mysql Ver 14.14 Distrib 5.6.27, for Linux (x86_64) using EditLine wrapper
MySQL 会突然变得不稳定的任何原因?
如果由于某种原因,我们刚刚遇到 MySQL 的限制(可能是 InnoDB 问题),如果我们转移到 MariaDB 或 Persona Server(使用 XtraDB)会有帮助吗?
编辑 1:附加信息
我注意到的是在性能下降时有几个SELECT
查询。它们似乎不是任何大的资源密集型查询(最长大约需要 4 毫秒),但它们会突发出现,这可能就是问题所在。
“突发查询”看起来是有效的,而不是 DOS 攻击或 XSS 的结果。
**编辑 2:MySQL 配置*
$ cat /etc/my.cnf
[mysqld]
# Settings user and group are ignored when systemd is used.
# If you need to run mysqld under different user or group,
# customize your systemd unit file for mysqld
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
tmpdir=/var/mysqltmp
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
open_files_limit=50000
query_cache_size=2048M
max_connections=100
max_user_connections=25
wait_timeout=20
tmp_table_size=6144M
max_heap_table_size=6144M
thread_cache_size=64
key_buffer_size=8192M
max_allowed_packet=268435456
#table_cache=32768
table_open_cache=32768
table_definition_cache=32768
delayed_insert_timeout=20 # Turn on if max_connections being reached due to delayed inserts
delayed_queue_size=300 # Turn on if max_connections being reached due to delayed inserts
myisam_sort_buffer_size=512M # can be increased per sessions if needed for alter tables (indexes, repair)
query_cache_limit=32M # leave at default unless there is a good reason
query_cache_type=1
join_buffer=32M # leave at default unless there is a good reason
sort_buffer_size=32M # leave at default unless there is a good reason
read_rnd_buffer_size=16M # leave at default unless there is a good reason
read_buffer_size=32M # leave at default unless there is a good reason
collation_server=utf8_unicode_ci
character_set_server=utf8
general_log=0
log-output=TABLE # select * from mysql.general_log order by event_time desc limit 10;
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
innodb_file_per_table=1
innodb_buffer_pool_size=34406M
innodb_additional_mem_pool_size=7424M
innodb_log_buffer_size=7424M
innodb_thread_concurrency=8 # Number of physical + virtual CPU's, preset when server is provisioned to have correct # of cores
innodb_change_buffering=all
innodb_flush_log_at_trx_commit=0
innodb_support_xa=0
innodb_doublewrite = 0
default-storage-engine=MyISAM
[mysqld_safe]
#malloc-lib=/usr/lib64/libtcmalloc_minimal.so.4
malloc-lib=/usr/lib64/libtcmalloc_minimal.so.4
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
my.cnf
显示 default-storage-engine=MyISAM 但我创建的所有表都是 InnoDB。
环境
多少内存?48GB
使用InnoDB?是的
几个核心?8个