我有一个有点大的数据库服务器:4个处理器,32个内核,288GB RAM,2个绑定在一起的以太网卡,2个独立的RAID控制卡,每个1GB缓存,24个2.5“磁盘,8个SAS,15KRPM,在RAID10的数据分区中, 和 3 SSD, 在 RAID5 的 Journal 分区, 和 2 SAS, 15KRPM in RAID 1 for the operating system. 数据分区有它自己的 RAID 控制器, OS 和 Journal 共享另一张卡。
我正在运行 Ubuntu 12.04.1 LTS 和 MySQL 5.1.56 以及来自 Percona 的 InnoDB 插件 12.7。
MySQL向数据分区写入索引和数据文件;它向 Journal 分区写入二进制日志、慢速和错误日志以及 innodb 日志文件。
在过去的几周里,我一直在观察一些奇怪的行为:MySQL 减慢了对查询的响应速度,同时使“InnoDB 缓冲池页面写入”指标加倍。同时,我看到 InnoDB 日志缓冲区填满了正常工作负载的 5 倍。此外,我没有在图表上观察到任何互斥锁和锁授予活动的变化。
这是我当前的配置:
basedir=/usr/
datadir=/var/lib/mysql/data
tmpdir=/var/lib/mysql/tmp
server-id=1
socket=/var/run/mysqld/mysqld.sock
port=3306
user=mysql
pid-file=/var/run/mysqld/mysqld.pid
language=/usr/share/mysql/english
default-storage-engine=InnoDB
read_only
max_heap_table_size=256M
tmp_table_size=256M
table_cache=1024
thread_cache_size=64
thread_stack=1024K
max_allowed_packet=16M
max_connections=255
max_user_connections=250
skip-external-locking
skip-slave-start
master-info-file=/var/lib/mysql/relay/master.info
relay-log=/var/lib/mysql/relay/relay-bin
relay-log-index=/var/lib/mysql/relay/relay-bin.index
relay-log-info-file=/var/lib/mysql/relay/relay-log.info
log-slave-updates=1
expire_logs_days=1
sync_binlog=1
max_binlog_size=1G
binlog-format=MIXED
log-bin=/var/lib/mysql/binary/mysqld-binlog
log-bin-index=/var/lib/mysql/binary/mysqld-binlog.index
log-warnings=2
log-error=/var/lib/mysql/mysqld-err.log
slow-query-log
log_slow_slave_statements=1
log_slow_timestamp_every=1
slow_query_log_microseconds_timestamp=1
log_slow_verbosity=full
long-query-time=0.05
slow-query-log-file=/var/lib/mysql/mysqld-slow.log
innodb_adaptive_flushing=1
innodb_additional_mem_pool_size=20M
innodb_buffer_pool_size=16G
innodb_data_file_path=ibdata1:20M:autoextend
innodb_data_home_dir=/var/lib/mysql/data
innodb_doublewrite_file=/var/lib/mysql/journal/ib_doublewrite
innodb_fast_shutdown=0
innodb_file_per_table
innodb_flush_log_at_trx_commit=1
innodb_flush_method=O_DIRECT
innodb_io_capacity=1500
innodb_log_group_home_dir=/var/lib/mysql/journal/
innodb_max_dirty_pages_pct=75
innodb_open_files=1024
innodb_rollback_on_timeout
innodb_thread_concurrency=20
query_cache_size=0
query_cache_type=0
key-buffer-size=200M
server-id=233111
sql-mode=NO_AUTO_CREATE_USER
max_connections=850
max_user_connections=800
read-only
table-open-cache=1300
log-error=/var/lib/mysql/log/dbserver-err.log
slow-query-log-file=/var/lib/mysql/log/dbserver-slow.log
relay-log=/var/lib/mysql/relay/dbserver-relay-bin
relay-log-index=/var/lib/mysql/relay/dbserver-relay-bin.index
relay-log-info-file=/var/lib/mysql/relay/dbserver-relay-log.info
log-bin=/var/lib/mysql/binary/dbserver-mysqld-binlog
log-bin-index=/var/lib/mysql/binary/dbserver-mysqld-binlog.index
relay_log_purge=0
innodb_buffer_pool_size=240G
innodb_log_buffer_size=2G
innodb_log_file_size=4G
large-pages
这是我当前的文件系统组织:
SSD RAID5, Controller #0
/var/lib/mysql/journal -> /srv/mysql/ssd/journal
/var/lib/mysql/log -> /srv/mysql/ssd/log
/var/lib/mysql/relay -> /srv/mysql/ssd/relay
/var/lib/mysql/tmp -> /srv/mysql/ssd/tmp
SAS RAID 10, Controller #1
/var/lib/mysql/backup -> /srv/mysql/sas/backup
/var/lib/mysql/binary -> /srv/mysql/ssd/binary
/var/lib/mysql/data -> /srv/mysql/sas/data
你能帮我理解我的数据库服务器发生了什么吗?为什么它会减慢服务速度并增加 InnoDB 缓冲池写入活动?
我所描述的症状与我的 InnoDB 缓冲池中的脏页刷新问题相匹配。当 InnoDB 回收其中一个日志文件时,脏页会从 InnoDB 缓冲池中清除。这会导致将数据页大量刷新到磁盘,从而导致 I/O 突发。
下面的链接提出了对该问题的一些见解。
http://www.mysqlperformanceblog.com/2008/11/13/adaptive-checkpointing/ http://dimitrik.free.fr/blog/archives/07-01-2010_07-31-2010.html http://www .chriscalender.com/?p=201
解决方案通过选择: