我们公司正在生产中使用TokuDB
,我们在尝试减轻从属服务器的延迟方面遇到了很多问题。这很奇怪,因为我们谈论的行很少……但对于一些数据,它就会延迟。
从属是只读数据库。
如需更多信息,我们使用:
中央处理器:Intel(R) Core(TM) i5-2400 CPU @ 3.10GHz(4 核)
内存: 16 GB
硬盘: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
答案1
我认为这个问题已经解决了,这要归功于@symcbean 的帮助。
我禁用了屏障,设置了数据=有序,使用了异步提交和校验和。最后,我们迁移到了 MariaDB,但仍然使用 TokuDB
我忘了说了tokudb_cache_size = 8G
,我们还按照 TokuDB 的建议设置了 50% 的物理内存