容器化JVM系统Dubbo参数配置 经验总结

容器化配置

JDK 1.8 JVM参数

对于无大量代理类和需要装载大量第三方外部包的情况下,元空间需要设置一个上限值,并且建议MetaspaceSize值等于MaxMetaspaceSize值,防止触发容器被直接kill掉,具体原因可参考https://blog.csdn.net/u011381576/article/details/79635867
老年代预留128M(根据是否使用大缓存修改)

容器配置类型(2C 2.5G)

-Xms2048m -Xmx2048m -Xmn1920m -Xss256k -XX:MetaspaceSize=64m  -XX:MaxMetaspaceSize=64m -XX:+DisableExplicitGC -XX:+UseConcMarkSweepGC -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:LargePagwSizeInBytes=128m –Denv=Test
-XX:UseFastAccessorMethods –XX:UseCMSInitiatingOccupancyOnly –XX:CMSInitiatingOccupancyFraction=70 –XX:+HeapDupOnOutOfMemoryError –XX:+DisableExplicitGC –XX:HeapDumpPath=/log/dump/服务名/容器IP/
-XX:+PrintGCDetails –XX:+PrintGCDateStamps –XX:+printGCTimeStamps –XX+UseGCLOgFileRotation –XX:NumberOfGCLogFiles=10 –XX:GCLOgFileSize=5M –Xloggc:/log/dump/服务名/容器IP/gc.log

容器配置类型(4C 4.5G)

对于无需动态生成类的情况下,元空间需要设置一个上限值,并且建议MetaspaceSize值等于MaxMetaspaceSize值,防止触发容器被直接kill掉,具体原因可参考(https://blog.csdn.net/u011381576/article/details/79635867)
老年代预留128M(根据是否使用大缓存修改)

-Xms4096m –Xmx4096m –Xmn3968m –Xss256K -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=128m -XX:+DisableExplicitGC -XX:+UseConcMarkSweepGC -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:LargePagwSizeInBytes=128m –Denv=Test
-XX:UseFastAccessorMethods –XX:UseCMSInitiatingOccupancyOnly –XX:CMSInitiatingOccupancyFraction=70 –XX:+HeapDupOnOutOfMemoryError –XX:+DisableExplicitGC –XX:HeapDumpPath=/log/dump/服务名/容器IP/
-XX:+PrintGCDetails –XX:+PrintGCDateStamps –XX:+printGCTimeStamps –XX+UseGCLOgFileRotation –XX:NumberOfGCLogFiles=10 –XX:GCLOgFileSize=5M –Xloggc:/log/dump/服务名/容器IP/gc.log

dubbo配置

provider 事项:

服务调用超时时间需要设置合理,protocol 可以设置序列化方式,目前 Dubbo+Protobuf
或 spring-cloud 继承google的grpc 作为RPC通信协议的效果较好。

服务线程数配置需要满足

threads <= service1.executes1 + service1.executes2 + service1.executes3

如果dubbo版本在2.8.4 之前或等于,服务线程数配置需要满足(因限流的当前运行线程数为非线程安全导致的bug,会导致接受的请求数会超过设置的executes导致Thread pool is EXHAUSTED异常)

threads <= (service1.executes1 + service1.executes2 + service1.executes3) * 0.8~0.9

如果方法级未配置executes,所有方法(仅1个方法)公用该线程池情况下,设服务副本数为n
服务线程池threads配置为m,需满足因dubbo默认负载均衡(随机)导致可能的请求量比平均值高出30%分配到某服务上导致的线程池耗尽异常。

        前端并发数 <= n*m*0.7~0.9
        2C 机器配置参考 200 尽量通过增加副本数的情况下,让平均请求数低于150
	    4C 机器配置参考 400 尽量听过增加副本数的情况下,让平均请求数低于300

一般服务端配置

<dubbo:protocol id="dubbo" name="${service.name}" port="3+xxxx服务编号等保证不重复" threads="${server.threads}" />

<dubbo:service 
	interface="com.ali.study.dubbo.provider.demo.IGetAccountInfo"
	protocol="dubbo" ref="accountServiceImpl" version="${version}" timeout="${client.timeout}"
	executes="${service1.executes1}" />

<dubbo:service 
	interface="com.ali.study.dubbo.provider.demo.IGetAccountInfo2"
	protocol="dubbo" ref="accountServiceImpl" version="${version}" timeout="${client.timeout}" 
	executes="${service1.executes2}"/>

<dubbo:service 
	interface="com.ali.study.dubbo.provider.demo.IGetAccountInfo3"
	protocol="dubbo" ref="accountServiceImpl3" version="${version}" timeout="${client.timeout}"
	executes="${service1.executes3}"/>
consumer 事项:

通过事务型MQ作为重试机制,可控性较好,dubbo默认的超时等异常情况下的重试机制不建议使用,
对于强制依赖外部服务启动的机制应用较少,一般为关闭状态。

<dubbo:reference id="accountServiceImpl" 
	interface="com.ali.study.dubbo.provider.demo.IGetAccountInfo"
	version="${version}" scope="remote" retries="0" check='false' />

操作系统镜像参数优化

/etc/sysctl.conf 配置
ulimit 最大连接数
net.ipv4.tcp_keepalive_time 检测客户端连接状态时间
net.ipv4.tcp_max_syn_backlog 当SYN等待队列溢出时,启动cookies来处理。
net.ipv4.ip_local_port_range 默认TCP端口为 32768-61000 可以扩大该范围
net.ipv4.tcp_max_tw_buckets 当一个连接关闭时,TCP会通过四次握手来完成一次关闭连接操作。在请求量比较大的情况下,消费端会有大量TIME_WAIT状态的连接。该参数可以限制TIME_WAIT状态连接数量(数量超过该值时,会被立刻清除并打印警告信息)
net.ipv4.tcp_tw_resuse 一个TIME_WAIT端口被重复复用的间隔时间(与四部握手关闭有关,防止前一个关闭端口的信息发送到新端口)

[hsy@localhost ~]# ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 127900
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1048576
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 1048576
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited
[hsy@localhost ~]#cat /etc/sysctl.conf
Net.ipv4.tcp_syncookies = 1
Net.ipv4.tcp_tw_reuse = 1
Net.ipv4.tcp_tw_recycle = 1
Net.ipv4.tcp_fin_timeout = 30

SFTP

开启被动模式,主动模式由于容器外访问容器里的IP不可达导致SFTP不可用

Docker 使用COREDNS 还是 默认DNS

目前测试结果不是性能瓶颈,暂未调优。(4C 3台)

MYSQL

设置缓存区大小为虚拟机内存的一半
修改SQL缓冲区 buffer大小,防止因批量插入导致的缓存区溢出

Redis

快照 和 文件追加持久化方式混合
3主6从集群模式配置

你可能感兴趣的:(java)