数据库中间件-性能调优实战

Posted 微创智云

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据库中间件-性能调优实战相关的知识,希望对你有一定的参考价值。


操作系统优化

打开最大文件句柄数

    设置为5000-1万,在ClusterDB Servermysql数据库的机器上都设置。 

查看用户单一进程最大文件打开数

ulimit -n

ulimit

修改文件句柄数查看:


 添加下面两行


 


 vi/etc/security/limits.conf 

# End of file 上一行加入

* softnofile 65535

* hardnofile 65535

* softnproc 65535

* hardnproc 65535

 

#datalength

ulimit -dunlimited

#max mem

ulimit -munlimited

#stacksize

ulimit -sunlimited

#CPU time

ulimit -tunlimited

#VM

ulimit -vunlimited

 

退出,重新进入命令行执行ulimit –a 查看是否生效


 

注释掉这一行:


 

20-nproc&90-nproc

vi/etc/security/limits.d/20-nproc.conf

vi/etc/security/limits.d/90-nproc.conf 中修改* soft nproc 1024  为

*          soft    nproc    16384

*          hard    nproc    32768

login

在etc/pam.d/login的最后加入

vi/etc/pam.d/login

sessionrequired /lib/security/pam_limits.so

sessionrequired pam_limits.so

TCP连接数

打开系统的TIMEWAIT重用和快速回收

编辑文件/etc/sysctl.conf,加入以下内容:

net.ipv4.tcp_syncookies= 1

net.ipv4.tcp_tw_reuse= 1

net.ipv4.tcp_tw_recycle= 1

net.ipv4.tcp_fin_timeout= 30

 

然后执行 /sbin/sysctl -p 让参数生效。

ClusterDB优化配置

ClusterDB中间件性能优化

 操作系统优化配置

1.文件句柄数修改

  ulimit -a 

2.TCP连接优化

ClusterDB优化配置

3.ClusterDB 启动内存配置优化 

conf/wrapper.conf

#物理内存3/4

wrapper.java.additional.5=-XX:MaxDirectMemorySize=20G

#物理内存2/3

wrapper.java.additional.10=-Xmx15G

#物理内存1/4

wrapper.java.additional.11=-Xms4G

  

4.service.xml配置优化

  

    <!--  256-1024   -->

    <propertyname="processors">1024</property>

    <!--  16-64 -->

 <propertyname="processorExecutor">64</property>

JVM调优

内存占用分两部分:Java堆内存+直接内存映射(DirectBuffer占用),建议堆内存

适度大小,直接映射内存尽可能大,两种一起占据操作系统的1/2-2/3的内存。

 

在conf\wrapper.conf文件中,下面是一段实例:

# JavaAdditional Parameters

wrapper.java.additional.5=-XX:MaxDirectMemorySize=2G

wrapper.java.additional.6=-Dcom.sun.management.jmxremote

# Initial JavaHeap Size (in MB)

wrapper.java.initmemory=2048

# Maximum JavaHeap Size (in MB)

wrapper.java.maxmemory=2048

 

修改wrapper.Java.command 为jdk的bin目录下的java

wrapper.java.command=/opt/jdk1.7.0_45/bin/java

配置 wrapper.conf

vi./conf/wrapper.conf

1984端口修改

 

wrapper.java.additional.5=-XX:MaxDirectMemorySize=2G

修改大一点如:wrapper.java.additional.5=-XX:MaxDirectMemorySize=10G

 

 

添加打印堆栈信息

wrapper.java.additional.12=-XX:+HeapDumpOnOutOfMemoryError

wrapper.java.additional.13=-XX:+HeapDumpOnOutOfMemoryError

 

startup_nowrap文件

MyCat1.6.5版本bin/startup_nowrap.sh bin/startup_nowrap.bat

下面以服务器16G内存为例,Mycat堆内存4G,直接内存映射6G,JVM参数如

下:

-server -Xms4G–Xmx4G   XX:MaxPermSize=64M-XX:MaxDirectMemorySize=6G

 

配置schema.xml

  conf/schema.xml

1. 设置<schema name="TESTDB"checkSQLschema="true" sqlMaxLimit="100">

中的checkSQLschemafalse ,要求在开发中,不能在sql中添加数据库的名称

TESTDB.company,这样可以优化SQL解析。

2.<dataHostname="dap_host1" maxCon="100" minCon="1"balance="3" writeType="0"

dbType="mysql" dbDriver="native"switchType="-1" slaveThreshold="100">

最大连接池maxCon,可以修个为10002000 ,同一个MySQL实例上的所有

datanode节点共享本dataHost上的物理连接,性能测试的时候,建议

minCon=maxCon=mysqlmax_connections 设为2000左右。另外,读写分离

是否开启,根据环境的配置来决定。 

缓存优化调整 

Show @@cache命令展示了缓存的使用情况,经常观察其结果,需要时候进行调整: 


一般来说:若CUR接近MAX,而PUT大于MAX很多,则表明MAX需要增大, HIT/ACCESS为缓存命中率,这个值越高越好。重新调整缓存的最大值以后,观测指标都会跟随变化,调整是否有效,主要观察缓存命中率是否在提升,PUT则下降。

 

conf/cacheservice.properties:缓存区的配置

目前缓存服务的配置文件为:cacheservice.properties,主要使用的缓存为enhacheenhache.xml里面设定了enhance缓存的全局属性,下面定义了几个缓存:

#used formycat cache service conf  

factory.encache=org.opencloudb.cache.impl.EnchachePooFactory

#key ispool name ,value is type,max size, expire seconds

pool.SQLRouteCache=encache,10000,1800

pool.ER_SQL2PARENTID=encache,1000,1800 

layedpool.TableID2DataNodeCache=encache,10000,18000

layedpool.TableID2DataNodeCache.TESTDB_ORDERS=50000,18000 

l SQLRouteCacheSQL 解析和路由选择的缓存,这个大小基本相对固定,就是所有 SELECT语句的数量。  

l ER_SQL2PARENTIDER分片时候,根据关联SQL查询父表的节点时候用到,没有用到ER分片的,这个缓存用不到  

l TableID2DataNodeCache,当某个表的分片字段不是主键时,缓存主键到分片ID的关系,这个是二层的缓存,每个表定义一个子缓存,如”TEST_ORDERS”,这里命名为 schema_tableNametablename要大写),当有很多的根据主键查询SQL时,这个缓存往往需要设置比较大,才能更好的提升性能。     

Mycat大数据量查询调优:    

1.返回结果比较多


 


建议调整 frontWriteQueueSize 在系统许可的情况下加大,默认值*3


这个原因是因为返回数据太多  

这里做了一个改进,就是超过POOL以后,仍然创建临时的BUFFER供使用,但这些不回收。。   这样的情况下,需要增加BUFFER参数  

调整processorBufferPool = 默认值*2  

不够的情况下,继续加大。

 

 

cacheserviceSQL的缓存服务

SQLRouteCache:sql路由缓存,通过缓存SQL语句的路由信息,下次查询,不用再路由了,直接从缓存中获取路由信息,然后发到各个节点执行;

TableID2DataNodeCache:表主键ID的路由缓存,为每一个表建一个缓存池,命名为TableID2DataNodeCache.TESTDB_表名,缓存的key是id的值,value是节点名;

ER_SQL2PARENTID: ER关系的缓存目前只是在Insert语句中才会使用缓存,子表插入数据的时候,根据joinKey的值,判断父表所在分片,从而定位子表分片,分片信息put缓存,以便下次直接获取

由于在测试的时候并没有对测试表是简单的区域划分,所以在测试中对后两个缓存是没有利用到的,具体对缓存大小的调整可以参考SQLRouteCache;

首先贴出结论:SQLRouteCache的大小对具体的QPS有比较大的影响,在实际的测试过程中,保持线程并发不变的情况下,从100W-300W都有调整过,大概每增加50W,有约15%的增加,直观来看的话,从100W-300W的增加过程中,128线程,5张表x5000W行/表的情况下,QPS范围从1W5-2W5,然而有一个问题很重要,当这个值增加到比较高后,会频繁出现极高的sys占用率,同时vmstat命令下,proc列会有非常高的r和b,直接后果就是MyCAT server本身会出现剧烈的性能波动,在基准测试中,QPS的低谷会降到3000-4000但是free查看内存使用的时候,并没有出现内存不足的情况,推断为MyCAT本身的缓存设计中存在不完善的地方;

具体的设置值,在不断的测试中,以之前的虚拟机的配置(4核,32G)为参考,当SQLRouteCache的值设置到180W以上的时候,就会不定时的出现性能波动,为了保证稳定运行,在基准测试时采用了较低的150W

 

PS:由于基准测试的时候,SQL语句模板里面的参数都是采用随机值,所以缓存的命中率是偏低的(150W的设置下,大约只有25%的命中率),生产环境下,这个命中率会高很多,同时QPS也会有一定程度的上升

PPS:这个routeCache和MySQL的queryCache比较像,缓存的都是具体的SQL语句,而不是框架里面的带?占位符的语句,queryCache的信息可以参考http://blog.itpub.net/29510932/viewspace-1694922/

 

配置server.xml

processors:用于指定可用线程数,实际上由于现在的多核CPU和超线程技术,这个值可以酌情调高,256-1024

processorExecutor:类似于线程池大小的参数,酌情修改即可,在1.4之后,这个线程池是用来做异步处理逻辑的时候用的,对并发能力的影响相对较小了 16-64

processorBufferPool:BufferPool的大小,原则上来说,调高一些会比较好

processorBufferChunk:每一个Buffer块的大小,processorBufferPool/processorBufferChun可以得到buffer块的数量

server调整总结

processors+processorExecutor会影响到MyCAT可用的线程数,虽然调高点会比较好,但是调的太高会导致频繁的上下文切换和软中断,在实际调整中,用top观察syssi的百分比,如果服务器/虚拟机并没有什么不干净的后台程序和其他的服务在运行,sys10%-15%之内,si5%之内是比较理想的状态

processorBufferPool+processorBufferChunk影响的server缓存,保持processorBufferChunk大小合理的情况下,增加buffer块的数量才是关键

 

 <!— CPU核心数越多,可以越大,当发现系统CPU压力很小的情况下,可以适当调大此参数,如4核心的4CPU,可以设置为16,24核心的可以最大设置为128——>  

 <property name="processors">1</property> 

下面这个参数为每个processor的线程池大小,建议可以是16-64,根据系统能力来测试和确定。 

<property name="processorExecutor">16</property>  

</system> 

System中以下重要参数也根据情况进行调整

processorBufferPool :每个processor分配的Socket Direct Buffer,用于网络通信,每

个processor上管理的所有连接共享,processorBufferChunk为Pool的最小分配单元,每个POOL的容量即为processorBufferPool/processorBufferChunk,默认前者为1024 * 1024 * 16=16M,后者为4096字节。processorBufferPool参数的调整,需要观察show @@processor的结果来确定: 

BU_PERCENT为已使用的百分比、BU_WARNS为Socket Buffer Pool不够时,临时创新的新的BUFFER的次数,若百分比经常超过90%并且BU_WARNS>0,则表明

BUFFER不够,需要增大processorBufferPool。基本上,连接数越多,并发越高,需要的POOL越大,建议BU_PERCENT最大在40-80%之间。


以上是关于数据库中间件-性能调优实战的主要内容,如果未能解决你的问题,请参考以下文章

Java开发经典实战!java代码编译过程

Java开发经典实战!在线学java培训网站

Java开发经典实战!在线学java培训网站

netty性能调优

SQL调优实战-常见性能调优案例介绍(第二期)

sql server性能调优实战,完整版下载