书接上回。
上篇中测试了一个事务提交一条数据的情况,但现实中一个事务往往操作多条记录(增删改)。产生的磁盘IO比一个事务提交一条数据多了不少。
下文中测试一个事务提交10条数据的情况,主要和上篇中的测试结果对比,看一下趋势。
以下基于pg 11.6测试的结果,测试开关事务为500000,每次事务提交十条数据。
- PGDATA存储在虚拟机挂在的磁盘中
线程数 | 事务方式 | 所有线程总耗时合计 | TPS |
---|---|---|---|
1 | 普通事务 | 1028293 | 486 |
1 | 普通事务 | 1023322 | 489 |
1 | 两阶段 | 1506393 | 332 |
1 | 两阶段 | 1483806 | 337 |
10 | 普通事务 | 1663607 | 3006 |
10 | 普通事务 | 1667904 | 2998 |
10 | 两阶段 | 2560134 | 1953 |
10 | 两阶段 | 2518882 | 1985 |
20 | 普通事务 | 2567368 | 3895 |
20 | 普通事务 | 2560740 | 3905 |
20 | 两阶段 | 3273503 | 3055 |
20 | 两阶段 | 3237924 | 3088 |
同样,磁盘实在是烂,所以再测试一个数据放在内存中的数据。
- PGDATA存储在/dev/shm"内存"中
线程数 | 事务方式 | 所有线程总耗时合计 | TPS |
---|---|---|---|
1 | 普通事务 | 488569 | 1023 |
1 | 普通事务 | 534670 | 935 |
1 | 两阶段 | 575160 | 869 |
1 | 两阶段 | 594215 | 841 |
10 | 普通事务 | 764146 | 6543 |
10 | 普通事务 | 764494 | 6540 |
10 | 两阶段 | 850754 | 5877 |
10 | 两阶段 | 827988 | 6038 |
20 | 普通事务 | 1992769 | 5018 |
20 | 普通事务 | 1984047 | 5040 |
20 | 两阶段 | 2079837 | 4808 |
20 | 两阶段 | 2064065 | 4845 |
结论
两阶段提交相对于普通事务提交的达成率
先来看图,以普通事务的效率为1,两阶段对比普通事务的达成率如下。
两阶段对比普通事务的达成率- 看三条蓝色柱,更新单条数据时,与并发无关,达成率稳定在50%,即两阶段的效率是普通事务的一半。
- 看每个并发中的,蓝色柱和灰色柱的比较或者橙色柱和黄色柱的对比,可以发现:当单个事务更新记录增加时,两阶段对比普通事务的达成率增加。即:两阶段所产生的性能下降,由于更新数据的条数增加,影响被稀释。
- 看黄色柱,当IO性能提升后,高并发情况下,两阶段相对于普通事务的性能达成率接近100%。
再来看一下,TPS绝对值
- IO很差,更新记录少(穷得很,设备老旧)
普通事务可以达到每秒14350次事务提交,两阶段可以达到7152次事务提交,如果系统按二八原则运行,每天满负荷运行白天(8小时)的20%时间。
//普通事务
14350 事务/秒 * 8小时 * 3600秒/小时 * 0.2(二八原则) = 8265万次事务提交
//两阶段提交
7152 事务/秒 * 8小时 * 3600秒/小时 * 0.2(二八原则) = 4119万次事务提交
- IO很差,更新记录多(依旧穷得很,设备老旧)
普通事务可以达到每秒3900次事务提交,两阶段可以达到3071次事务事务提交,如果系统按二八原则运行,每天满负荷运行白天(8小时)的20%时间。
//普通事务
3900 事务/秒 * 8小时 * 3600秒/小时 * 0.2(二八原则) = 2246万次事务提交
//两阶段提交
3071 事务/秒 * 8小时 * 3600秒/小时 * 0.2(二八原则) = 1769万次事务提交
- IO非常好,更新记录少(公司壕无人性,不差钱)
普通事务可以达到每秒41165次事务提交,两阶段可以达到28438次事务事务提交,如果系统按二八原则运行,每天满负荷运行白天(8小时)的20%时间。
//普通事务
41165 事务/秒 * 8小时 * 3600秒/小时 * 0.2(二八原则) = 23711万次事务提交
//两阶段提交
28438 事务/秒 * 8小时 * 3600秒/小时 * 0.2(二八原则) = 16380万次事务提交
- IO非常好,更新记录多(公司壕无人性,不差钱)
普通事务可以达到每秒5029次事务提交,两阶段可以达到4826次事务事务提交,如果系统按二八原则运行,每天满负荷运行白天(8小时)的20%时间。
//普通事务
5029 事务/秒 * 8小时 * 3600秒/小时 * 0.2(二八原则) = 2896万次事务提交
//两阶段提交
4826 事务/秒 * 8小时 * 3600秒/小时 * 0.2(二八原则) = 2780万次事务提交
以上数据还只是单PG数据库的性能数据,对于非互联网乃至于小型互联网企业都是完全够用的。
建议
如果业务可以妥协,不要用任何一种分布式事务。
如果必须用分布式事务,不要直接否定某一种方案,要基于自己的业务实际情况进行分析,从而找到最适合自己的方案。
例如,我们目前面临的问题,每天不到千万业务量接口调用量,数据库给到了几十套,单纯讨论性能上考虑的话,两阶段提交是完全够用的。
防杠声明
本内容只是针对两阶段和普通事务的提交效率进行了对比,不讨论其他风险。
网友评论