您现在的位置是:主页 > news > 泰州网站建设服务热线/网络推广代理

泰州网站建设服务热线/网络推广代理

admin2025/4/21 5:08:36news

简介泰州网站建设服务热线,网络推广代理,虎门镇网站建设,wordpress 不显示菜单本博客记录作者在工作与研究中所经历的点滴,一方面给自己的工作与生活留下印记,另一方面若是能对大家有所帮助,则幸甚至哉矣!简介鉴于高频中心库task(核心业务处理与存储逻辑)部分占用机器较多,为节省成本,…

泰州网站建设服务热线,网络推广代理,虎门镇网站建设,wordpress 不显示菜单本博客记录作者在工作与研究中所经历的点滴,一方面给自己的工作与生活留下印记,另一方面若是能对大家有所帮助,则幸甚至哉矣!简介鉴于高频中心库task(核心业务处理与存储逻辑)部分占用机器较多,为节省成本,…

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

简介

鉴于高频中心库task(核心业务处理与存储逻辑)部分占用机器较多,为节省成本,调研数据库或缓存,以期满足高频生产的需求:1)峰值1w条/s;2)峰值60w条/m。本着节省成本的角度,本文对开源、免费的数据库MySQL在固态硬盘下从事务处理条目下展开测试,测试目标平均写入速率达10000条/s 以上则能满足要求。

测试环境

硬件环境

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

软件环境:

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

表结构:

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

1 DROP TABLE IF EXISTS `transaction`;2 CREATE TABLE `transaction` (3 `tradedate` datetime DEFAULT NOT NULL,4 `symbol` varchar(6) DEFAULT NOT NULL,5 `symbolname` varchar(8) DEFAULT NOT NULL,6 `trdmintime` varchar(6) DEFAULT NOT NULL,7 `startprice` decimal(9,3) DEFAULT NOT NULL,8 `highprice` decimal(9,3) DEFAULT NOT NULL,9 `lowprice` decimal(9,3) DEFAULT NOT NULL,10 `endprice` decimal(9,3) DEFAULT NOT NULL,11 `change` decimal(9,3) DEFAULT NOT NULL,12 `changeratio` decimal(6,3) DEFAULT NOT NULL,13 `minvolume` decimal(10,0) DEFAULT NOT NULL,14 `minamout` decimal(16,3) DEFAULT NOT NULL,15 `unix` bigint(20) DEFAULT NOT NULL,16 `market` varchar(3) DEFAULT NOT NULL

17 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

table transaction

配置文件:即数据库配置文件,见/etc/my.cnf

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

1 # read_rnd_buffer_size =2M2 datadir=/var/lib/mysql3 socket=/var/lib/mysql/mysql.sock4 innodb_flush_log_at_trx_commit = 2

5 innodb_autoinc_lock_mode = 2

6 query_cache_type = 1

7 query_cache_size =20M8 innodb_buffer_pool_size =2G9 innodb_flush_method =O_DSYNC10 # Disabling symbolic-links is recommended to prevent assorted security risks11 symbolic-links=0

my.cnf

性能测试

事务处理

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

本文采用写入多条数据执行事务处理。因为10.1.120.34上采用固态硬盘作为存储介质,其安装有MySQL,根据应用场景,第一种从远程访问,即测试主机10.1.25.50访问MySQL,第二种从本地访问10.1.120.34访问MySQL。以下分别从事务处理条目为1000、2000和3000下展开测试。

以1000条数据为基础执行事务处理,结果见表-1。

表-1  1000条下事务处理MySQL测试结果

节点

数据库IP

数据量(K)

平均写入速率(条/s)

远程节点

10.1.120.34

60

2328

远程节点

10.1.120.34

100

2366

远程节点

10.1.120.34

600

2372

本地节点

10.1.120.34

60

14936

本地节点

10.1.120.34

100

16526

本地节点

10.1.120.34

600

21169

以2000条数据为基础执行事务处理,结果见表-2。

表-2  2000条下事务处理MySQL测试结果

节点

数据库IP

数据量(K)

平均写入速率(条/s)

远程节点

10.1.120.34

60

2318

远程节点

10.1.120.34

100

2333

远程节点

10.1.120.34

600

2320

本地节点

10.1.120.34

60

12714

本地节点

10.1.120.34

100

17914

本地节点

10.1.120.34

600

20214

以3000条数据为基础执行事务处理,结果见表-3。

表-3  3000条下事务处理MySQL测试结果

节点

数据库IP

数据量(K)

平均写入速率     (条/s)

远程节点

10.1.120.34

60

2319

远程节点

10.1.120.34

100

2377

远程节点

10.1.120.34

600

2429

本地节点

10.1.120.34

60

11202

本地节点

10.1.120.34

100

17587

本地节点

10.1.120.34

600

18577

小结

从表1-3可知:1)在远程节点访问MySQL,即使采用固态硬盘,其速率还是较慢,无法满足需求;2)在本地节点,访问MySQL,则能够满足高频生产的需求。

批处理

为比较批处理方式和事务处理方式的性能,本文针对其进行比较测试。

每1000条数据,执行一次批处理,测试结果如表-4。

表-4  1000条下批处理与事务处理MySQL测试结果

方式

数据库IP

数据量(K)

平均写入速率(条/s)

批处理

10.1.120.34

60

15974

批处理

10.1.120.34

100

16328

批处理

10.1.120.34

600

17633

事务处理

10.1.120.34

60

14936

事务处理

10.1.120.34

100

16526

事务处理

10.1.120.34

600

21169

每2000条数据,执行一次批处理,测试结果如表-5。

表-5  2000条下批处理与事务处理MySQL测试结果

方式

数据库IP

数据量(K)

平均写入速率(条/s)

批处理

10.1.120.34

60

14840

批处理

10.1.120.34

100

16310

批处理

10.1.120.34

600

17364

事务处理

10.1.120.34

60

12714

事务处理

10.1.120.34

100

17914

事务处理

10.1.120.34

600

20214

每3000条数据,执行一次批处理,测试结果如表-6。

表-6  3000条下批处理与事务处理MySQL测试结果

节点

数据库IP

数据量(K)

平均写入速率(条/s)

批处理

10.1.120.34

60

14641

批处理

10.1.120.34

100

16371

批处理

10.1.120.34

600

17593

事务处理

10.1.120.34

60

11202

事务处理

10.1.120.34

100

17587

事务处理

10.1.120.34

600

18577

小结

从表4-6测试结果来看,在写入数据量少时,批处理方式较事务方式速率快一些,但是随着访问数据量增加,事务处理方式稍微快一些。

总结

从上述测试结果来看,以固态硬盘作为存储介质,在本地访问MySQL可以满足高频生产的需求。此外,鉴于高频生产高负载的需求,优先选择事务处理方式。

附录:

测试部分源代码:

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

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 Transcation

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

1 import java.sql.*;2 importjava.math.BigDecimal;3 importjava.math.RoundingMode;4

5 public classTest {6 public static int PREFIX = 1000; //批处理量

7 public static int FIX = 600; //操作数据 K

8 privateConnection conn;9 privatePreparedStatement pstm;10 privateString sql;11 private intcount;12

13 public static voidmain(String[] args) {14 //TODO Auto-generated method stub

15

16 Transaction ts = new Transaction(null,17 "",18 "",19 "010000",20 new BigDecimal(15.857).setScale(3, RoundingMode.HALF_UP),21 new BigDecimal(18.550).setScale(3, RoundingMode.HALF_UP),22 new BigDecimal(13.147).setScale(3, RoundingMode.HALF_UP),23 new BigDecimal(16.383).setScale(3, RoundingMode.HALF_UP),24 new BigDecimal(0.151).setScale(3, RoundingMode.HALF_UP),25 new BigDecimal(1.550).setScale(3, RoundingMode.HALF_UP),26 new BigDecimal(5000000).setScale(3, RoundingMode.HALF_UP),27 new BigDecimal(500000000).setScale(3, RoundingMode.HALF_UP),28 System.currentTimeMillis(),29 "SSE");30

31 Test test = newTest();32 int symbolData = 100000;33 test.initMySQL();34

35 long start =test.getRunTime();36 for(int i = 0; i < Test.FIX*1000; i++) {37 ts.setTradedate(newDate(System.currentTimeMillis()));38 ts.setSymbol(Integer.toString(symbolData));39 symbolData++;40 ts.setSymbolName("中国银行");41 ts.setUnix(ts.getUnix()+1);42 test.insertData(ts);43 }44 long end =test.getRunTime();45 System.out.println("写入速率为: " + Test.FIX*1000*1000/(end-start));46

47 test.down();48 }49

50

51 public voidinitMySQL()52 {53 String driver = "com.mysql.jdbc.Driver";54 String url = "jdbc:mysql://10.1.120.34:3306/hdfs";55 String user = "root";56 String password = "";57

58 try{59 Class.forName(driver);60 conn =DriverManager.getConnection(url, user, password);61 if (!conn.isClosed())62 System.out.println("Start MySQL!");63 } catch(Exception e) {64 e.printStackTrace();65 }66

67 count = 0;68 sql = "insert into transaction" + " values(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";69 try{70 pstm =conn.prepareStatement(sql);71 conn.setAutoCommit(false);72 } catch(SQLException e) {73 e.printStackTrace();74 }75 }76

77

78 public voidinsertData(Transaction ts)79 {80 try{81 pstm.setDate(1, ts.getTradedate());82 pstm.setString(2, ts.getSymbol());83 pstm.setString(3, ts.getSymbolName());84 pstm.setString(4, ts.getTrdmintime());85 pstm.setBigDecimal(5, ts.getStartprice());86 pstm.setBigDecimal(6, ts.getHighprice());87 pstm.setBigDecimal(7, ts.getLowprice());88 pstm.setBigDecimal(8, ts.getEndprice());89 pstm.setBigDecimal(9, ts.getChange());90 pstm.setBigDecimal(10, ts.getChangeratio());91 pstm.setBigDecimal(11, ts.getMinvolume());92 pstm.setBigDecimal(12, ts.getMinamout());93 pstm.setLong(13, ts.getUnix());94 pstm.setString(14, ts.getMarket());95

96 pstm.executeUpdate();97 count++;98 if (count ==Test.PREFIX) {99 conn.commit();100 conn.setAutoCommit(false);101 count = 0;102 }103

104 } catch(SQLException e) {105 try{106 conn.rollback();107 } catch(SQLException e1) {108 //TODO Auto-generated catch block

109 e1.printStackTrace();110 }111 e.printStackTrace();112 }113 }114

115

116 public longgetRunTime()117 {118 returnSystem.currentTimeMillis();119 }120

121

122 public voiddown()123 {124 try{125 if (!conn.isClosed()) {126 conn.close();127 System.out.println("Close MySQL!");128 }129 } catch(Exception e) {130 e.printStackTrace();131 }132 }133

134 }

Class Test

作者:志青云集

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

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

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

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

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