我们公司正在TokuDB
生产中使用,我们在试图减轻奴隶的滞后时遇到了很多问题。很奇怪,因为我们谈论的行很少......但是有一些数据它会滞后。
Slave 是一个只读的 DB。
有关更多信息,我们正在使用:
CPU:Intel(R) Core(TM) i5-2400 CPU @ 3.10GHz(4 核)
内存:16Gb
硬盘:2Tb ST2000DM001(EXT4 文件系统)
在这里您可以看到一些 I/O 性能输出。我把它贴在这篇文章的外面,因为我认为这样会更容易阅读。
iostat -x 1
输出,当我们遇到滞后情况时
http://paste.laravel.com/bjv
fio
, 对于磁盘 I/O:
http://paste.laravel.com/bjG
我们做了一些磁盘调整,摘自 Steven Corona 的书http://www.scalingphpbook.com:
- 将 I/O 调度程序更改为
noop
. - 关闭文件系统访问时间,
noatime
并nodiratime
在/etc/fstab
- 增加了打开文件的数量,在
/etc/security/limits.conf
:
* soft nofile 999999 * hard nofile 999999
我们在配置中做了一些调整:
掌握
# * Query Cache Configuration
query_cache_limit = 0
query_cache_size = 0
query_cache_type = 0
innodb_file_per_table = 1
innodb_file_format = barracuda
innodb_flush_method = O_DIRECT
innodb_flush_log_at_trx_commit = 1
innodb_log_file_size = 128M
innodb_buffer_pool_size = 13500M
innodb_read_io_threads = 16
innodb_write_io_threads = 16
innodb_io_capacity = 180
innodb_thread_concurrency = 4
奴隶
# * Query Cache Configuration
query_cache_limit = 0
query_cache_size = 0
query_cache_type = 0
innodb_file_per_table = 1
innodb_file_format = barracuda
innodb_flush_method = O_DIRECT
innodb_flush_log_at_trx_commit = 2
sync_binlog = 1
innodb_log_file_size = 128M
innodb_buffer_pool_size = 13500M
innodb_read_io_threads = 16
innodb_write_io_threads = 16
innodb_io_capacity = 180
innodb_thread_concurrency = 4
由于@symcbean 的帮助,我认为这已经解决了。
我禁用了障碍,设置了 data=ordered,使用了异步提交和校验和。最后,我们迁移到 MariaDB,但仍然有 TokuDB
我忘了说,我们还设置
tokudb_cache_size = 8G
了 50% 的物理内存,正如 TokuDB 所推荐的