本博客记录作者在工作与研究中所经历的点滴,一方面给自己的工作与生活留下印记,另一方面若是能对大家有所帮助,则幸甚至哉矣!

简介

鉴于高频中心库task部分占用机器较多,为节省成本,调研数据库或缓存。在数据库选型之MySQL(二)中,在固态硬盘本地访问MySQL可以满足其10000次/s操作的需求,由于实际环境中存在多个品种(多进程、多线程访问数据库)的业务需求,因此,本文采用多线程在固态硬盘本地访问MySQL展开测试,以期对高频中心库后期架构调整提供实践参考。需要指出,本文作者对该种节省成本的解决方案是不赞成的。

测试环境

硬件环境

10.1.120.34:Intel Core I5-4590, 主频:3.30G,  内存:16G, 有固态硬盘

软件环境:

10.1.120.34: Cent OS 6.5,  MySQL 5.6.26 (社区版)

性能测试

针对高频生产的应用需求,本文构造高频中心库系统的数据结构,采用多线程模拟业务需求对本地节点MySQL进行写入操作,分别存储数据总量为60K、100K、600K条数据,对其速率进行测试。需要指出,由于常见I/O访问的瓶颈主要受限于写入测试,本文只针对写入操作进行测试,暂不考虑读取操作或者混合读写方式,若写入操作不满足要求,其它操作无需测试。

因为10.1.120.34上采用固态硬盘作为存储介质,其安装有MySQL,根据应用场景,分别从10、20、30个线程并发访问MySQL 展开测试。

测试整个结果见图-1:

图-1 完整测试结果

10个线程

从10个线程执行事务处理,需要指出,事务处理数据量固定为1000,以下多线程情况与之类同,不再赘述,10个线程的平均速率见表-1。

表-1  10个线程下每个线程平均访问MySQL测试结果

节点

数据库IP

数据量(K)

平均写入速率(条/s)

本地节点

10.1.120.34

60

4085

本地节点

10.1.120.34

100

4607

本地节点

10.1.120.34

600

3021

20个线程

从20个线程执行事务处理,20个线程的平均速率见表-2。

表-2  20个线程下每个线程平均访问MySQL测试结果

节点

数据库IP

数据量(K)

平均写入速率(条/s)

本地节点

10.1.120.34

60

1945

本地节点

10.1.120.34

100

2149

本地节点

10.1.120.34

600

1525

30个线程

从30个线程执行事务处理,30个线程的平均速率见表-3。

表-3  30个线程下每个线程平均访问MySQL测试结果

节点

数据库IP

数据量(K)

平均写入速率(条/s)

本地节点

10.1.120.34

60

1266

本地节点

10.1.120.34

100

1461

本地节点

10.1.120.34

600

879

小结

从表1-3可知:1)随着线程数目增加,线程平均写入速率会减小,而且还很明显;2)随着访问的数据量的增加,以10万条至60万条为例,每个线程平均访问其速率下降也很明显。

本文测试结果对高频中心库后续架构调整提供有一些实践参考,若以平均速率乘以线程个数来衡量,则该高频生产情形是满足需求的,但是若出现不平衡状况,则为节省成本采用将数据在固态硬盘本地入库落地来生产,然后辅以redis作为缓存来缓解访问系统访问压力的解决方案,本文作者是不赞成这种该方案的,希望对有类似业务需求的朋友有所帮助。

附录:

测试部分程序源代码:

1 importjava.sql.Date;2 importjava.math.BigDecimal;3

4 public classTransaction {5 privateDate tradedate;6 privateString symbol;7 privateString symbolName;8 privateString trdmintime;9 privateBigDecimal startprice;10 privateBigDecimal highprice;11 privateBigDecimal lowprice;12 privateBigDecimal endprice;13 privateBigDecimal change;14 privateBigDecimal changeratio;15 privateBigDecimal minvolume;16 privateBigDecimal minamout;17 private longunix;18 privateString market;19

20 publicTransaction(Date tradedate,21 String symbol,22 String symbolName,23 String trdmintime,24 BigDecimal startprice,25 BigDecimal highprice,26 BigDecimal lowprice,27 BigDecimal endprice,28 BigDecimal change,29 BigDecimal changeratio,30 BigDecimal minvolume,31 BigDecimal minamout,32 longunix,33 String market)34 {35 this.symbol =symbol;36 this.symbolName =symbolName;37 this.trdmintime =trdmintime;38 this.startprice =startprice;39 this.highprice =highprice;40 this.lowprice =lowprice;41 this.endprice =endprice;42 this.change =change;43 this.changeratio =changeratio;44 this.minvolume =minvolume;45 this.minamout =minamout;46 this.unix =unix;47 this.market =market;48 }49

50 public voidsetTradedate(Date tradedate) {51 this.tradedate =tradedate;52 }53

54 public voidsetSymbol(String symbol) {55 this.symbol =symbol;56 }57

58 public voidsetSymbolName(String symbolName) {59 this.symbolName =symbolName;60 }61

62 public voidsetTrdmintime(String trdmintime) {63 this.trdmintime =trdmintime;64 }65

66 public voidsetStartprice(BigDecimal startprice) {67 this.startprice =startprice;68 }69

70 public voidsetHighprice(BigDecimal highprice) {71 this.highprice =highprice;72 }73

74 public voidsetLowprice(BigDecimal lowprice) {75 this.lowprice =lowprice;76 }77

78 public voidsetEndprice(BigDecimal endprice) {79 this.endprice =endprice;80 }81

82 public voidsetChange(BigDecimal change) {83 this.change =change;84 }85

86 public voidsetChangeratio(BigDecimal changeratio) {87 this.changeratio =changeratio;88 }89

90 public voidsetMinvolume(BigDecimal minvolume) {91 this.minvolume =minvolume;92 }93

94 public voidsetMinamout(BigDecimal minamout) {95 this.minamout =minamout;96 }97

98 public void setUnix(longunix) {99 this.unix =unix;100 }101

102 public voidsetMarket(String market) {103 this.market =market;104 }105

106 publicDate getTradedate() {107 returntradedate;108 }109

110 publicString getSymbol() {111 returnsymbol;112 }113

114 publicString getSymbolName() {115 returnsymbolName;116 }117

118 publicString getTrdmintime() {119 returntrdmintime;120 }121

122 publicBigDecimal getStartprice() {123 returnstartprice;124 }125

126 publicBigDecimal getHighprice() {127 returnhighprice;128 }129

130 publicBigDecimal getLowprice() {131 returnlowprice;132 }133

134 publicBigDecimal getEndprice() {135 returnendprice;136 }137

138 publicBigDecimal getChange() {139 returnchange;140 }141

142 publicBigDecimal getChangeratio() {143 returnchangeratio;144 }145

146 publicBigDecimal getMinvolume() {147 returnminvolume;148 }149

150 publicBigDecimal getMinamout() {151 returnminamout;152 }153

154 public longgetUnix() {155 returnunix;156 }157

158 publicString getMarket() {159 returnmarket;160 }161

162 }

Class Transaction

1 importjava.sql.Date;2 importcom.gta.mysql.Transaction;3 importcom.gta.mysql.Test;4

5 public class RunThread extendsThread {6 privateTransaction ts;7 private intsymbolData;8 privateTest test;9

10 public RunThread(Transaction ts, intsymbolData, Test test) {11 this.ts =ts;12 this.symbolData =symbolData;13 this.test =test;14 }15

16

17 public voidrun()18 {19 long start =getRunTime();20 for(int i = 0; i < ThreadTest.NUM*1000; i++) {21 ts.setTradedate(newDate(System.currentTimeMillis()));22 ts.setSymbol(Integer.toString(symbolData));23 symbolData++;24 ts.setSymbolName("中国银行");25 ts.setUnix(ts.getUnix()+1);26 test.insertData(ts);27 }28 long end =getRunTime();29

30 System.out.println(ThreadTest.NUM*1000*1000/(end-start));31 }32

33

34 public longgetRunTime()35 {36 returnSystem.currentTimeMillis();37 }38

39 }

Class RunThread

1 importjava.math.BigDecimal;2 importjava.math.RoundingMode;3 importcom.gta.mysql.Test;4 importcom.gta.mysql.Transaction;5

6 public classThreadTest {7 public static int MAX = 10;8 public static int NUM = Test.FIX/MAX;9

10

11 public static voidmain(String[] args) {12

13 Transaction [] ts = newTransaction[ThreadTest.MAX];14 Test []test = newTest[ThreadTest.MAX];15 int symbol = 100000;16 for (int i = 0; i < ts.length; i++) {17 ts[i] = new Transaction(null,18 "",19 "",20 "010000",21 new BigDecimal(15.857).setScale(3, RoundingMode.HALF_UP),22 new BigDecimal(18.550).setScale(3, RoundingMode.HALF_UP),23 new BigDecimal(13.147).setScale(3, RoundingMode.HALF_UP),24 new BigDecimal(16.383).setScale(3, RoundingMode.HALF_UP),25 new BigDecimal(0.151).setScale(3, RoundingMode.HALF_UP),26 new BigDecimal(1.550).setScale(3, RoundingMode.HALF_UP),27 new BigDecimal(5000000).setScale(3, RoundingMode.HALF_UP),28 new BigDecimal(500000000).setScale(3, RoundingMode.HALF_UP),29 System.currentTimeMillis(),30 "SSE");31 test[i] = newTest();32

33 }34

35

36 RunThread[] thread = newRunThread[ThreadTest.MAX];37 for (int i = 0; i < thread.length; i++) {38 test[i].initMySQL();39 thread[i] = newRunThread(ts[i], symbol, test[i]);40 symbol += ThreadTest.NUM*1000;41 }42

43 for (int i = 0; i < thread.length; i++)44 thread[i].start();45

46 while (true) {47 try{48 Thread.sleep(1000);49 } catch(InterruptedException e) {50 e.printStackTrace();51 test[0].down();52 }53 }54

55 }56

57 }

ThreadTest

作者:志青云集

出处:http://www.cnblogs.com/lyssym

如果,您认为阅读这篇博客让您有些收获,不妨点击一下右下角的【推荐】。

如果,您希望更容易地发现我的新博客,不妨点击一下左下角的【关注我】。

如果,您对我的博客所讲述的内容有兴趣,请继续关注我的后续博客,我是【志青云集】。

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。

mysql 多线程_数据库选型之MySQL(多线程并发)相关推荐

  1. es mysql 预处理_数据库选型之MySQL vs ElasticSearch

    前言 应用系统通常需要借助数据预处理(如物化视图等)来实现数据查询加速的需求.目前业界主流数据库主要有以下两大类,一种是基于传统RDBMS关系型数据库来实现:另一种是基于NoSQL非关系型数据库来实现 ...

  2. navicat for mysql 事件_[数据库] Navicat for MySQL事件Event实现数据每日定期操作

    在我们操作数据库过程中,通常会遇到一些某个时间点操作数据库的问题,例如: (1).每天凌晨12点对数据库进行定时备份,结算和汇总: (2).每天凌晨2点删除数据库前三天的数据: (3).插入某个数据超 ...

  3. linux如何mysql实现导出数据库,Linux下MySQL导入导出数据库

    linux下 一.导出数据库用mysqldump命令(注意mysql的安装路径,即此命令的路径): 1.导出数据和表结构: mysqldump -u用户名 -p密码 数据库名 > 数据库名.sq ...

  4. mysql多核还是高频_数据库选型:多核还是多线程?

    数据库选型,是用多核主机还是多线程主机?我是否可以用比较便宜的单核超线程(Hyper-Threading,HT)的机器,来替代双核非HT的机器? 回答这个问题,我们由浅入深的来看. 一,术语: 槽位( ...

  5. centos 查看mysql 服务器配置_在CentOS上MySQL数据库服务器配置方法

    http://www.jb51.net/article/23255.htm ======================== 1 . 无密码登录: mysql -u root 在已经有密码的情况下报错 ...

  6. xshell安装mysql步骤_数据库Mysql与禅道安装

    一.Linux上搭建禅道 Mysql 是关系型数据库管理系统 1.下载安装包:将安装包直接解压到/opt目录下,不要 解压到别的目录在拷贝到/opt/,因为这样会导致文件的所有者和读写权限改变 2.解 ...

  7. loadrunner mysql性能测试_运用Loadrunner测试Mysql数据库性能 TRON•极客

    1.前言 针对数据库的性能测试,loadrunner本身支持sql server和oracle数据库,这两种数据库可以用loadrunner直接录制进行测试.而我们项目中使用的是mysql数据库,针对 ...

  8. mysql 9.0创建数据库_数据库基础学习——MySQL数据库知识小结(9)

    1 MySQL 中的约束 1.1约束类型 • 非空约束(not null) • 唯一性约束(unique) • 主键约束(primary key) PK • 外键约束(foreign key) FK ...

  9. 马哥数据库mysql笔记_马哥笔记-mysql

    反关系模型:NoSQL MongoDB Redis HBase MySQL版本: Community Edition Enterprise Edition 软件包格式: mysql, mysql-se ...

最新文章

  1. 2020-12-17 【 java优先队列的用法】
  2. *LOJ#2085. 「NOI2016」循环之美
  3. 可编程led灯带原理_88张图搞定层板灯带的设计、安装、收口及检修!
  4. vue :class 动态绑定样式_Vue 在哪些方面做的比 React 更好?
  5. 图像处理中的通信原理——冈萨雷斯读书笔记(一)
  6. 这几天工作的总结,(手机前端
  7. 数独基本规则_思维训练|数独入门第五课:唯余解法
  8. Python实现Matlab绘制散点图
  9. matlab人脸识别论文,基于matlab的人脸识别系统设计本科毕业论文(设计).doc
  10. 安卓学习 布局篇 Android studio
  11. 关于-O0、O1、O2、O3优化
  12. 黑苹果(Hackintosh)简单步骤教程
  13. 记Aspose.Word的使用中出现的问题
  14. 从表征到行动---意向性的自然主义进路(续八)
  15. JAVA计算机毕业设计菜鸟驿站快递分发系统Mybatis+系统+数据库+调试部署
  16. Java 之 数据库
  17. BZOJ4899: 记忆的轮廓 期望DP 决策单调性
  18. 亚马逊的推广包括站内推广和站外推广
  19. axios的实例拦截器和全局拦截器关系。
  20. Ubuntu(Linux)使用Simple Screen Recorder录屏

热门文章

  1. 美多商城之订单(我的订单)
  2. 动态划分VLAN的方法中不包括(23)。【答案】C
  3. 网络空间安全:社会工程学之信息追踪——学习笔记 利用搜索引擎追踪!
  4. Pytorch:使用DCGAN实现数据复制
  5. 使用 Pytorch 进行多类图像分类
  6. 在OpenCV中基于深度学习的边缘检测
  7. 【OpenCV 4开发详解】可分离滤波
  8. druid+spring配置
  9. CoCreateInstance(转)
  10. hdu-1847-畅桶工程续