mycat 优化

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u014180504/article/details/76595247
show @@datanode;
该命令用于显示MyCAT的数据节点的列表,对应schema.xml配置文件的dataNode节点

其中,“NAME”表示dataNode的名称;“dataHost”表示对应dataHost属性的值,即数据主机;“ACTIVE”表示活跃连接数;“IDLE”表示闲置连接数;“SIZE”对应总连接数量。

显示后端物理库连接信息,包括当前连接数,端口
Show @@backend

Show @@connection
显示当前前端客户端连接情况,已经网络流量信息

Show @@threadpool
当前线程池的执行情况,是否有积压(active_count)以及task_queue_size,后者为积压的待处理的SQL,若积压数目一直保值,则说明后端物理连接可能不够或者SQL执行比较缓慢。

Show @@heartbeat
当前后端物理库的心跳检测情况,RS_CODE为1表示心跳正常

Show @@datanode
显示数据节点的访问情况,包括每个数据节点当前活动连接数(active),空闲连接数(idle)以及最大连接数(maxCon) size,EXECUTE参数表示从该节点获取连接的次数,次数越多,说明访问该节点越多。

Show @@processor
显示当前processors的处理情况,包括每个processor的IO吞吐量(NET_IN/NET_OUT)、IO队列的积压情况(R_QUEY/W_QUEUE),Socket Buffer Pool的使用情况BU_PERCENT为已使用的百分比、BU_WARNS为Socket Buffer Pool不够时,临时创新的新的BUFFER的次数,若百分比经常超过90%并且BU_WARNS>0,则表明BUFFER不够,需要增大,参见性能调优手册。

Show @@datasource
显示数据源的信息,是否是读写节点等。

show @@cache
显示缓存的使用情况,对于性能监控和调优很有价值
 MAX为缓存的最大值(记录个数),CUR为当前已经在缓存中的数量,ACESS为缓存读次数,HIT为缓存命中次数,PUT 为写缓存次数,LAST_XX为最后操作时间戳,比较重要的几个参数:CUR:若CUR接近MAX,而PUT大于MAX很多,则表明MAX需要增大,HIT/ACCESS为缓存命中率,这个值越高越好。

Kill @@connection
杀掉客户端的连接,参数为连接的ID值,通过show @@connection,可以展示当前连接到MyCAT的所有客户端进程,若某个进程异常,则可以通过该命令杀掉连接,如
KILL @@CONNECTION 1;

JVM调优:

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

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

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

下:

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

用mycat console等命令启动MyCAT的,JVM参数都在conf\wrapper.con文件中,下面是一段实例:

# Java Additional Parameters

wrapper.java.additional.5=-XX:MaxDirectMemorySize=2G wrapper.java.additional.6=-Dcom.sun.management.jmxremote # Initial Java Heap Size (in MB) wrapper.java.initmemory=2048 # Maximum Java Heap Size (in MB) wrapper.java.maxmemory=2048 操作系统调优:

最大文件句柄数量的修改,设置为5000-1万,在Mycat Server和MySQL数据库的机器上都设置。Linux操作系统对一个进程打开的文件句柄数量的限制(也包含打开的SOCKET数量,可影响mysql的并发连接数目).这个值可用ulimit命令来修改,但ulimit命令修改的数值只对当前登录用户的目前使用环境有效,系统重启或者用户退出后就会失效。   

Mysql调优:

最大连接数设置为2000

[mysqld]中有参数

max_connections = 2000

mysql> show global status like 'Max_used_connections';

MySQL服务器过去的最大连接数是245,没有达到服务器连接数上限256,应该没有出现1040错误,比较理想的设置是:

Max_used_connections / max_connections * 100% ≈ 85%

最大连接数占上限连接数的85%左右,如果发现比例在10%以下,MySQL服务器连接上线就设置得过高了。

 

Mycat调优:

Conf/log4j.xml中,日志级别调整为至少info级别,默认是debug级别,用于排查错误,不能用于性能测试和正式生产中。  

conf/server.xml中 有如下参数可以调整: <system>

 <!— 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%之间。   

conf/schema.xml中有如下参数可以调整:

<schema name="TESTDB" checkSQLschema="true"> ,checkSQLschema属性建议设置为false,要求开发中,不能在sql中添加数据库的名称,如select * from TESTDB.company,这样可以优化SQL解析。

<dataHost name="localhost1" maxCon="500" minCon="10" balance="0"   

 

dbType="mysql" dbDriver="native" banlance="0">

<!—最大连接池maxCon,可以改为1000至2000,同一个Mysql实例上的所有datanode节点的共享本dataHost 上的所有物理连接à

性能测试的时候,建议minCon=maxCon= mysql max_connections

设为2000左右。

另外,读写分离是否开启,根据环境的配置来决定。  

缓存优化调整:

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


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

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

#used for mycat cache service conf  

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

#key is pool 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 SQLRouteCache为SQL 解析和路由选择的缓存,这个大小基本相对固定,就是所有 SELECT语句的数量。  

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

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

Mycat大数据量查询调优:    

1.返回结果比较多


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

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

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

调整 processorBufferPool = 默认值*2  

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


配置processors的具体大小。例如,配置processor的个数为16: server.xml文件中定义

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

    1

    1

还有一个要讨论的就是buffer pool。因为,所有的NIOProcessor共享一个buffer pool。
我们在server.xml中提到过:
BufferPool的总长度 = bufferPool / bufferChunk
我们可以连接到Mycat管理端口上,使用show @@processor命令列出所有的processor状态。
查看列: FREE_BUFFER、TOTAL_BUFFER、BU_PERCENT。
如果FREE_BUFFER的数值过小,则说明配置的buffer pool大小可能不够。这时候就要手动配置根据公式这个属性了,pool的大小最好是bufferChunk的整数倍。例如,配置buffer pool的大小为:5000 server.xml文件中定义

<property name="processorBufferPool">20480000</property>

    1

    1

另一个buffer pool是线程内buffer pool,这个值可以根据processors的数值计算出来。具体看server.xml配置详解。


MySQL通用调优

首先MySQL要绝对避免使用Swap内存,网上有多种办法,可以参考。
这里是MySQL5.6及以上的调优参数,主要是提升多个database/table的写入和查询性能:
[mysqld]
当Order By 或者Group By等需要用到结果集时,参数中设置的临时表的大小小于结果集的大小时,就会将该表放在磁盘上,这个时候在硬盘上的IO要比内销差很多。所耗费的时间也多很多,mysql 会取min(tmp_table_size, max_heap_table_size)的值,因此两个设置为一样大小,除非是大量使用内存表的情况,此时max_heap_table_size要设置很大。
max_heap_table_size=200M
tmp_table_size=200M
下面这部分是Select查询结果集的缓存控制,query_cache_limit表示缓存的Select结果集的最大字节数,这个可以限制哪些结果集缓存,query_cache_min_res_unit表示结果集缓存的内存单元大小,若需要缓存的SQL结果集很小,比如返回几条记录的,则query_cache_min_res_unit越小,内存利用率越高,query_cache_size表示总共用多少
内存缓存Select结果集,query_cache_type则是控制是否开启结果集缓存,默认0不开启,1开启,2为程序控制方式缓存,比如SELECT SQL_CACHE …这个语句表明此查询SQL才会被缓存,对于执行频率比较高的一些查询SQL,进行指定方式的缓存,效果会最好。
FLUSH QUERY CACH命令则清理缓存,以更好的利用它的内存,但不会移除缓存,RESET QUERY CACHE 使命从查询缓存中移除所有的查询结果。

    #query_cache_type =1
    #query_cache_limit=102400
    #query_cache_size = 2147483648
    #query_cache_min_res_unit=1024

    1
    2
    3
    4

    1
    2
    3
    4

MySQL最大连接数,这个通常在1000-3000之间比较合适,根据系统硬件能力,需要对Linux打开的最大文件数做修改
max_connections =2100
下面这个参数是InnoDB最重要的参数,是缓存innodb表的索引,数据,插入数据时的缓冲,尽可能的使用内存缓存,对于MySQL专用服务器,通常设置操作系统内存的70%-80%最佳,但需要注意几个问题,不能导致system的swap空间被占用,要考滤你的系统使用多少内存,其它应用使用的内在,还有你的DB有没有myisa引擎,最后减去这些才是合理的值。
innodb_buffer_pool_size=4G
innodb_additional_mem_pool_size除了缓存表数据和索引外,可以为操作所需的其他内部项分配缓存来提升InnoDB的性能。这些内存就可以通过此参数来分配。推荐此参数至少设置为2MB,实际上,是需要根据项目的InnoDB表的数目相应地增加
innodb_additional_mem_pool_size=16M
innodb_max_dirty_pages_pct值的争议,如果值过大,内存也很大或者服务器压力很大,那么效率很降低,如果设置的值过小,那么硬盘的压力会增加.
innodb_max_dirty_pages_pct=90
MyISAM表引擎的数据库会分别创建三个文件:表结构、表索引、表数据空间。我们可以将某个数据库目录直接迁移到其他数据库也可以正常工作。然而当你使用InnoDB的时候,一切都变了。InnoDB 默认会将所有的数据库InnoDB引擎的表数据存储在一个共享空间中:ibdata1,这样就感觉不爽,增删数据库的时候,ibdata1文件不会自动收缩,单个数据库的备份也将成为问题。通常只能将数据使用mysqldump 导出,然后再导入解决这个问题。innodb_file_per_table=1可以修改InnoDB为独立表空间模式,每个数据库的每个表都会生成一个数据空间。
独立表空间
优点:

    每个表都有自已独立的表空间。
    每个表的数据和索引都会存在自已的表空间中。
    可以实现单表在不同的数据库中移动。
    空间可以回收(drop/truncate table方式操作表空间不能自动回收)
    对于使用独立表空间的表,不管怎么删除,表空间的碎片不会太严重的影响性能,而且还有机会处理。

缺点:

    单表增加比共享空间方式更大。

结论:
共享表空间在Insert操作上有一些优势,但在其它都没独立表空间表现好。
实际测试,当一个MySQL服务器作为Mycat分片表存储服务器使用的情况下,单独表空间的访问性能要大大好友共享表空间,因此强烈建议使用独立表空间。
当启用独立表空间时,由于打开文件数也随之增大,需要合理调整一下 innodb_open_files 、table_open_cache等参数。

    innodb_file_per_table=1
    innodb_open_files=1024
    table_open_cache=1024

    1
    2
    3

    1
    2
    3

Undo Log 是为了实现事务的原子性,在MySQL数据库InnoDB存储引擎中,还用Undo Log来实现多版本并发控制(简称:MVCC)。Undo Log的原理很简单,为了满足事务的原子性,在操作任何数据之前,首先将数据备份到Undo Log,然后进行数据的修改。如果出现了错误或者用户执行了 ROLLBACK语句,系统可以利用Undo Log中的备份将数据恢复到事务开始之前的状态。因此Undo Log的IO性能对于数据插入或更新也是很重要的一个因素。于是,从MySQL 5.6.3开始,这里出现了重大优化机会:
As of MySQL 5.6.3, you can store InnoDB undo logs in one or more separate undo tablespaces outside of the system tablespace. This layout is different from the default configuration where the undo log is part of the system tablespace. The I/O patterns for the undo log make these tablespaces good candidates to move to SSD storage, while keeping the system tablespace on hard disk storage. innodb_rollback_segments参数在此被重命名为innodb_undo_logs
因此总共有3个控制参数:innodb_undo_tablespaces表明总共多少个undo表空间文件,innodb_undo_logs定义在一个事务中innodb使用的系统表空间中回滚段的个数。如果观察到同回滚日志有关的互斥争用,可以调整这个参数以优化性能,默认是128最大值,官方建议先设小,若发现竞争,再调大 注意这里的参数是要安装MySQL时候初始化InnoDB引擎设置的,innodb_undo_tablespaces参数无法后期设定。
innodb_undo_tablespaces=128
innodb_undo_directory= SSD硬盘或者另外一块硬盘,跟数据分开
innodb_undo_logs=64
下面是InnoDB的日志相关的优化选项
innodb_log_buffer_size这是 InnoDB 存储引擎的事务日志所使用的缓冲区。类似于 Binlog Buffer,InnoDB 在写事务日志的时候,为了提高性能,也是先将信息写入 Innofb Log Buffer 中,当满足 innodb_flush_log_trx_commit 参数所设置的相应条件(或者日志缓冲区写满)之后,才会将日志写到文件(或者同步到磁盘)中。innodb_log_buffer_size 不用太大,因为很快就会写入磁盘。innodb_flush_log_trx_commit的值有0:log buffer中的数据将以每秒一次的频率写入到log file中,且同时会进行文件系统到磁盘的同步操作1:在每次事务提交的时候将log buffer 中的数据都会写入到log file,同时也会触发文件系统到磁盘的同步; 2:事务提交会触发log buffer 到log file的刷新,但并不会触发磁盘文件系统到磁盘的同步。此外,每秒会有一次文件系统到磁盘同步操作。对于非关键交易型数据,采用2即可以满足高性能的日志操作,若要非常可靠的数据写入保证,则需要设置为1,此时每个commit都导致一次磁盘同步,性能下降。
innodb_log_file_size此参数确定数据日志文件的大小,以M为单位,更大的设置可以提高性能,但也会增加恢复故障数据库所需的时间。innodb_log_files_in_group分割多个日志文件,提升并行性。innodb_autoextend_increment对于大批量插入数据也是比较重要的优化参数(单位是M)

    innodb_log_buffer_size=16M
    innodb_log_file_size =256M
    innodb_log_files_in_group=8
    innodb_autoextend_increment=128
    innodb_flush_log_at_trx_commit=2
    #建议用GTID的并行复制,以下是需要主从复制的情况下,相关的设置参数。
    #gtid_mode = ON
    #binlog_format = mixed
    #enforce-gtid-consistency=true
    300
    #log-bin=binlog
    #log-slave-updates=true


文件简介:
server.xml:保存了有关MyCAT的配置信息,包括MyCAT对外暴露的schema(包含这个schema对应的账户名和密码),MyCAT server的连接池等参数配置
cacheservice.properties:缓存区的配置

server.xml示例:

点击(此处)折叠或打开

    <?xml version="1.0" encoding="UTF-8"?>
    <!-- - - Licensed under the Apache License, Version 2.0 (the "License");
            - you may not use this file except in compliance with the License. - You
            may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0
            - - Unless required by applicable law or agreed to in writing, software -
            distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT
            WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the
            License for the specific language governing permissions and - limitations
            under the License. -->
    <!DOCTYPE mycat:server SYSTEM "server.dtd">
    <mycat:server xmlns:mycat="http://org.opencloudb/">
            <system>
            <property name="processors">32</property>
            <property name="processorExecutor">256</property>
            <property name="processorBufferPool">204800000</property>
            <property name="processorBufferChunk">40960</property>
                    <!--默认是65535 64K 用于sql解析时最大文本长度 -->
            <property name="maxStringLiteralLength">65535</property>
                    <!--<property name="sequnceHandlerType">0</property>-->
                    <!--<property name="backSocketNoDelay">1</property>-->
                    <!--<property name="frontSocketNoDelay">1</property>-->
                    <!--<property name="processorExecutor">16</property>-->
                    <!--
                            <property name="mutiNodeLimitType">1</property> 0:开启小数量级(默认) ;1:开启亿级数据排序
                            <property name="mutiNodePatchSize">100</property> 亿级数量排序批量
                            <property name="processors">32</property> <property name="processorExecutor">32</property>
                            <property name="serverPort">8066</property> <property name="managerPort">9066</property>
                            <property name="idleTimeout">300000</property> <property name="bindIp">0.0.0.0</property>
                            <property name="frontWriteQueueSize">4096</property> <property name="processors">32</property> -->
            <property name="defaultSqlParser">druidparser</property>
            </system>
            <!--
            <user name="root">
                    <property name="password">root</property>
                    <property name="schemas">test</property>
            </user>

            <user name="root_read">
                    <property name="password">root_read</property>
                    <property name="schemas">test</property>
                    <property name="readOnly">true</property>
            </user>
            -->
            <user name="test">
                    <property name="password">test</property>
                    <property name="schemas">test</property>
            </user>

            <!-- <cluster> <node name="cobar1"> <property name="host">127.0.0.1</property>
                    <property name="weight">1</property> </node> </cluster> -->
            <!-- <quarantine> <host name="1.2.3.4"> <property name="user">test</property>
                    </host> </quarantine> -->

    </mycat:server>

PS:MyCAT对外暴露的schema,是可以使用readonly模式的,如上面配置文件中的加红部分;

processors:用于指定可用线程数,实际上由于现在的多核CPU和超线程技术,这个值可以酌情调高,这里调到了虚拟机核数的八倍,感觉稍稍有点高了,实际上四倍or五倍就差不多了

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

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

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

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

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


cacheservice.properties示例:

点击(此处)折叠或打开

    #used for mycat cache service conf
    factory.encache=org.opencloudb.cache.impl.EnchachePooFactory
    #key is pool name ,value is type,max size, expire seconds
    pool.SQLRouteCache=encache,1500000,60
    pool.ER_SQL2PARENTID=encache,2000,180
    layedpool.TableID2DataNodeCache=encache,3000,18000
    layedpool.TableID2DataNodeCache.TESTDB_ORDERS=10000,18000

cacheservice是SQL的缓存服务,

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




6.支持内存和外存并存的排序方式,结果集排序可以达上亿规模。此时应注意:

    a.此时前端和后端空闲连接超时检测时间应该设置大些,避免空闲检测关闭front或者backend
    connection,造成Mysqlclient连接丢失时结果集无法正确。
    b.设置-Xmn值尽可能大些,新生代使用UseParallelGC垃圾回收器,-Xss设置512K比较合适,物理内存足够时,MaxDirectMemorySize尽可能设置大些,可以加快结果集处理时间,

例如:

-Xmx1024m -Xmn512m -XX:MaxDirectMemorySize=2048m -Xss256k -XX:+UseParallelGC


3 processors属性
这个属性主要用于指定系统可用的线程数,默认值为机器CPU核心线程数。
主要影响processorBufferPool、processorBufferLocalPercent、processorExecutor属性。NIOProcessor的个数也是由这个属性定义的,所以调优的时候可以适当的调高这个属性。
4 processorBufferChunk属性
这个属性指定每次分配Socket Direct Buffer的大小,默认是4096个字节。这个属性也影响buffer pool的长度。如果一次性获取的数过大buffer不够用 经常出现警告,则可以适当调大。
5 processorBufferPool属性
这个属性指定bufferPool计算 比例值。由于每次执行NIO读、写操作都需要使用到buffer,系统初始化的时候会建立一定长度的buffer池来加快读、写的效率,减少建立buffer的时间。
Mycat中有两个主要的buffer池:
- BufferPool
- ThreadLocalPool
BufferPool由ThreadLocalPool组合而成,每次从BufferPool中获取buffer都会优先获取ThreadLocalPool中的buffer,未命中之后才会去获取BufferPool中的buffer。也就是说ThreadLocalPool是作为BufferPool的二级缓存,每个线程内部自己使用的。当然,这其中还有一些限制条件需要线程的名字是由$_开头。然而,BufferPool上的buffer则是每个NIOProcessor都共享的。
默认这个属性的值为: 默认bufferChunkSize(4096) * processors属性 * 1000
BufferPool的总长度 = bufferPool / bufferChunk。
若bufferPool不是bufferChunk的整数倍,则总长度为前面计算得出的商 + 1
假设系统线程数为4,其他都为属性的默认值,则:
bufferPool = 4096 * 4 * 1000
BufferPool的总长度 : 4000 = 16384000 / 4096
这里写图片描述
6 processorBufferLocalPercent属性
前面提到了ThreadLocalPool。这个属性就是用来控制分配这个pool的大小用的,但其也并不是一个准确的值,也是一个比例值。这个属性默认值为100。
线程缓存百分比 = bufferLocalPercent / processors属性。
例如,系统可以同时运行4个线程,使用默认值,则根据公式每个线程的百分比为25。最后根据这个百分比来计算出具体的ThreadLocalPool的长度公式如下:
ThreadLocalPool的长度 = 线程缓存百分比 * BufferPool长度 / 100
假设BufferPool的长度为 4000,其他保持默认值。
那么最后每个线程建立上的ThreadLocalPool的长度为: 1000 = 25 * 4000 / 100
7 processorExecutor属性
这个属性主要用于指定NIOProcessor上共享的businessExecutor固定线程池大小。mycat在需要处理一些异步逻辑的时候会把任务提交到这个线程池中。新版本中这个连接池的使用频率不是很大了,可以设置一个较小的值。
8 sequnceHandlerType属性
指定使用Mycat全局序列的类型。0为本地文件方式,1为数据库方式,2为时间戳序列方式,3为分布式ZK ID生成器,4为zk递增id生成。
从1.6增加 两种ZK的全局ID生成算法。



2 maxCon属性
指定每个读写实例连接池的最大连接。也就是说,标签内嵌套的writeHost、readHost标签都会使用这个属性的值来实例化出连接池的最大连接数。
3 minCon属性
指定每个读写实例连接池的最小连接,初始化连接池的大小。


Benchmark属性 Benchmark:mycat连接服务降级处理: benchmark 基准, 当前端的整体connection数达到基准值是, 对来自该账户的请求开始拒绝连接,0或不设表示不限制 例如

<property name="benchmark">1000</property>
---------------------
作者:u014180504
来源:CSDN
原文:https://blog.csdn.net/u014180504/article/details/76595247
版权声明:本文为博主原创文章,转载请附上博文链接!

猜你喜欢

转载自www.cnblogs.com/seasonzone/p/10032432.html