问
当增加并发后, tps会增加, 那系统iops是增加还是减少呢?
我第一反应是增加, 毕竟事务变多了, 写的数据肯定多了卅, 那iops肯定增加卅.
如下是我测试的只写事务.
环境
主机: CVM 4C8G centos7.6 PAGESIZE=4096
数据库关键参数:
innodb_flush_log_at_trx_commit = 1
autocommit = ON
innodb_buffer_pool_size = 4.5G
innodb_log_buffer_size = 64M
innodb_page_size=16K
测试工具: sysbench 1.0.17
表数据量: 10*100000
注: 为了方便观察, 仅压测只写事务
现象复现
(注意: 压测工具和数据库在同一台服务器上,对性能有影响, 但不影响本次实验)
(root@127.0.0.1) [(none)]> select * from sys.io_global_by_wait_by_latency where event_name in ('sql/binlog','innodb/innodb_data_file','innodb/innodb_log_file') order by 2 desc ;
+-------------------------+-------+---------------+-------------+-------------+--------------+---------------+--------------+------------+------------+-----------+-------------+---------------+-------------+
| event_name | total | total_latency | avg_latency | max_latency | read_latency | write_latency | misc_latency | count_read | total_read | avg_read | count_write | total_written | avg_written |
+-------------------------+-------+---------------+-------------+-------------+--------------+---------------+--------------+------------+------------+-----------+-------------+---------------+-------------+
| innodb/innodb_data_file | 1506 | 100.97 ms | 67.05 us | 67.56 ms | 7.11 ms | 23.27 ms | 70.59 ms | 1284 | 22.08 MiB | 17.61 KiB | 87 | 50.59 MiB | 595.49 KiB |
| innodb/innodb_log_file | 27 | 4.84 ms | 179.22 us | 1.60 ms | 43.08 us | 65.03 us | 4.73 ms | 7 | 68.50 KiB | 9.79 KiB | 4 | 2.00 KiB | 512 bytes |
| sql/binlog | 21 | 2.27 ms | 108.22 us | 1.17 ms | 5.75 us | 14.62 us | 2.25 ms | 4 | 611 bytes | 153 bytes | 2 | 194 bytes | 97 bytes |
+-------------------------+-------+---------------+-------------+-------------+--------------+---------------+--------------+------------+------------+-----------+-------------+---------------+-------------+
3 rows in set (0.01 sec)
(root@127.0.0.1) [(none)]>
4并发
TPS: 800
WIOPS: 3200
8并发
TPS 1200
WIOPS 3000
80并发
TPS 1500
WIOPS 800 (有波动)
800并发
TPS 1400
WIOPS 250
(是不是和想象的不一样....)
原因分析
汇总下: 并发数增多后, innodb/innodb_log_file 事件反而减少了, 但是平均延迟却增大了, 每次写入的数据量也增大了.
因为innodb_flush_log_at_trx_commit =1, 也就是每次事务提交前都要刷盘, 每次刷盘是把整个innodb_log_buffer都写入redo里面(包括其它事务), 所以并发增加后, 每次刷盘所包含的事务也就更多了(total次数减少), 数据量也大了(avg_written增大). 宏观来看就是写iops减少了. 那是不是并发越多性能越好呢, 肯定不是卅, 本次实验800并发的时候TPS已经开始降下来了, 连接本身占用的资源就多, 应该是个正态分布.
详情如下:
结论
仅针对本次实验
并发数越多, IO利用率越高(iops越低). 主要是redo log的原因.
参考文章