java8 JVM调优 及 centos 调优

调优有两种情况,一种是系统部署之初的调优规划,需要根据项目特点和硬件特点以及估算的TPS进行基本调优,另外一种就是系统出现了性能瓶颈而针对性的进行排查调优。本文只是介绍常规的调优操作,供同仁参考。

JVM 调优

JVM 调优需要有一定的 JVM 相关知识基础,需要了解堆栈内存,了解jvm 垃圾收集器,了解jvm 性能监控常用工具,能够读懂gc日志 等,推荐如果不了解的话,先去读一下相关的书籍。

jdk8 参考JVM 配置:

JDK 1.8中 PermSize 和 MaxPermGen 已经无效。JDK 1.8 中已经不存在永久代的结论,而以 元空间 代替。推荐的JVM参数:

-Xms2G -Xmx2G -Xmn256m -XX:MetaspaceSize=512M -XX:MaxMetaspaceSize=512M -Xss256k \ 
-XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSClassUnloadingEnabled \
-XX:+HeapDumpOnOutOfMemoryError -verbose:gc -XX:+PrintGCDetails \
-XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -Xloggc:/appl/gc.log \
-XX:CMSInitiatingOccupancyFraction=75 -XX:+UseCMSInitiatingOccupancyOnly

参数解释:

  • -Xms2G 初始分配的堆内存
  • -Xmx2G 最大允许分配的堆内存,这两个配成一样。
  • -Xmn256m 年轻代大小,建议不要太大,太大可能会是YGC时间过长,影响吞吐量
  • -XX:MetaspaceSize=512M 初始元空间大小,达到该值就会触发垃圾收集进行类型卸载,同时GC会对该值进行调整:如果释放了大量的空间,就适当降低该值;如果释放了很少的空间,那么在不超过MaxMetaspaceSize时,适当提高该值。
  • -XX:MaxMetaspaceSize=512M
  • -Xss256k 设置每个java线程堆栈的大小为256,jdk 1.5+默认线程堆栈大小为1M
  • -XX:+UseConcMarkSweepGC 并发标记清除(CMS)收集器,一般和 XX:+UseParNewGC 一起设置使用
  • -XX:+UseParNewGC 平行年轻代收集器
  • -XX:+CMSClassUnloadingEnabled
  • -XX:+HeapDumpOnOutOfMemoryError 表示当JVM发生OOM时,自动生成DUMP文件。
  • **-XX:HeapDumpPath=${目录}**参数表示生成DUMP文件的路径,也可以指定文件名称,例如:-XX:HeapDumpPath=${目录}/java_heapdump.hprof。如果不指定文件名,默认为:java_
  • -verbose:gc 输出GC日志 , -XX:+PrintGC 与 -verbose:gc 是一样的,可以认为-verbose:gc 是 -XX:+PrintGC的别名.
  • -XX:+PrintGCDetails 打印GC详细信息
  • -XX:+PrintGCTimeStamps 打印gc时间戳
  • -XX:+PrintGCDateStamps
  • -Xloggc:/appl/gc.log 定义gc日志目录
  • -XX:CMSInitiatingOccupancyFraction=75 是指设定CMS在对内存占用率达到75%的时候开始GC(因为CMS会有浮动垃圾,所以一般都较早启动GC);
  • -XX:+UseCMSInitiatingOccupancyOnly 只是用设定的回收阈值(上面指定的75%),如果不指定,JVM仅在第一次使用设定值,后续则自动调整

JDK 11 参考 JVM 配置

-server
-Xmx4g
-Xms4g
-Xss256k
-XX:MaxDirectMemorySize=256m
-XX:+UseG1GC     // 使用 G1 垃圾回收期,11 中已经废弃了 CMS 垃圾回收期
-XX:+UseCompressedOops 
-XX:+UseCompressedClassPointers
-XX:+SegmentedCodeCache 
-verbose:gc
-XX:+PrintCommandLineFlags
-XX:+ExplicitGCInvokesConcurrent
-Djava.security.egd=file:/dev/./urandom
-Xlog:gc*,safepoint:/data/log/gc.log:time,uptime:filecount=100,filesize=50M

G1 回收期不必明确设置新生代大小,其自动调优也十分可靠,也不用显示设置最大GC 最大停顿时间,JVM 会自动调整停顿时间往往在,长时间运行后可以达到预期效果,

操作系统调优

硬件如 CPU、内存、硬盘、带宽等,这个属于钱能解决的问题,不解释。

系统:内核参数调. (最大 打开文件数、进程数,等

linux 服务器,centons 7 .

修改 最大打开文件数。

系统级打开最大文件句柄的数量 (一般不做调整,除非并发特别大 ),通常修改文件/proc/sys/fs/file-max来临时生效,不同的云提供商对这个值有默认值。
永久生效的修改方法,修改文件,文件末尾加入配置内容:

# vim /etc/sysctl.conf
fs.file-max = 2000000

然后执行命令,使修改配置立即生效:

sysctl -p

进程级别 ,最大打开文件句柄数 设置。 (默认都小于系统级的大小),在/etc/security/limits.conf 最后增加: (参考的腾讯云默认配置)

* soft nproc 100001    #警告设定所有用户最大打开进程数为10001

* hard nproc 100001     # 严格设定所有用户最大打开进程数为100001

* soft nofile 100001     # 警告设定所有用户最大打开文件数为100001

* hard nofile 100002    # 严格设定所有用户最大打开文件数为100002
  • soft 表示警告的设定,可以超过这个设定值,但是超过会有警告信息
  • hard 表示严格的设定,必定不能超过这个设定的值

修改以后,重新登录后生效。

对于服务器,一般修改进程级的最大打开文件句柄数即可(系统默认1024,有点小)。一般不需要调整系统级的最大数。如果出现了达到系统级别最大限制时,也需要同步调整系统级的最大数的。

TCP 相关参数优化

参数太多,挑选常见的几个:
修改 /etc/sysctl.conf,修改完成执行 sysctl -p 生效。

# 操作系统网络的 buffer size
# 内核分配给TCP连接的内存 ,单位是Page,1 Page = 4096 Bytes
# 4G 内存机器 使用,TCP连接最多约使用1.6GB内存 , 计算方式:393216*4096/1024/1024=1.6G
net.ipv4.tcp_mem = 196608  262144  393216

# 为每个TCP连接分配的读、写缓冲区内存大小,单位是Byte,格式为:最小内存  缺省内存  最大内存
# 一般按照缺省值分配,下面的例子就是读写均为8KB,共计16KB
# 1.6G 内存使用, TCP内存能容纳的连接数,约为  1600MB/16KB = 100K = 10万
# 4G 内存使用,TCP内存能容纳的连接数,约为  4000MB/16KB = 250K = 25万
net.ipv4.tcp_rmem = 4096	8192	4194304
net.ipv4.tcp_wmem = 4096	8192	4194304

# 端口最大的监听队列的长度,定义了系统中每一个端口最大的监听队列的长度,这是个全局的参数,默认值为128
net.core.somaxconn= 4000   # 也可以这样修改echo 4000 > /proc/sys/net/core/somaxconn

# 同时需要修改下全局配置
# 表示开启SYN Cookies,当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭
net.ipv4.tcp_syncookies = 1
#表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭
net.ipv4.tcp_tw_reuse = 1
# 表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭
net.ipv4.tcp_tw_recycle = 1
# 修改系統默认的 TIMEOUT 时间。
net.ipv4.tcp_fin_timeout = 30
# 表示当keepalive起用的时候,TCP发送keepalive消息的频度。缺省是2小时,改为20分钟
net.ipv4.tcp_keepalive_time = 1200
# 表示用于向外连接的端口范围。缺省情况下很小:32768到61000,改为10000到65000。注意:这里不要将最低值设的太低,否则可能会占用掉正常的端口!
net.ipv4.ip_local_port_range = 10000 65000
# 表示SYN队列的长度,默认为1024,加大队列长度为8192,可以容纳更多等待连接的网络连接数。
net.ipv4.tcp_max_syn_backlog = 8192
#表示系统同时保持TIME_WAIT的最大数量,如果超过这个数字,TIME_WAIT将立刻被清除并打印警告信息。默 认为180000,改为5000。
net.ipv4.tcp_max_tw_buckets = 5000
# 当orphans达到32768个时,会报Out of socket memory,此时占用内存 32K*64KB=2048MB=2GB,(单个socket可占用多达 64KB 内存),实际可能小一些
net.ipv4.tcp_max_orphans = 65536
#单个socket废弃前重试的次数,重负载web服务器建议调小,设置较小的数值,可以有效降低orphans的数量
net.ipv4.tcp_orphan_retries = 1
# 活动TCP连接重传次数,超过次数视为掉线,放弃连接。缺省值:15,建议设为 2或者3
net.ipv4.tcp_retries = 2
#TCP三次握手的syn/ack阶段,重试次数,缺省5,设为2-3
net.ipv4.tcp_synack_retries = 2
# 网络设备的收发包的队列大小
net.core.netdev_max_backlog = 2048

参考链接:https://juejin.im/post/5d4e2aa7f265da03d15540b9

你可能感兴趣的:(Linux,Java虚拟机)