本文档从内存、日志、系统资源、JVM 资源以及 Jetty 等几个方面介绍了如何对 ESB Server 进行性能调优,以供用户参考。
# 内存
增大 ESB Server 运行时 JVM 内存使用范围,在文件 {ESB Server安装目录}/server/bin/start.sh|bat 中增加:JAVA_OPTS="-Xms1024m -Xmx2048m "。 Xms 和 Xmx 的值可根据系统配置进行调整。(建议-Xmx 为 8G-Xms 为 2G,具体大小应视应用场景及硬件环境而定)
# 日志
日志打印级别设置:将日志配置文件修改为 ERROR 级别。 文件路径:{ESB Server安装目录}/server/conf/logback-spring.xml
监控日志输出设置:{ESB Server安装目录}/server/EOS/_srv/config/esb-monitor-logwriter.xml, 文件中 logwriter 节点的 enable 属性,将值设为 false 关闭监控日志输出。
# 系统资源
全局任务线程池(GlobalTaskExecutor)
通过 {ESB Server安装目录}/server/EOS/_srv/config/esb-system-config.xml 修改全局 线程池配置,如下:
<group name="GlobalTaskExecutor">
<configValue key="MaxSize">60</configValue>建议 1000
<configValue key="QueueCapacity">1000</configValue>
<configValue key="KeepAliveSeconds">60</configValue>
<configValue key="CoreSize">30</configValue>建议 300
<configValue key="RejectionPolicy">CALLER_RUNS</configValue>
</group>
其中 MaxSize 为最大线程数、CoreSize 为核心线程数。
任务线程池(TaskExecutor):
任务线程数在 module 中以"_tp"结尾的配置文件中配置,如下:
<task-executor enable="true" id="T est" parentId="Test" requiredVarConfigId="Test">
<coreSize>30</coreSize>
<keepAliveSeconds>30</keepAliveSeconds>
<maxSize>100</maxSize>
<queueCapacity>1000</queueCapacity>
<rejectionPolicy>CALLER_RUNS</rejectionPolicy>
</task-executor>
如果将 enable 的值设置为 false,那么将使用全局任务线程池。只有在 enable 的值为 true 时配置才会生效。一般情况下,coreSize 的值的设置应 该不小于进行压力测试时的最大用户数。
如果在业务场景中存在交易量不平稳,在某些时间段会出现交易峰值超过服务处理能力的情况时,根据业务接口的实际情况如果允许交易排队等待以实现削峰填谷可将 queueCapacity配置加大,此配置加大不会提高ESB或原服务的处理能力,仅作为避免突发大量交易造成服务不稳定的一种解决方案。
# Jetty 线程(JettyExecutor)
在 HTTP/WS 穿透场景中,ESBServer 采用 Jetty 容器接入外部 HTTP 请求,通过修改 {ESB Server安装目录}\server\plugins下面 com.primeton.esb.service.online-9.0.0.0-LA.jar\META-INF\template\transport_http_conn.vm文件对 jetty 进行配置,如下:
<jetty-executor enable="true" id="Test" parentId="Test" poolMinThread="30" requiredVarConfigId="Test">建议 300
<acceptors>5</acceptors> 建议 10-12
<lowResourcesConnections>50</lowResourcesConnections> 建议 50000
<lowResourcesMaxIdleTime>500</lowResourcesMaxIdleTime> 建议 50000
<maxIdleTime>3000</maxIdleTime> 建议 30000
<poolMaxThreads>${max}</poolMaxThreads> 建议 500-800
</jetty-executor>
poolMinThread、poolMaxThreads 为最小/大线程数,由于 jetty 采用 NIO 处理, 所以这两个数值采用默认即可。Acceptors 为工作线程,通常为机器 CPU 核心数 +1。
# JVM资源
参数项 | 说明 |
---|---|
-Xnoclassgc | 关闭 CLASS 的垃圾回收功能(即在 CLASS 没有对应的实例时也不立即回收) |
-Xms3072m | 设置堆最小使用内存为 3G。(具体大小应视 应用场景及硬件环境而定) |
-Xmx3072m | 设置堆最大使用内存为 3G。(具体大小应视 应用场景及硬件环境而定) |
-Xmn1024m | 设置堆年轻代大小为 1G。(具体大小应视应 用场景而定。参见附录) |
-XX:MaxMetaspaceSize=256m | 设置持久代大小为 256M。(具体大小应视应 用场景而定。参见附录) |
-XX:-UseParallelOldGC | 对年老代执行并行 GC。(在支持多线程环境 中有效) |
-XX:+DisableExplicitGC | 关闭 System.gc() |
-Dsun.rmi.dgc.client.gcInterval=3600000 | 设置 GC 间隔为 1 小时(client 模式) |
-Dsun.rmi.dgc.server.gcInterval=3600000 | 设置 GC 间隔为 1 小时(server 模式) |
# 操作系统
Linux系统的调优参数如下:
修改文件 /etc/selinux/config 把 SELINUX=enforcing修改成SELINUX=disabled,需要重启机器。
以下配置重启机器后还原,需要重新设置。
cd /proc/sys/net/ipv4
echo "1">tcp_tw_recycle
echo "1" > tcp_tw_reuse
echo "1024 65000" > ip_local_port_range
echo "5">tcp_fin_timeout
service iptables stop
使内核参数生效
/sbin/sysctl -p
//后台报错:too many open files时,需要修改该值,具体如下:
ulimit -n 数字
# 附录
JVM 中最大堆大小有三方面限制:
相关操作系统的数据模型(32-bit 还是 64-bit)限制;
系统的可用虚拟内存限制;
系统的可用物理内存限制;
典型设置
java -Xmx3550m -Xms3550m -Xmn2g -Xss128k
-Xmx3550m:设置 JVM 最大可用内存为 3550M。
-Xms3550m:设置 JVM 最小内存为 3550m。此值可以设置与-Xmx 相同,
以避免每次垃圾回收完成后 JVM 重新分配内存。 -Xmn2g:设置年轻代大小为 2G。 整个 JVM 内存大小=年轻代大小 + 年老代大小 + 持久代大小。持久代一般固定大小为 64m,所以增大年轻代 后,将会减小年老代大小。 此值对系统性能影响较大,官方推荐配置为 整个堆的 3/8。
-Xss128k:设置每个线程的堆栈大小。JDK5.0 以后每个线程堆栈大小为 1M,以前每个线程堆栈大小为 256K。更具应用的线程所需内存大小进 行调整。 在相同物理内 存下,减小这个 值能生成更多的线程。但是 操作系统对一个进程 内的线程数还是有限制的,不能无限生成,经 验值在 3000~5000 左右。
java -Xmx3550m -Xms3550m -Xss128k -XX:NewRatio=4 -XX:SurvivorRatio=4 -XX:MaxPermSize=16m -XX:MaxTenuringThreshold=0
XX:NewRatio=4:设置年轻代(包括 Eden 和两个 Survivor 区)与年老代的 比值(除去持久代)。设置为 4,则年轻代与年老代所占比值为 1:4, 年轻代占整个堆栈的 1/5
-XX:SurvivorRatio=4:设置年轻代中 Eden 区与 Survivor 区的大小比值。
设置为 4,则两个 Survivor 区与一个 Eden 区的比值为 2:4,一个 Survivor区占整个年轻代的 1/6
-XX:MaxPermSize=16m:设置持久代大小为 16m。整个堆的 1/4。
-XX:MaxTenuringThreshold=0:设置垃圾最大年龄。如果设置为 0 的话,
则年轻代对象不经过 Survivor 区,直接进入年老代。对于年老代比较 多的应用,可以提高效率。如果将此值设置为一个较大值,则年轻代对 象会在 Survivor 区进行多次复制,这样可以增加对象再年轻代的存活 时间,增加在年轻代即被回收的概论。