day666,java开发常见问题及解决方法
本内容由系统网小编为大家分享,Windows系统安装教程、办公系统、软件怎么使用、软件使用教程、办公软件攻略等信息。
将Java程序从虚拟机转移到k8s的问题
Hello,这里是阿昌今天的学习成绩是将Java程序从虚拟机转移到k8s的问题的记录。
使用Kubernetes大规模部署应用可以改善资源的整体利用,提高集群稳定性,提供快速集群扩展能力,甚至实现基于压力的集群自动化。
因此,越来越多的公司正在将程序从虚拟机(VM)转移到库伯内特。 在大多数公司,库伯内特集群是由操作员构建的,而程序的发布通常由CI/CD平台完成。
从虚拟机到库伯内特的整个迁移过程,基本上不需要修改任何代码,也许只是重新发行。所以,我们Java开发者可能对迁移本身并不强烈,Kubernetes被认为只是需要知道操作的东西。
然而,一旦在容器环境中运行的程序被部署到库伯内特集群上,在各种事情之前总是存在着奇怪的问题。
iPod IP 的故障修复
Pod是一个可以在Kubernet中创建和部署的应用程序最小单元我们可以通过Pod IP访问应用程序实例,但应该指出如果没有特殊的配置,Pod IP它没有被修复,并且在重新启动Pod时会发生变化。
然而,我们的Java微服务通常是无状态的,我们不需要通过Pod IP访问特定Java服务实例。
通常,有两种方法访问 Kubernetes 部署的微服务集群:
它通过Kubernet实现,换句话说,通过服务实现内部服务的互操作性,通过Ingress实现外部访问服务集群。 它通过一个微服务登记中心(例如尤里卡)实现。即,服务之间的互操作性通过客户负载平衡+直接访问Pod IP,外部访问服务集群通过微服务网络交换机传输.利用这两个方法来访问微型服务,我们与PadIP没有直接联系,你无法维持Pod IP记录,因此,你不必太担心Pod IP的变化。不过,在一些场景下,Pod IP的更改会引起一些问题。我曾经遇到过这样的情况:一个任务调度器中间人将IP记录到预定节点的数据库中,然后通过访问节点IP查看任务节点执行日志,如果节点部署在Kubernet上,然后在节点重新启动后,Pod IP将发生变化。
因此,以前在数据库中记录的旧节点的Pod IP不可避免地无法使用,无法查看任务日志。
在这种情况下,我们应该怎么办?
在这一点上,可能需要修改中间件,使任务执行日志也持久,从而避免访问任务节点查看日志的行为。
简言之,我们需要意识到Pad IP的解除问题和执行一个坑洞操作:在移动到Kubernet集群之前,我们应该查明是否有需要通过IP访问旧节点的案例,如果需要的话,需要修改。
二、OOM的问题
在库伯内特群中部署程序时,我们通常为容器设置一定的内存限度,容器不能使用超出其资源限制属性设置的资源量。如果容器中的Java程序使用大量的内存,可能有多种室环境。
第一种情况,」 《鬼魂殺死》。如果内存过剩导致操作系统内核不稳定,操作系统可能杀死Java进程.这时候,你可以在操作系统日志/var/log/messages中找到与oom_kill_process相似的关键字。 第二个问题是我们最经常遇到的Java程序的OOM问题。 该程序超过堆栈内存应用程序内存的限度,导致Heap OOM,如果KubernetsPod不重新启动健康检查,这可能导致Heap OOM。在库伯内特部署Java程序时,这两个情况很常见。症状还包括OOM关键字+重启。所以,操作学生说由于OOM,该程序被杀害或重新启动时,我们必须与操作学生进行明确的区别.到底是哪一种情况,然后再对症处理。
对于情况 1,问题的原因往往是没有足够的Java堆栈内存,更有可能这个程序使用太多的存量,超过了内存限制。这个时候,减少JVM的最大缓存只会使问题更糟,因为堆栈内存可以通过GC来恢复.我们需要分析Java进程中哪些部分是过度负载的,是不是合理,以及是否存在可能的记忆泄漏问题。Java进程除了堆栈之外,还使用内存,还包括
直接内存 元数据区 线性堆栈大小 Xss * 线程数 JIT 代码缓存 GC编译器使用额外空间 ……我们可以使用NMT打印区域的每个部分的大小来确定该区域的哪个部分占有太多的内存或可能有内存泄漏问题:
如你确认房间符合2号条件,因此,我也不建议直接调制大型堆栈的存储限制,防止复发 1.我建议你将堆积物的储存限制在容器储存的50%到70%。保存了外部堆栈和操作系统核心的足够内存。如果你需要扩展堆栈内存,同时需要同步扩展容器的内存限制.
此外, 还 需要 通过 诸如 堆积物 垃圾 等 措施 调查 堆积物 的 储存 为何 如此 庞大, 消除 潜在 储存 泄漏 的 可能性 。
存储和CPU资源配置不适当的容器坑
刚刚我们提到了,堆栈内存扩展需要与容器内存限度同步.其实,我们更希望的是,根据容器的资源配置,可以配置Java程序的堆栈内存配置,实现自动扩张或缩小,而不是写死的Xmx和Xms。这样一来,操作学生可以更方便地扩大或减少整个小组。
对于 ·JDK>8u191· 的版本,我们可以设置下面这些 JVM 参数,来让 JVM 自动根据容器内存限制来设置堆内存用量。
例如,以下配置相当于将Xmx和Xms设置到容器内存限度的50%:
接下来,我们研究了不适合容器的CPU资源配置的漏洞,以及相应的解决方案。
为了使用CPU资源,重要的是注意代码中的组件,甚至JVM本身,都根据CPU的数目和其它重要参数,例如同时的数目配置,因此:
如果由于JVM与容器兼容问题而把这个值带到库伯内特斯的工作节点的CPU数目,那么这个数目可能不是4或8,而是128或以上,导致过多的并行。 对于 JDK>8u191 的版本可能会对容器兼容性较好,但是它得到的运行时间是"Get Runtime".availableProcessors()实际上是请求的值而不是限度值(例如我们设置请求为2,限度为8,CICompilerCount和ParallelGCThreads只能为2),那么,复发的数目可能太少,这会影响JVM的GC或编译器性能。所以,我的建议是: 第一,通过-XX:+PrintFlagsFinal开关,为了验证ActiveProcessorCount是否符合我们的期望,它还证实了重要的参数配置的合理性,如CICompilerCount、ParallelGCThreads等。 第二,直接设置CPU的请求和限制以匹配,或是对于 JDK>8u191 的版本可以通过 -XX:ActiveProcessorCount=xxx 直接把 ActiveProcessorCount 设置为容器的 CPU limit。重新启动iPod和重新启动后没有站点的坑
除非宿主机有问题,否则,虚拟机不太可能自行重新启动或重新启动,库伯内特斯的Pod的重新激活并不是一个小概率事件。如果记忆检测失败, iPod 会重新启动, 等等.波德将重新启动。为波德重启,我们需要集中注意两个问题。
分析Pod为什么会重新启动.
除了 OOM 问题 在 “ 由于 OOM 而 程序 被 杀死 的 过程 中 的 漏洞 ” 中 所 提到 的 问题 之外, 我们 还 需要 集中 注意 实时 检查 的 失败 。readinessProbe和livenessProbe两台探测器,第一台用来检查申请是否已经启动和完成,第二台用来继续探测。
一般而言,学生将安排这两个探测器作为健康检测的突破点.如健康检查需要较长的时间(例如储存或外部服务可用性测试),那么可能可以检查预备测试,但不能检查活度测试(我们通常为预备测试设置了较长的加班时间,生命探测器不那么宽容.
此外,健康测试也可能因干预全学考试而过时进行.所以,我们需要与操作班友合作,确定LivenessProbe配置地址和加班设置是否合理。防止意外活化由于未激活而导致波德的样品重新激活.
了解Pod不同于虚拟机器.
虚拟机通常处于状态,即使Java程序在虚拟机中部署并重新启动,我们也可以随时在现场。
因此,如果OOM问题导致重新启动,我们不太可能想回顾当时的操作系统的一些日志或在现场执行一些命令来分析问题。 因此,我们需要考虑如何在关闭Pod之前保持网站尽可能接近,例如:
程序的应用程序日志、标准输出、GC日志等可以直接上传到持续的容量,而不是存储在容器内。
可配置为该程序保留的堆栈站点-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath在堆栈OOM时生成垃圾;还允许JVM调用任何壳式脚本存储信息,如线程堆栈通过脚本:
对于容器的网站预定,操作员可以配置预停钩,在Pod关闭之前将必要的信息上传到持续滚动或云上。
五、总结
第一个问题是我们需要理解应用POD IP将动态变化因此,在设计中应该消除对Pad IP的强烈依赖性,以及用于定位应用程序的依赖性服务发现。 第二个问题是什么时候OOM 问题的时候,第一个区分OOM的原因来自Java过程级或容器级。如果在容器一级,我们还需要进一步分析哪些记忆区域占有太多的记忆,找到问题后, 设置合理的JVM参数或根据容器资源扩展资源. 第三种问题是必须确保程序被使用存储器和CPU资源匹配容器的资源限制确保程序“看到”的主机资源信息是容器本身,而不是物理机器,并确保程序能够尽可能地扩大容器的资源限制。 第四类问题是我们需要集中注意非发布程序的重新启动,并且在重新启动Pod上做得很好现场保留避免因经常重新启动程序而导致的意外性能问题或可用性问题。只有解决这些危险,库伯内特群组才能发挥更好的作用。
XTw.com.Cn系统网专业应用软件下载教程,免费windows10系统,win11,办公软件,OA办公系统,OA软件,办公自动化软件,开源系统,移动办公软件等信息,解决一体化的办公方案。
免责声明:本文中引用的各种信息及资料(包括但不限于文字、数据、图表及超链接等)均来源于该信息及资料的相关主体(包括但不限于公司、媒体、协会等机构)的官方网站或公开发表的信息。内容仅供参考使用,不准确地方联系删除处理!
联系邮箱:773537036@qq.com