简介: 本篇来介绍一下PolarDB-X全局binlog在性能方面的一些设计和思考,先通过几个实际的测试案例来展示全局binlog的性能情况,然后结合这些案例来深入讲解全局binlog关于优化的故事。

本篇来介绍一下PolarDB-X全局binlog在性能方面的一些设计和思考,先通过几个实际的测试案例来展示全局binlog的性能情况,然后结合这些案例来深入讲解全局binlog关于优化的故事。

测试准备

准备一个PolarDB-X 2.0实例,本文测试所用实例版本为5.4.14-16576195,实例配置如下:

  • 实例拓扑:8CN + 8DN + 2CDC
  • 单CN节点规格:32核128GB
  • 单DN节点规格:32核128GB
  • 单CDC节点规格:16核32GB

准备两台ECS压测机,机器配置:64核128G

名词解释

  • EPS

Event Per Second,每秒写入binlog文件的event个数

  • DML EPS

DML Event Per Second,每秒写入binlog文件的dml event个数,所谓dml event特指binlog中的TableMapEvent、WriteRowsEvent、UpdateRowsEvent和DeleteRowsEvent

  • BPS

Byte Per Second,每秒写入binlog文件的字节数,后文为表达方便,采用M/s来作为计量单位

  • TPS

Transaction Per Second,每秒钟写入binlog文件的事务个数

  • FPM

File Per Minute,每分钟生成binlog文件的个数,单个文件大小500M

  • Delay Time

延迟时间,单位ms

测试方案

TPCC

测试方法参见:https://help.aliyun.com/document_detail/405018.html
本测试案例,TPCC核心参数的配置如下:

  • warehouses=2000
  • loadWorkers=500
  • terminals=1024
  • runLoader.sh 中JVM参数配置 -Xms60g -Xmx60g
  • runBenchmark.sh 中JVM参数配置 -Xms60g -Xmx60g

场景一:TPCC数据导入

  • 测试目的

在进行压测数据导入时,DN节点会瞬时产生大量物理binlog,借此观察全局binlog的性能指标情况

  • 测试方式

在每台ECS上面分别部署多份tpcc程序包,同时运行多个./runDatabaseBuild.sh,来构造流量

场景二:TPCC交易测试

  • 测试目的

执行TPCC测试,模拟真实交易场景,考察全局binlog的性能情况(重点关注延迟)

  • 测试方式

调整压测并发度,构造不同的tmpC参考指标,观察全局binlog延迟指标。由于8CN+8DN在压力打满的情况下,全局binlog的延迟依然比较低,所以下面的测试,不局限于8CN+8DN

Sysbench

测试方法参见: https://help.aliyun.com/document_detail/405017.html

场景一:Sysbench数据导入

  • 测试目的

在进行压测数据导入时,DN节点会瞬时产生大量物理binlog,借此观察全局binlog的性能指标情况

  • 测试方式

调整--tables和--threads的参数值,测试不同压力状态下全局binlog的性能指标

场景二:Sysbench oltp_write_only

  • 测试目的

执行sysbench oltp_write_only,测试混合写入场景下,全局binlog性能情况

  • 测试方式

执行oltp_write_only,构造不同qps参考指标,观察全局binlog延迟情况

Large Transaction

  • 测试目的

测试超大事务场景下,CDC的性能情况和稳定性,重点关注延迟时间

  • 测试方式

参考如下脚本,构造不同大小的事务,进行测试,按如下脚本,每插入20w条数据可以构造一个500M大小的事务

CREATE TABLE `t_1`
(`id` bigint(20) NOT NULL AUTO_INCREMENT,
`c_bit_1` bit(1) DEFAULT NULL,
`c_bit_8` bit(8) DEFAULT NULL,
`c_bit_16` bit(16) DEFAULT NULL,
`c_bit_32` bit(32) DEFAULT NULL,
`c_bit_64` bit(64) DEFAULT NULL,
`c_tinyint_1` tinyint(1) DEFAULT NULL,
`c_tinyint_4` tinyint(4) DEFAULT NULL,
`c_tinyint_8` tinyint(8) DEFAULT NULL,
`c_tinyint_8_un` tinyint(8) unsigned DEFAULT NULL,
`c_smallint_1` smallint(1) DEFAULT NULL,
`c_smallint_16` smallint(16) DEFAULT NULL,
`c_smallint_16_un` smallint(16) unsigned DEFAULT NULL,
`c_mediumint_1` mediumint(1) DEFAULT NULL,
`c_mediumint_24` mediumint(24) DEFAULT NULL,
`c_mediumint_24_un` mediumint(24) unsigned DEFAULT NULL,
`c_int_1` int(1) DEFAULT NULL,
`c_int_32` int(32) DEFAULT NULL,
`c_int_32_un` int(32) unsigned DEFAULT NULL,
`c_bigint_1` bigint(1) DEFAULT NULL,
`c_bigint_64` bigint(64) DEFAULT NULL,
`c_bigint_64_un` bigint(64) unsigned DEFAULT NULL,
`c_decimal` decimal DEFAULT NULL,
`c_decimal_pr` decimal(10,3) DEFAULT NULL,
`c_float` float DEFAULT NULL,
`c_float_pr` float(10,3) DEFAULT NULL,
`c_float_un` float(10,3) unsigned DEFAULT NULL,
`c_double` double DEFAULT NULL,
`c_double_pr` double(10,3) DEFAULT NULL,
`c_double_un` double(10,3) unsigned DEFAULT NULL,
`c_date` date DEFAULT NULL COMMENT 'date',
`c_datetime` datetime DEFAULT NULL,
`c_timestamp` timestamp DEFAULT CURRENT_TIMESTAMP,
`c_time` time DEFAULT NULL,
`c_year` year DEFAULT NULL,
`c_year_4` year(4) DEFAULT NULL,
`c_char` char(50) DEFAULT NULL,
`c_varchar` varchar(50) DEFAULT NULL,
`c_binary` binary(200) DEFAULT NULL,
`c_varbinary` varbinary(200) DEFAULT NULL,
`c_blob_tiny` tinyblob DEFAULT NULL,
`c_blob` blob DEFAULT NULL,
`c_blob_medium` mediumblob DEFAULT NULL,
`c_blob_long` longblob DEFAULT NULL,
`c_text_tiny` tinytext DEFAULT NULL,
`c_text` text DEFAULT NULL,
`c_text_medium` mediumtext DEFAULT NULL,
`c_text_long` longtext DEFAULT NULL,
`c_enum` enum('a','b','c') DEFAULT NULL,
`c_set` set('a','b','c') DEFAULT NULL,
`c_testcase` varchar(10) DEFAULT NULL,
PRIMARY KEY (`id`) )ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='10000000' dbpartition by hash(`id`) tbpartition by hash(`id`) tbpartitions 8;
INSERT t_1 (c_bit_1 , c_bit_8 , c_bit_16 , c_bit_32 , c_bit_64 , c_tinyint_1 , c_tinyint_4 , c_tinyint_8 , c_tinyint_8_un , c_smallint_1 , c_smallint_16 , c_smallint_16_un , c_mediumint_1 , c_mediumint_24 , c_mediumint_24_un , c_int_1 , c_int_32 , c_int_32_un , c_bigint_1 , c_bigint_64 , c_bigint_64_un , c_decimal , c_decimal_pr , c_float , c_float_pr , c_float_un , c_double , c_double_pr , c_double_un , c_date , c_datetime , c_timestamp , c_time , c_year , c_year_4 , c_char , c_varchar , c_binary , c_varbinary , c_blob_tiny , c_blob , c_blob_medium , c_blob_long , c_text_tiny , c_text , c_text_medium , c_text_long , c_enum , c_set , c_testcase)
VALUES(
b'1' , b'11111111' , b'1111111111111111' , b'11111111111111111111111111111111' , b'1111111111111111111111111111111111111111111111111111111111111111' , '82' , '-101' , '-75' ,'253' , '14497' , '5070' , '9427' , '-5888259' , '-1845105' , '2350597' , '-2147483648' , '-2147483648' , '3653062473' , '-816854218224922624' , '7292572323853307904' , '2902765992697493504' , '-1613793319' , '1223077.292' , '9.1096275E8' , '-5839673.5' , '2648.644' , '4.334081673614155E9' , '6973286.176' , '7630560.182' , '2019-02-15' , '2019-02-15 14:54:41' , '2019-02-15 14:54:41' , '20:12:46' , '2019' , '2019', 'xxx','int a = max(4,5)','xxxxxxx','varchar a = ','xxkdkwjsjdfdsk','varchar a = ',';sdjfaljdljfsljldjlsjdljflsjdlfjsaljdlfhahdljflajdlfasdf','int a = max(4,5)','xxx','sdjflshdflsjlfa;;dfjadjfahdfhklsajdfklsafasjlfjls',repeat('a',1024),repeat('a',1024), 'a', 'a', 'caseNo1');
INSERT t_1 ( c_bit_1 ,  c_bit_8 ,  c_bit_16 ,  c_bit_32 ,  c_bit_64 ,  c_tinyint_1 ,  c_tinyint_4 ,  c_tinyint_8 ,  c_tinyint_8_un ,  c_smallint_1 ,
c_smallint_16 , c_smallint_16_un , c_mediumint_1 , c_mediumint_24 , c_mediumint_24_un , c_int_1 , c_int_32 , c_int_32_un , c_bigint_1 , c_bigint_64
, c_bigint_64_un , c_decimal , c_decimal_pr , c_float , c_float_pr , c_float_un , c_double , c_double_pr , c_double_un , c_date , c_datetime , c_timestamp , c_time , c_year , c_year_4 , c_char , c_varchar , c_binary , c_varbinary , c_blob_tiny , c_blob , c_blob_medium , c_blob_long , c_text_tiny , c_text , c_text_medium , c_text_long , c_enum , c_set , c_testcase) select c_bit_1 , c_bit_8 , c_bit_16 , c_bit_32 , c_bit_64 , c_tinyint_1 , c_tinyint_4 , c_tinyint_8 , c_tinyint_8_un , c_smallint_1 , c_smallint_16 , c_smallint_16_un , c_mediumint_1 , c_mediumint_24 , c_mediumint_24_un , c_int_1 , c_int_32 , c_int_32_un , c_bigint_1 , c_bigint_64 , c_bigint_64_un , c_decimal , c_decimal_pr , c_float , c_float_pr , c_float_un , c_double , c_double_pr , c_double_un , c_date , c_datetime , c_timestamp , c_time , c_year , c_year_4 , c_char , c_varchar , c_binary , c_varbinary , c_blob_tiny , c_blob , c_blob_medium , c_blob_long , c_text_tiny , c_text , c_text_medium , c_text_long , c_enum , c_set , c_testcase from t_1;

测试报告

先给出汇总后的测试报告,再进行详细介绍,测试数据如下:

测试场景 参考指标 DelayTime EPS BPS
TPCC数据导入 4000仓/600并发 300ms 10w/s 350M/s
TPCC数据导入 8000仓/1200并发 700ms 15w/s 450M/s-500M/s
TPCC数据导入 12000仓/1800并发 1s-60s 15w/s 450M/s-500M/s
Sysbench数据导入 32Tables/32并发 500ms 180w/s 140M/s
Sysbench数据导入 48Tables/48并发 1s 210w/s 170M/s
Sysbench数据导入 64Tables/64并发 1s-70s 220w/s 180M/s
TPCC交易测试 50w tpmC 400ms 60w/s 130M/s
TPCC交易测试 100w tpmC 500ms 120w/s 250M/s
TPCC交易测试 150w tpmC 1s-4s 170w/s 350M/s
Sysbench Oltp_write_only 20w QPS 500ms 130w/s 125M/s
Sysbench Oltp_write_only 30w QPS 600ms 180w/s 170M/s
Sysbench Oltp_write_only 35w QPS 1s-18s 210w/s 200M/s
大事务 500M 2s 24w/s 500M/s
大事务 1G 4.8s 24w/s 500M/s
大事务 2G 7.8s 24w/s 500M/s
大事务 3G 9.4s 24w/s 500M/s
大事务 4G 12.5s 24w/s 500M/s
大事务 5G(no swap) 17s 24w/s 500M/s
大事务 5G(with swap) 25s 22w/s 350M/s
大事务 10G(with swap) 55s 22w/s 350M/s
大事务 20G(with swap) 115s 22w/s 350M/s

TPCC数据导入

Test With 2 Client

  • EPS: 10w/s,DML EPS: 6w/s

  • BPS: 350M/s,FPM: 40个/m

  • TPS: 11000/s

  • Delay Time: 300ms

  • 另附CDC进程GC情况:内存使用率不高、GC平稳、无老年代GC

综述:两个client场景下(4000仓/600并发),写入吞吐平均值约350M/s,延迟时间在300ms左右,完全无压力

Test With 4 Client

  • EPS: 14w/s ~ 16w/s,DML EPS: 7.5w/s ~ 9w/s

  • BPS: 450M/s ~ 500M/s,FPM: 52个/m ~ 60个/m

  • TPS: 15000/s

  • Delay Time: 700ms,最大延迟抖动10S

  • 另附CDC进程GC情况:老年代内存使用率略有提升、GC平稳、无老年代GC

综述:四个client场景下(8000仓/1200并发),基本无压力,写入吞吐在450M/s~500M/s,延迟时间总体上可以维持在1S以下,最大延迟抖动10S且有一定的持续时间,其它大部分指标相比两个client场景基本可以达到翻倍

Test With 6 Client

  • EPS: 14w/s ~ 16w/s,DML EPS: 8w/s ~ 9w/s

  • BPS: 450M/s ~ 500M/s,FPM: 55个/m ~ 60个/m

  • TPS: 15000/s

  • Delay Time: 延迟呈递增趋势,最大延迟1分钟

  • 另附CDC进程GC情况:缓冲区开始出现积压,老年代使用率提升明显

  • 另附CDC文件写入线程CPU使用率情况

综述:六个client场景下(12000仓/1800并发),延迟开始出现增长,数据导入时长20min,触发最大延迟60S,其它指标和4个Client场景下相比基本持平,主要瓶颈点在文件写入线程,CPU使用率已经达到了100%,每秒500M左右的写入速度目前是全局binlog能支持的最大吞吐,后序进一步的优化进展会在本文持续更新,敬请关注

Sysbench数据导入

Test With 32 Tables

sysbench --config-file='sysb.conf' --create-table-options='dbpartition by hash(`id`) tbpartition by hash(id) tbpartitions 8'  --tables='32' --threads='32' --table-size='10000000' oltp_point_select prepare
  • EPS: 180w/s,DML EPS: 60w/s

  • BPS: 140M/s,FPM: 17个/m

  • TPS: 30w/s

  • Delay Time: 500ms,最大延迟抖动2s

综述:32张表并行插入场景下,延迟基本可以控制在1s以内。相比TPCC导数据,Sysbench场景下EPS指标呈现了数十倍的提升,但BPS指标则要低很多,主要是因为Sysbench的表比较小,插入逻辑也简单直接,所以数据插入的rps(record per second)很高但流量并不是很大,各项指标对比见下表:

指标项 TPCC Sysbench
EPS 14w/s ~ 16w/s 170w/s
DML EPS 7.5w/s ~ 9w/s 60w/s
BPS 450M/s ~ 500M/s 140M/s
TPS 15000/s 30w/s
Delay Time 700ms 500ms
FPM 52个/m ~ 60个/m 17个/m

Test With 48 Tables

sysbench --config-file='sysb.conf' --create-table-options='dbpartition by hash(`id`) tbpartition by hash(id) tbpartitions 8'  --tables='48' --threads='48' --table-size='10000000' oltp_point_select prepare
  • EPS: 210w/s,DML EPS: 接近70w/s

  • BPS: 170M/s

  • TPS: 36w/s,FPM: 20个/m

  • Delay Time: 1s,最大延迟10s

综述:48张表并行插入场景下,各项指标有了小幅度提升,延迟时间总体在1s左右,最大10s。

Test With 64 Tables

sysbench --config-file='sysb.conf' --create-table-options='dbpartition by hash(`id`) tbpartition by hash(id) tbpartitions 8'  --tables='64' --threads='64' --table-size='10000000' oltp_point_select prepare
  • EPS: 220w/s,DML EPS: 接近75w/s

  • BPS: 180M/s

  • TPS: 37w/s,FPM: 21个/m

  • Delay Time: 最大延迟70s

综述:64张表并行插入场景下,各项指标有了小幅度提升,延迟时间开始增大,最大延迟时间70s。因涉及全局排序和事务合并,以及需要对每个event进行checksum的计算,目前全局binlog可支持的最大EPS在220w/S左右,后序进一步的优化进展会在本文持续更新,敬请关注

TPCC交易测试

50w-55w tpmC

  • tpmC: 50w/m ~ 55w/m

  • EPS: 60w/s,DML EPS: 37w/s ~ 40w/s

  • BPS: 130M/s,FPM: 15个/m

  • TPS: 18000/s

  • Delay Time: 400ms

综述:tpmC 50w/m ~ 55w/m,Tps 18000/s, 全局binlog延迟400ms左右, DML EPS平均在37w/s左右,BPS 130M/s左右

100w-105w tpmC

  • tpmC: 100w/m ~ 105w/m

  • EPS: 120w/s,DML EPS: 75w/s

  • BPS: 250M/s,FPM: 30个/m

  • TPS: 35000/s

  • Delay Time: 500ms

综述:tpmC 100w/m~105w/m,Tps 35000/s, 全局binlog延迟500ms左右, DML EPS平均在75w/s左右,BPS 250M/s左右

145w-150w tpmC

  • tpmC: 145w/m ~ 150w/m

  • EPS: 170w/s,DML EPS: 100w/s

  • BPS: 350M/s,FPM: 42个/m

  • TPS: 50000/s

  • Delay Time: 1s ~ 4s。前段和后段延迟在1.5s左右,中段延迟在4s左右,但中段tpmC其实并没有前段高,原因在于在压力打满情况下,偶发抖动都会导致延迟时间的变化,多次复测并不是每次都会达到4s延迟,这里取一个最坏的测试结果,150w tpmC场景下常规延迟时间大概在2s左右

综述:tpmC 145w/m ~ 150w/m,Tps 50000/s, 全局binlog延迟1s-4s左右,EPS 170w/s,DML EPS平均在100w/s左右,BPS 350M/s左右

Sysbench oltp_write_only

20w qps

sysbench --config-file='sysb.conf' --db-ps-mode='disable' --skip-trx='on' --mysql-ignore-errors='all'  --tables='16' --table-size='10000000' --threads=300 oltp_write_only run
  • Sysbench: 21w+ qps, 5w+ tps

  • 延迟时间:500ms

  • EPS:130w+, DML EPS:43w+

  • BPS: 125M/s

30w qps

sysbench --config-file='sysb.conf' --db-ps-mode='disable' --skip-trx='on' --mysql-ignore-errors='all'  --tables='16' --table-size='10000000' --threads=512 oltp_write_only run
  • Sysbench: 30w qps, 7.5w tps

  • 延迟时间:600ms

  • EPS:180w+, DML EPS:55w+

  • BPS: 170M/s

35w qps

sysbench --config-file='sysb.conf' --db-ps-mode='disable' --skip-trx='on' --mysql-ignore-errors='all'  --tables='16' --table-size='10000000' --threads=800 oltp_write_only run
  • Sysbench: 35w~40w qps, 9w~10w tps

  • 延迟时间:18s

  • EPS: 200w+/s, DML EPS:70w+/s

  • BPS: 200M/s

综述:35w qps压力下,已经接近220w/s的最大EPS能力,压测时间10分钟,最大延迟达到18s

Large Transaction

先来介绍几个参数

  • storage.isPersistOn

是否开启swap功能,即当内存不足或遇到大事务时,是否支持数据临时swap到磁盘(RocksDB),默认为true

  • storage.persist.mode

持久化模式,可选配置有两个:AUTO和FORCE。AUTO模式下,系统会根据内存使用率自动判断是否需要将数据swap到磁盘;FORCE模式下,系统会强制将数据swap到磁盘

  • storage.persistNewThreshold

内存中新增数据触发swap的阈值,即内存使用率达到多大之后,新增数据会被swap到磁盘,默认85%

  • storage.persistAllThreshold

内存中存量数据触发swap的阈值,即内存使用率达到多大之后,存量数据会被swap到磁盘,默认95%

5G Close Persist

单个事务大小5G,关闭swap功能,本测试场景,老年代内存14G,即使考虑到数据膨胀,足够放下5G数据

  • Delay Time: 所有数据完成排序时延迟7s,所有数据输出到全局binlog文件时延迟17s

  • Task进程内存: 老年代使用率显著提升

综述:关闭持久化,全内存模式下,5G数据在17S内完成同步,老年代内存使用率显著提升

5G Force Persist

单个事务大小5G,开启swap功能,并将持久化模式设置为FORCE

  • Delay Time: 所有数据完成排序时延迟10s,所有数据输出到全局binlog文件时延迟25s

  • CDC进程内存情况: 由于采用强制持久化机制,内存占用无起伏

综述:相比close persist模式,强制持久化模式下,延迟增加了8s,老年代内存占用无明显起伏

10G Auto Persist With 4G Memory

单个事务大小10G,开启swap功能,并将持久化模式设置为AUTO,Task进程内存设置为4G(无法放下10G数据),评测系统的自动持久化能力

  • Delay Time: 所有数据完成排序时延迟23s,所有数据输出到全局binlog文件时延迟55s

  • Task进程内存: 老年代并未显著上涨

  • Swap日志:单个局部事务大小超过阈值,直接触发了swap

综述:AUTO模式下,对于大事务的落盘,系统采取了更加积极主动的方式,即使内存使用率还未触发swap阈值,当单个局部事务大小超过阈值之后,也会直接触发swap,并且性能还算不错。之所以引入这种策略,主要原因是:

  • 出现大事务时,大概率会触发内存不足,直接触发swap,免去老年代GC的成本
  • swap操作虽然会有一定的损耗,但总体上的延迟还不错,优先考虑稳定性

20G Auto Persist With 4G Memory

单个事务大小20G,开启swap功能,并将持久化模式设置为AUTO,Task进程内存设置为4G(无法放下20G数据),评测系统的自动持久化能力

  • Delay Time: 所有数据完成排序时延迟49s,所有数据输出到全局binlog文件时延迟115s

  • Task进程内存: 老年代小幅上涨

  • Swap日志:单个局部事务大小超过阈值,直接触发了swap

总结

本文基于TPCC、Sysbench和Large Transaction3个场景,对全局Binlog的性能和稳定性情况进行了详细介绍,综合来看:

  • 写入吞吐可以达到500M/S(30G/min)左右,EPS指标可以达到220W/S左右,且内存使用率维持在较低的水位
  • TPCC场景,在150w tpmC压力下,延迟时间可以控制在4s以内,大部分时间段延迟时间保持在2s左右
  • Sysbench场景,30w QPS压力下,延迟时间可以维持在1s以内,更高压力下由于已经触达220w/s的EPS能力,延迟时间开始增长(继续提升EPS的上限是全局binlog后续的一个重点目标)
  • Large Transaction场景,依托自动swap能力,使用很小的内存可以稳定的同步超大事务,且能保持还不错的性能(继续优化swap的读写能力,延迟时间还有进一步的降低空间)

优化无止境,如果对PolarDB-X充满兴趣,可持续关注我们,最新的优化进展会持续更新。本文是全局Binlog性能解读系列的上篇,下篇将从原理层面展开深入介绍,敬请关注。

欢迎关注PolarDB-X知乎机构号,阅读更多技术好文。

原文链接:https://click.aliyun.com/m/1000362576/

本文为阿里云原创内容,未经允许不得转载。

PolarDB-X 全局Binlog解读之性能篇(上)的更多相关文章

  1. POLARDB v2.0 技术解读

    点击观看“POLARDB 2.0 升级发布会”:https://yq.aliyun.com/live/1136 回顾POLARDB 1.0 POLARDB 1.0 主要的改进包括采用了计算存储分离的架 ...

  2. MongoDB性能篇之创建索引,组合索引,唯一索引,删除索引和explain执行计划

    这篇文章主要介绍了MongoDB性能篇之创建索引,组合索引,唯一索引,删除索引和explain执行计划的相关资料,需要的朋友可以参考下 一.索引 MongoDB 提供了多样性的索引支持,索引信息被保存 ...

  3. 【朝花夕拾】Android性能篇之(六)Android进程管理机制

    前言        Android系统与其他操作系统有个很不一样的地方,就是其他操作系统尽可能移除不再活动的进程,从而尽可能保证多的内存空间,而Android系统却是反其道而行之,尽可能保留进程.An ...

  4. 【朝花夕拾】Android性能篇之(五)Android虚拟机

    前言 Android虚拟机的使用,使得android应用和Linux内核分离,这样做使得android系统更稳定可靠,比如程序中即使包含恶意代码,也不会直接影响系统文件:也提高了跨平台兼容性.在And ...

  5. 【朝花夕拾】Android性能篇之(一)序言及JVM

    序言        笔者从事Anroid开发有些年头了,深知掌握Anroid性能优化方面的知识的必要性,这是一个程序员必须修炼的内功.在面试中,它是面试官的挚爱,在工作中,它是代码质量的拦路虎,其重要 ...

  6. 【朝花夕拾】Android性能篇之(三)Java内存回收

    在上一篇日志([朝花夕拾]Android性能篇之(二)Java内存分配)中有讲到,JVM内存由程序计数器.虚拟机栈.本地方法栈.GC堆,方法区五个部分组成.其中GC堆是一块多线程的共享区域,它存在的作 ...

  7. 第八节: EF的性能篇(一) 之 EF自有方法的性能测试

    一. 开发中常见的性能问题 我们在日常开发过程中,由于一些不好的习惯,经常会导致所写的代码性能低下,却毫无发觉,下面就总结一下常见的一些性能问题. 1. 真假分页 ① 假分页: db.xxx.toLi ...

  8. 【朝花夕拾】Android性能篇之(八)来自官网的自白

    前言 转载请声明,转自[https://www.cnblogs.com/andy-songwei/p/10823372.html],谢谢! Android性能优化无疑是Android中的一个重点,也是 ...

  9. Python自动化测试面试题-性能篇

    目录 Python自动化测试面试题-经验篇 Python自动化测试面试题-用例设计篇 Python自动化测试面试题-Linux篇 Python自动化测试面试题-MySQL篇 Python自动化测试面试 ...

  10. 【转】Shell编程基础篇-上

    [转]Shell编程基础篇-上 1.1 前言 1.1.1 为什么学Shell Shell脚本语言是实现Linux/UNIX系统管理及自动化运维所必备的重要工具, Linux/UNIX系统的底层及基础应 ...

随机推荐

  1. docker安装kafka和zookeeper

    参考,欢迎点击原文:https://www.cnblogs.com/360minitao/p/14665845.html(主要) https://blog.csdn.net/qq_22041375/a ...

  2. Qt HTTP网络相关GET,POST(HTTP 模拟POST 表单(multipartform)最简单和正式的方法)

    PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 前置说明   本文作为本人csdn blog的主站的备份.(Bl ...

  3. 低代码平台前端的设计与实现(三)设计态画布DesignCanvas的设计与实现

    上一篇文章,我们分析并设计了关于构建引擎BuildEngine的切面设计.本文我们将基于BuildEngine所提供的切面处理能力,在CustomCreateElementHandle中通过一些逻辑, ...

  4. CAD和实时渲染之间的差距

    建筑师如何将他们喜爱的CAD工具与虚幻引擎和Twinmotion 等快速实时渲染工具结合使用 每个建筑师都有自己喜欢的设计工具.从Revit的粉丝到阿奇卡德的狂热用户,AEC专业人员通常首选CAD和B ...

  5. .NET集成DeveloperSharp操作Sql Server数据库

    支持.Net/.Net Core/.Net Framework,可以部署在Docker, Windows, Linux, Mac. 本文提供了一种结合"原生Sql+轻量级ORM"操 ...

  6. C#OpenCvSharp YOLO v3 Demo

    效果 项目 代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.D ...

  7. HTTPS&SPDY&HTTP2&QUIC&HTTP3

    HTTPS 密钥交换,加密和解密 SPDY&HTTP2 QUIC&HTTP3

  8. C++设计模式 - 抽象工厂(Abstract Factory)

    对象创建模式 通过"对象创建" 模式绕开new,来避免对象创建(new)过程中所导致的紧耦合(依赖具体类),从而支持对象创建的稳定.它是接口抽象之后的第一步工作. 典型模式 Fac ...

  9. MySQL配置和常用命令

    目录 数据库配置 常用操作 项目地址:https://github.com/aijisjtu/Bot-Battle graph LR A[配置数据源] --> B[建立连接] B --> ...

  10. 开源图形驱动在OpenHarmony上的使用和落地

      本文转载自 OpenHarmony TSC 官方微信公众号<峰会回顾第10期 | 开源图形驱动在OpenHarmony上的使用和落地> 演讲嘉宾 | 黄   然 回顾整理 | 廖    ...