OneSQL :: 和Oracle一样的独立日志线程,在SATA盘上得到10倍事务性能提升!

MySQL的读操作性能相当优越,然后写性能则是相当让人伤心,为什么一定要用SSD才行呢?我们测过Oracle数据库在PCIE-Flash上的超强性能,觉得还是需要改进和优化一下MySQL。从体系结构上来讲,MySQL针对每个事务需要刷出两分日志(Binlog和InnoDB日志)是其根本的原因,并且都需要获得锁来进行串行处理。当有大量的会话需要提交事务时,在InnoDB层会有很严重的锁竞争情况,可能会消耗大量的SYS CPU资源,然而Oracle数据库的表现则相当地好,究竟差别在什么地方呢?

mysql_read_write_comparing

Oracle中独立的日志进程(LGWR)也许是性能的关键,用户进程只要将事务的日志写入到Log Buffer,然后等日志进程的持久化通知就行了,不会存在大量的会话抢占锁的情况。在MySQL中也有一个“master”进程,在高性能配置模式下,可以来每秒刷出InnoDB的日志,如果我们将日志刷出任务移到独立的线程中,并且可以在每个事务内存中提交后就通知这个独立的线程进行工作,而不是等一秒钟,是否可以提升MySQL中的事务处理性能呢?于是在OneSQL中设计了独立的日志刷出线程,不仅可以刷出InnoDB的日志,也可以刷出Binlog日志,和Oracle数据库一样,用户线程不再需要去抢锁资源了,只需要等待日志线程的通知就行了。在普通的SATA盘上测试事务性能,发现提高了整整10倍。

onesql_log_writer_improve

在同一台机器上恢然有整整10倍的性能,真有点不可理解。MySQL和OneSQL在完全相同的机器环境中测试,例用的是同样的测试用例,并且使用同样的并发度进行测试。

option
  user test/test@172.30.12.4:3306:test
  time 1m
  log /dev/null
declare
  vid int 1 10
begin
  update t_test set col2=col2 -1 where id = :vid;
end

当然MySQL是配置在最大数据保护模式(俗称双1模式)下,并且开启了Binlog。

[mysqld]
socket=/tmp/mysql2.sock
innodb_log_file_size=1g
innodb_buffer_pool_size=8g
max_connections=4096
log_bin
sync_binlog=1
binlog_format=row

在OneSQL里,每个客户端事务也要等对应的InnoDB和Binlog刷盘后才能返回, 和MySQL一样是运行在最大数据保护模式。这个改进对应用完全透明,并且多番测试下来,底层的磁盘越慢,提升的效果越明显。由此看来将OneSQL布到公有云的块设备上,将具有极大的事务处理性能优势。

已经有游戏用户布署了50多台OneSQL在公有云上,看中的就是事务处理性能的透明提升。