最近在做统一服务优化时发现使用容器时垃圾回收偏长,而我们的服务是一个响应时间优先的应用,需要对GC进行一些调优,在对容器内Java应用进行GC时发现:
(8核)如下是8核机器的GC,CMS,young gc基本在100ms左右
[GC (Allocation Failure) 1540815K->708720K(1992320K), 0.1204106 secs]
[GC (Allocation Failure) 1547632K->718037K(1992320K), 0.1039874 secs]
[GC (Allocation Failure) 1568245K->734990K(1992320K), 0.0979778 secs]
[GC (Allocation Failure) 1573902K->739338K(1992320K), 0.1270793 secs]
[GC (Allocation Failure) 1578250K->743388K(1992320K), 0.1074495 secs]
[GC (Allocation Failure) 1582300K->749564K(1992320K), 0.1199881 secs]
[GC (Allocation Failure) 1588476K->752993K(1992320K), 0.1134528 secs]
[GC (Allocation Failure) 1591905K->761514K(1992320K), 0.1208703 secs]
[GC (Allocation Failure) 1600426K->762095K(1992320K), 0.1214570 secs]
[GC (Allocation Failure) 1601007K->764275K(1992320K), 0.1035069 secs]
[GC (CMS Initial Mark) 775325K(1992320K), 0.0122687 secs]
[GC (CMS Final Remark) 1174093K(1992320K), 0.2219463 secs]
[GC (Allocation Failure) 1075577K->241414K(1992320K), 0.0959227 secs]
[GC (Allocation Failure) 1080326K->246942K(1992320K), 0.1073993 secs]
(8核)经发现与GC线程有关,通过指定并发GC线程数 -XX:ParallelGCThreads=8 -XX:ConcGCThreads=4,得到
[GC (Allocation Failure) 1631622K->798323K(1992320K), 0.0408915 secs]
[GC (Allocation Failure) 1637235K->797560K(1992320K), 0.0423643 secs]
[GC (Allocation Failure) 1636472K->803864K(1992320K), 0.0422181 secs]
[GC (Allocation Failure) 1642776K->813965K(1992320K), 0.0429882 secs]
[GC (Allocation Failure) 1686836K->850230K(1992320K), 0.0521587 secs]
[GC (Allocation Failure) 1689142K->858658K(1992320K), 0.0496138 secs]
[GC (Allocation Failure) 1697570K->858148K(1992320K), 0.0439780 secs]
[GC (Allocation Failure) 1697059K->865706K(1992320K), 0.0517013 secs]
[GC (CMS Initial Mark) 865828K(1992320K), 0.0184015 secs]
[GC (CMS Final Remark) 1198017K(1992320K), 0.1831652 secs]
[GC (Allocation Failure) 1132594K->301826K(1992320K), 0.0444428 secs]
[GC (Allocation Failure) 1140738K->305794K(1992320K), 0.0428419 secs]
[GC (Allocation Failure) 1144679K->312688K(1992320K), 0.0545760 secs]
[GC (Allocation Failure) 1151600K->320109K(1992320K), 0.0410423 secs]
[GC (Allocation Failure) 1159021K->320191K(1992320K), 0.0411587 secs]
[GC (Allocation Failure) 1159103K->330729K(1992320K), 0.0387938 secs]
[GC (Allocation Failure) 1169641K->331256K(1992320K), 0.0393934 secs]
[GC (Allocation Failure) 1170163K->343068K(1992320K), 0.0419092 secs]
(16核)而下边是-XX:ParallelGCThreads=16 -XX:ConcGCThreads=8
[GC (Allocation Failure) 1551548K->713703K(1992320K), 0.0400264 secs]
[GC (Allocation Failure) 1552615K->716536K(1992320K), 0.0463409 secs]
[GC (Allocation Failure) 1555448K->723921K(1992320K), 0.0313725 secs]
[GC (Allocation Failure) 1562833K->728720K(1992320K), 0.0333375 secs]
[GC (Allocation Failure) 1567629K->734094K(1992320K), 0.0352418 secs]
[GC (Allocation Failure) 1573006K->739880K(1992320K), 0.0368524 secs]
[GC (Allocation Failure) 1578792K->741607K(1992320K), 0.0418331 secs]
[GC (Allocation Failure) 1580519K->749161K(1992320K), 0.0379511 secs]
[GC (Allocation Failure) 1588073K->755358K(1992320K), 0.0347147 secs]
[GC (Allocation Failure) 1594270K->761399K(1992320K), 0.0379215 secs]
[GC (Allocation Failure) 1600311K->765948K(1992320K), 0.0348537 secs]
[GC (Allocation Failure) 1604858K->774675K(1992320K), 0.0371332 secs]
[GC (CMS Initial Mark) 774724K(1992320K), 0.0120999 secs]
[GC (CMS Final Remark) 1067302K(1992320K), 0.1657415 secs]
[GC (Allocation Failure) 1130442K->286546K(1992320K), 0.0299338 secs]
[GC (Allocation Failure) 1125458K->298132K(1992320K), 0.0328611 secs]
[GC (Allocation Failure) 1137044K->304370K(1992320K), 0.0357785 secs]
(8核)而如果换成UseParallelGC,young gc不错,而full gc偏慢,线上如果没有配置CMS的话,默认是用这个
[GC (Allocation Failure) 1993894K->1000058K(2072576K), 0.0396914 secs]
[GC (Allocation Failure) 1999482K->1007021K(2072576K), 0.0403703 secs]
[GC (Allocation Failure) 2006445K->1011597K(2068480K), 0.0432666 secs]
[GC (Allocation Failure) 2006925K->1016275K(2070528K), 0.0450037 secs]
[GC (Allocation Failure) 2011603K->1020929K(2070528K), 0.0490808 secs]
[GC (Allocation Failure) 2016257K->1025389K(2070528K), 0.0395652 secs]
[GC (Allocation Failure) 2020717K->1029915K(2070528K), 0.0415800 secs]
[GC (Allocation Failure) 2025243K->1035623K(2070528K), 0.0534249 secs]
[GC (Allocation Failure) 2030951K->1041520K(2072576K), 0.0473277 secs]
[GC (Allocation Failure) 2040944K->1046783K(2072576K), 0.0447377 secs]
[GC (Allocation Failure) 2046207K->1052829K(2068480K), 0.0466185 secs]
[GC (Allocation Failure) 2048157K->1057749K(2070528K), 0.0435571 secs]
[GC (Allocation Failure) 2053077K->1063253K(2070528K), 0.0434343 secs]
[GC (Allocation Failure) 2058581K->1067759K(2070528K), 0.0402552 secs]
[Full GC (Ergonomics) 1067759K->235608K(2070528K), 0.4808497 secs]
[GC (Allocation Failure) 1230936K->247560K(2070528K), 0.0318850 secs]
[GC (Allocation Failure) 1242888K->254827K(2070528K), 0.0340009 secs]
[GC (Allocation Failure) 1250155K->259247K(2066432K), 0.0337921 secs]
[GC (Allocation Failure) 1250479K->264965K(2068480K), 0.0585058 secs]
虽然GC不如物理机,但是可以满足我们的需要了。
注:
1、因为容器不是物理隔离的,比如使用Runtime.getRuntime().availableProcessors() ,会拿到物理CPU个数,而不是容器申请时的个数,
2、CMS在算GC线程时默认是根据物理CPU算的:(http://mail.openjdk.java.net/pipermail/hotspot-gc-dev/2013-November/008952.html )
年轻代的并行线程数(ParallelGCThreads):
return (ncpus <= 8) ? ncpus : MAX2(8, ncpus / 2)
CMS并行线程数(ConcGCThreads):
if (AdjustGCThreadsToCores) { FLAG_SET_DEFAULT(ConcGCThreads, ParallelGCThreads / 2); } else { FLAG_SET_DEFAULT(ConcGCThreads, (3 + ParallelGCThreads) / 4); }
因为我们升级到了JDK8/Tomcat8, 遇到以下问题:
1、Tomcat8使用Nio2时有时候会遇到如下警告,暂时没有升级上去
org.apache.tomcat.util.net.AbstractEndpoint countDownConnection
WARNING: Incorrect connection count, multiple socket.close called on the same socket.
2、使用G1垃圾回收时,在我们的小堆上没有多大优势,暂时没有使用。
我们线上某服务的JVM参数
export JAVA_OPTS="-Djava.library.path=/usr/local/lib -server -XX:ReservedCodeCacheSize=64m -XX:TLABWasteTargetPercent=10 -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:+ParallelRefProcEnabled -XX:+CMSClassUnloadingEnabled -XX:CMSInitiatingOccupancyFraction=70 -XX:+UseCMSInitiatingOccupancyOnly -XX:+UnlockDiagnosticVMOptions -XX:ParallelGCThreads=8 -XX:ConcGCThreads=4 -Xss256k -server -Xms2g -Xmx2g -XX:MaxDirectMemorySize=256m -XX:MaxTenuringThreshold=3 -XX:NewRatio=1 -XX:SurvivorRatio=8 -XX:+UnlockDiagnosticVMOptions -XX:ParGCCardsPerStrideChunk=32768 -XX:+AlwaysPreTouch
相关推荐
从实践者的角度出发,以Docker和Kubernetes为重点,沿着“基本用法介绍”到“核心原理解读”到“高级实践技巧”的思路,一本书讲透当前主流的容器和容器云技术,有助于读者在实际场景中利用Docker容器和容器云解决...
要配置容器 IP 桥接网络,需要使用 Docker 的网络配置命令。首先,需要创建一个桥接网络: `docker network create -d bridge mybridge` 然后,需要将容器连接到桥接网络: `docker run -it --name mycontainer -...
Docker 容器入门与实践期末考试总复习 在本节总结中,我们将详细介绍 Docker 容器技术的基本概念、优点、架构、Namespace 和 Cgroup 等关键技术点,并总结 Docker 容器技术在实际应用中的价值。 容器技术解决了...
kubectl exec进入到docker容器中进行查看时发现,文件在容器中也是中文文件名显示异常。查看docker容器编码格式:执行locale命令;可以看到当前编码格式为POSIX,而这种编码格式不支持中文 解决办法:locale -a查
本书从实践者的角度,在讲解Docker高级实践技巧的同时,深入到源代码层次,为读者梳理出Docker容器技术和基于Docker的容器云技术(如Kubernetes)的实现方法和设计思路,帮助读者理解如何在实际场景中利用Docker解决...
Docker容器无法停止或杀死的问题通常发生在使用Docker管理容器时。容器一旦创建,应当可以随时被停止或删除,但某些情况下可能会出现异常行为,导致容器无法通过正常的docker stop或docker kill命令来停止。这种问题...
这个压缩包可能包含了Prometheus 2.35.0版本的安装包、配置示例、Docker容器监控的文档以及如何在Linux环境下部署和使用Prometheus的详细步骤。通过学习这些资料,你可以深入了解如何在Docker环境中有效利用...
《基于docker容器的高并发web系统架构设计与实现》随着互联网迅速发展,社交、媒体以及电商等web网站用户数量 越来越大,并发流量也越来越高,这对于传统web系统架构设计提出 新的挑战。本文基于...
因此,在 Docker 容器中部署应用程序时,需要特别注意 locale 设置,确保其正确设置,以避免各种问题。 总结 解决 Docker 容器中 Tomcat 部署出现中文乱码的问题需要设置容器的 locale 为 en_US.UTF-8。在 ...
本文主要简单介绍 docker 容器与前置进程的关系,以及如何编写 Dockerfile/docker-compose.yml 优雅的让容器可以常驻运行。 docker 容器的生命周期是同容器中的前置进程相关在一起的,这也是我们平时可能会遇到一些...
docker内部培训的PPT,简介了docker容器技术的强大。为什么要使用docker容器技术。
docker容器与容器云的文档,有助于理解docker的知识。
最近在工作时遇到一个问题,docker容器无法访问宿主机的redis,telent6379端口不通。 经排查发现,该服务器启用了防火墙,防火墙把6379的端口的访问授权给docker0网卡访问即可。 操作如下: firewall-cmd –...
Docker 容器与容器云(第2版) PDF版本,带电子目录,结构清晰
然而,传统的 Docker 容器镜像更新方法存在一些缺陷,如更新过程中需要占用大量的网络带宽和服务器资源,可能会影响容器的运行。 知识点2: Docker 容器镜像离线增量更新的原理 Docker 容器镜像离线增量更新的原理...
2. 资源限制:Docker 容器的资源使用受到宿主操作系统的限制。 Docker 容器技术是一种轻量级的虚拟化技术,它可以提供快速、灵活和可靠的应用程序部署解决方案。 知识点: 1. 虚拟化技术分类:系统虚拟化和进程...
5. 配置文件修改后的操作:在修改完配置文件后,通常需要根据配置文件的性质,重启服务或者整个容器来使更改生效。在Docker中,这可以通过执行docker restart命令来完成。 以上这些知识点详细说明了如何通过Docker...
docker容器中支持的中文字体
在运行容器时,需要指定镜像名称、端口号和配置文件路径。 通过这篇文章,可以了解到如何使用普通用户运行 Docker 容器,并使用 Nginx 作为示例,了解到 Docker 的安装、镜像的准备和容器的运行过程。 知识点: 1...