# 性能调优指南
# 一、系统关键参数配置
# 设置操作系统的open files大小
通过ulimit -a 命令能产看当前系统的open files大小。
执行vim /etc/security/limits.conf命令在文件中配置以下内容。
root soft nofile 65536
root hard nofile 65536
- 修改之后注销用户,然后重新登录,配置的open files就能生效。
# 二、jvm关键参数配置
在启动脚本(%InstallPath%/bin/startup.sh)中添加以下配置内容。
# 配置堆内存、非堆内存大小和SUN JDK 的GC策略,具体根据实际情况调整,以下配置仅供参考
export EOS_DAP_MEM_OPTS="-Xms512m -Xmx4096m -Xmn256m"
export JAVA_OPTS="$JAVA_OPTS -XX:+UseParNewGC -XX:ParallelGCThreads=4 -XX:MaxTenuringThreshold=9 -XX:+UseConcMarkSweepGC"
# 三、数据库关键参数配置
根据场景的实际并发数,设置数据库的连接池最大连接数和最小连接数。
例如,场景中使用的用户并发数为100,所以将数据库初始连接数和最小连接数设置为200,最大连接数设置为300。 注意:数据库服务端的最大连接数需要大于300(比如2000);连接最大等待超时时间也要调大,比如至少一个小时。
修改user-config.xml文件:
<group name="default">
<configValue key="Database-Type">MySql</configValue>
<configValue key="Jdbc-Type"/>
<configValue key="C3p0-DriverClass">com.mysql.jdbc.Driver</configValue>
<configValue key="C3p0-Url">jdbc:mysql://127.0.0.1:3306/demo?characterEncoding=utf-8&serverTimezone=Asia/Shanghai&useSSL=false</configValue>
<configValue key="C3p0-UserName">root</configValue>
<configValue key="C3p0-Password">root</configValue>
<!-- 初始连接数 -->
<configValue key="C3p0-PoolSize">200</configValue>
<!-- 最小连接数 -->
<configValue key="C3p0-MinPoolSize">200</configValue>
<!-- 最大连接数 -->
<configValue key="C3p0-MaxPoolSize">300</configValue>
<!-- 最大空闲时间,单位秒,0表示连接永不过期 -->
<configValue key="C3p0-MaxIdleTime">600</configValue>
<!-- 空闲监测周期,单位秒 -->
<configValue key="C3p0-IdleConnectionTestPeriod">900</configValue>
<!-- 辅助线程数,用于执行后台任务(如连接测试、清理、Statement 缓存回收等) -->
<configValue key="C3p0-NumHelperThreads">5</configValue>
<!-- PreparedStatement缓存最大语句数,0表示不缓存 -->
<configValue key="C3p0-MaxStatements">0</configValue>
<!-- 控制当连接池中没有可用连接时,客户端等待获取连接的最长时间,单位毫秒 -->
<configValue key="C3p0.checkoutTimeout">3000</configValue>
<configValue key="Transaction-Isolation">ISOLATION_DEFAULT</configValue>
<configValue key="Test-Connect-Sql">SELECT count(*) from EOS_UNIQUE_TABLE</configValue>
<configValue key="Retry-Connect-Count">-1</configValue>
</group>
# 四、应用关键参数配置
# 1. web容器的线程配置参数
根据场景的实际并发数,设置所需要的处理线程数,一般不超过1000。
修改application.properties文件中web容器相关参数配置:
# 请求队列大小
server.app-server.accept-count=1000
# 最大线程数
server.app-server.max-threads=500
# 最小空闲线程数
server.app-server.min-spare-threads=100
# 最大并发连接数
server.app-server.max-connections=500
# 连接超时时间,单位为ms,压测时按需调整
server.app-server.connection-timeout=10000
server.connection-timeout=10000
# 2. 修改日志级别
修改logback-spring.xml文件,调整日志级别,根据项目需要调整具体日志级别,建议在下面三个级别中选择 INFO/WARN/ERROR。
<property name="EOS_ENGINE_LOG_LEVEL" value="ERROR"/>
<property name="EOS_TRACE_LOG_LEVEL" value="ERROR"/>
<property name="EOS_SQL_LOG_LEVEL" value="ERROR"/>
<property name="EOS_SYS_LOG_LEVEL" value="ERROR"/>
<property name="EOS_DAP_APP_LOG_LEVEL" value="ERROR"/>
<property name="EOS_DAP_TRACE_LOG_LEVEL" value="ERROR"/>
# 3. 修改序列号生成器的缓冲池大小
为了不在每次递增序列号的时候都访问数据库,提高性能,序列号生成器从数据库中预定了一定范围的序列号(默认为20)。 当每秒会向数据库中插入大量数据时,需要将序列号生成器的缓冲池大小改大。
修改sys-config.xml文件中PoolSize:
<group name="PoolSize">
<configValue key="PoolSize">10000</configValue>
</group>
# 4. 关闭统计监控
Server的统计监控功能会影响性能,可选择性关闭统计监控功能。
修改user-config.xml文件中各group中key="Status"的值为close:
<module name="Statistic">
<!--logic flow execution statistics-->
<group name="Bizflow">
<!--possible values :openore close, statistics is enabled only when is open-->
<configValue key="Status">close</configValue>
<!--the statistics data queue length,range (0,1000],default to 50-->
<configValue key="Queue-Length">50</configValue>
</group>
<!--pageflow execution statistics-->
<group name="Pageflow">
<!--open|close-->
<configValue key="Status">close</configValue>
<configValue key="Queue-Length">50</configValue>
</group>
<!--sql execution statistics-->
<group name="Sql">
<!--open|close-->
<configValue key="Status">close</configValue>
<configValue key="Queue-Length">50</configValue>
</group>
<!--the service call statistics-->
<group name="Service">
<!--open|close-->
<configValue key="Status">close</configValue>
<configValue key="Queue-Length">50</configValue>
</group>
<!--the webService call statistics-->
<group name="InvokeWebService">
<!--open|close-->
<configValue key="Status">close</configValue>
<configValue key="Queue-Length">50</configValue>
</group>
<group name="SpringBean">
<!--open|close-->
<configValue key="Status">close</configValue>
<configValue key="Queue-Length">50</configValue>
</group>
<group name="EOSService">
<!--open|close-->
<configValue key="Status">close</configValue>
<configValue key="Queue-Length">50</configValue>
</group>
</module>
修改sys-config.xml文件中,Connection/Monitor group中值设置为false:
<module name="Connection">
<!--
UnclosedConn[true|false,默认值false]:
是否统计未关闭的连接;
StackConn[true|false,默认值false]:
是否记录连接的调用栈,主要用于分析调用的路径,例如,可以观察那个调用导致长时间的连接未关闭;
UnclosedStatement[true|false,默认值false]:
是否统计未关闭的Statement;
StackStatement[true|false,默认值false]:
是否记录Statement的调用栈,主要用于分析调用的路径,例如,可以观察那个调用导致长时间的Statement未关闭;
UnclosedResultSet[true|false,默认值false]:
是否统计未关闭的ResultSet;
StackResultSet[true|false,默认值false]:
是否记录ResultSet的调用栈,主要用于分析调用的路径,例如,可以观察那个调用没有关闭ResultSet;
IsLogSqlExcTimes[true|false,默认值false]:是否统计SQL的执行次数
LogSqlWhenTimeout(单位毫秒):
SQL记录的执行时间阈值,如果超过(>=阈值)阈值则记录SQL语句(记录到系统日志中),否则不记录;
IsLogActiveConnNum[true|false,默认值false]:
是否统计当前活动的数据库连接数;
-->
<group name="Monitor">
<configValue key="UnclosedConn">false</configValue>
<configValue key="StackConn">false</configValue>
<configValue key="UnclosedStatement">false</configValue>
<configValue key="StackStatement">false</configValue>
<configValue key="UnclosedResultSet">false</configValue>
<configValue key="StackResultSet">false</configValue>
<!-- deprecated
<configValue key="IsLogSqlExcTimes">false</configValue>
<configValue key="IsLogSqlTime">false</configValue>
-->
<configValue key="LogSqlWhenTimeout">-1</configValue>
<configValue key="IsLogActiveConnNum">false</configValue>
<configValue key="IsLogSqlExcTimes">false</configValue>
<configValue key="IsLogSqlTime">false</configValue>
</group>
</module>
# 五、BPS Server调优方式
# 1. 修改日志配置
修改logback-spring.xml文件,调整日志级别,根据项目需要调整具体日志级别,建议在下面三个级别中选择 INFO/WARN/ERROR
<property name="EOS_ENGINE_LOG_LEVEL" value="ERROR"/>
<property name="EOS_TRACE_LOG_LEVEL" value="ERROR"/>
<property name="EOS_SQL_LOG_LEVEL" value="ERROR"/>
<property name="EOS_SYS_LOG_LEVEL" value="ERROR"/>
<property name="EOS_DAP_APP_LOG_LEVEL" value="ERROR"/>
<property name="EOS_DAP_TRACE_LOG_LEVEL" value="ERROR"/>
<property name="EOS_WF_AUDIT_LOG_LEVEL" value="ERROR"/>
<property name="EOS_WF_SYS_LOG_LEVEL" value="ERROR"/>
<property name="EOS_WF_MESSAGE_LOG_LEVEL" value="ERROR"/>
<property name="EOS_WF_REQUEST_LOG_LEVEL" value="ERROR"/>
<property name="EOS_WF_SOL_LOG_LEVEL" value="ERROR"/>
<property name="EOS_WF_MON_TX_LOG_LEVEL" value="ERROR"/>
# 2. 修改BPS引擎配置
将BPS运行参数配置中的实例缓存最大节点数和代理缓存最大节点数改大。inst_cache_max_nodes、agent_cache_max_nodes以下为示例
修改/config/BPS-SERVER/config/wfengine-config.xml文件:
<module name="wfcluster">
<group name="wfcache">
<!-- 引擎集群通知开关 -->
<configValue key="enable">false</configValue>
<!-- 流程实例缓存的实例数上限 -->
<configValue key="inst_cache_max_nodes">20000</configValue>
<!-- 代理关系缓存的实例数上限 -->
<configValue key="agent_cache_max_nodes">20000</configValue>
<configValue key="auto_delete_processinst">true</configValue>
<configValue key="always_persistent_processinst">false</configValue>
<configValue key="always_persistent_activityinst">false</configValue>
</group>
</module>
# 六、业务调优
1.使用数据库索引提升查询性能。比如在IDE中表单设置的多个实体关联,应该在关联字段处增加数据库索引提高性能。
2.后台代码,不要在循环中进行数据库操作,应该将数据库操作放在循环外部。
3.数据库语句中,对于大表(超过百万条记录),不要使用count,distinct,group by,查询所有但不分页之类的sql。