本篇內容來自於網絡
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
不夠的情況下,繼續加大。
