本文档从内存、日志、系统资源、JVM 资源以及 netty等几个方面介绍了如何对APIGateWay 进行性能调优,以供用户参考。
# 内存:
增大 APIGateWay运行时 JVM 内存使用范围,在文件 /bin/startup.sh|bat 中增加:JAVA_OPTS="-Xms1024m -Xmx2048m "。Xms 和 Xmx 的值可根据系统配置进行调整。(建议-Xmx 为 8G-Xms 为 2G,具体大小应视应用场景及硬件环境而定)
# 日志:
日志打印级别设置:
将日志配置文件修改为 ERROR 级别。 文件路径/config/gateway-log-logback.xml,esbesb-monitor-logwriter.xml中的logwriter.enable改为false
# JVM资源:
参数项 | 说明 |
---|---|
-Xnoclassgc | 关闭 CLASS 的垃圾回收功能(即在 CLASS 没有对应的实例时也不立即回收) |
-Xms3072m | 设置堆最小使用内存为 3G。(具体大小应视 应用场景及硬件环境而定) |
-Xmx3072m | 设置堆最大使用内存为 3G。(具体大小应视 应用场景及硬件环境而定) |
-Xmn1024m | 设置堆年轻代大小为 1G。(具体大小应视应 用场景而定。参见附录) |
-XX:MaxPermSize=256m | 设置持久代大小为 256M。(具体大小应视应 用场景而定。参见附录) |
-XX:-UseParallelOldGC | 对年老代执行并行 GC。(在支持多线程环境 中有效) |
-XX:+DisableExplicitGC | 关闭 System.gc() |
-Dsun.rmi.dgc.client.gcInte rval=3600000 | 设置 GC 间隔为 1 小时(client 模式) |
-Dsun.rmi.dgc.server.gcInt erval=3600000 | 设置 GC 间隔为 1 小时(server 模式) |
操作系统 Linux系统的调优参数如下: 修改文件 /etc/selinux/config 把 SELINUX=enforcing修改成SELINUX=disabled,需要重启机器。 以下配置重启机器后还原,需要重新设置。
[root@localhost ~]# cd /proc/sys/net/ipv4
[root@localhost ipv4]# echo "1">tcp_tw_recycle
[root@localhost ipv4]# echo "1" > tcp_tw_reuse
[root@localhost ipv4]# echo "1024 65000" > ip_local_port_range
[root@localhost ipv4]# echo "5">tcp_fin_timeout
[root@localhost ipv4]# service iptables stop
使内核参数生效
[root@localhost~]#/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。
-XX:MaxTenuringThreshold=0:设置垃圾最大年龄。如果设置为 0 的话,
则年轻代对象不经过 Survivor 区,直接进入年老代。对于年老代比较 多的应用,可以提高效率。如果将此值设置为一个较大值,则年轻代对 象会在 Survivor 区进行多次复制,这样可以增加对象再年轻代的存活 时间,增加在年轻代即被回收的概论。
# Netty:
设置reactor.netty.ioWorkerCount=建议范围:CPU核心数的3~4倍(网关对此配置进行过优化,默认为CPU核心数的3倍,最小值为4)
配置从客户端接收的最大数据块(chunk)的大小。避免对响应体进行拆分:
server.netty.max-chunk-size=10240(默认为8192,8KB)
启用Gzip压缩响应体,开启 GZip 压缩可以减小响应体的大小,提高网络传输效率(请确保你的后端服务支持 Gzip 压缩并正确地处理了相应的请求头。如果后端服务不支持 Gzip,那么网关可能不会发送 Gzip 压缩的响应):
server.compression.enabled=true(默认为false)
spring.cloud.gateway.httpclient.compression=true(默认为false)