系统相关
首页 > 系统相关> > centos – 性能不佳的Java应用程序与性能不佳的服务器

centos – 性能不佳的Java应用程序与性能不佳的服务器

作者:互联网

这是一个非常通用的问题,但它对我来说越来越频繁.我想尝试确定这个通用案例的适当行动方案,因为我认为它可能使我和其他系统管理员在将来受益.所有情况下的共性都是java.我在这里问这个问题而不是堆栈溢出的原因是这是一个系统管理员问题.我觉得这里非常合适.

一位用户来找我说“我的应用程序非常慢.你给我的服务器性能很差.”该服务器可以是裸机,OpenVZ或KVM.在所有情况下,操作系统都是CentOS 6.当用户告诉我这一点时,他们指的是页面加载时间(JIRA)或基准数字. (Selenium或专有应用程序)

现在,我怀疑服务器本身是好的.我ssh到服务器上,并注意到负载小于1.内存使用情况也很好,范围从2-20 gig ram free.最后,我用vmstat检查iowait,注意它是0.cpu idle是99.

用top来看Java,我可以看到该进程的CPU百分比约为200%左右.这适用于4到24个核心的系统.

当然,openvz的处理器分配不同于KVM或裸机.)如果这种情况发生在openvz orkvm guest上,我也会跳到主机上,看到类似的东西. cpu idle是99%. iowait是0.内存有时是数百个演出免费.

我用strace和strace -f查看了这些java进程和线程.有大量的futex,clock和epoll.如果我反对grep那些,我剩下的主要是ioctl,stat,sendto.

发生这种情况的应用程序:Selenium,JIRA和misc专有的Java应用程序.总是java虽然.

我已经考虑过调整java进程的优点,但AFAIK的优点只会影响进程的调度方式.如果负载很低,它将无助于加快速度.

有时应用程序使用mysql,但在顶部查看mysql几乎没有cpu使用.我猜测如果这是瓶颈,我们会看到更高的CPU使用率.

底线:
如何向用户证明服务器工作正常,但他们的应用程序很糟糕?从理论上讲,应用程序可能会很慢,因为它遇到了永远不会退出的while循环.这使我相信这项任务是不可能的,类似于解决停止问题. o_O但也许我可以调整java以表现得更好,或者可能有一种方法来分析正在运行的应用程序,指向一大块代码并说“有你的问题”.

解决方法:

福尔摩斯!

Once you eliminate the impossible, whatever remains, no matter how improbable, must be the truth. –Arthur Conan Doyle

首先,您可能需要查看this谈话,这是关于性能问题的来源以及如何诊断它们的讨论.它将Linux与SmartOS进行了比较,它与您的帖子有所不同,但它也有助于阐明性能问题的来源.

通常,当您使用软件调试性能问题时,您应该尝试在单独的物理计算机上复制完全相同的软件配置,使用相同版本的Java,相同的内核,相同的用户空间等.如果性能问题不存在,然后您可以开始查看盒子上的物理硬件,管理程序/容器层或安装问题.

如果用户之前从未在此特定操作系统/版本配置中运行此软件,则他们无法立即声称它是您的服务器.我宁愿把证明的责任放在他们身上,以证明运行CentOS 6(具有相同的次要版本和相同的虚拟机管理程序以及相同的主机操作系统,如果它不是在裸机上运行),它们能够获得更好的性能.

如果更好的性能是由于他们拥有更优越的系统规格(例如,他们在基础设施上的低端处理器上的1 GB KVM上运行它,而是在他们自己的24核Ivy Bridge E5系统上运行8个PCIe SSD硬件RAID0,它快1000%),然后你可以开始谈论物理硬件.如果物理硬件相同或非常相似,您可以开始讨论OS /虚拟机管理程序配置.

您还可以考虑,基于应用程序的性能以及用户数量和数据工作负载,用户分配的硬件对于任务来说是不够的.如果这是一个非常重要的客户并让他们满意对您的业务至关重要,那么您可以尝试取消可能对其虚拟容器或VM实例施加的一些限制;例如,暂时给他们更多的RAM或CPU时间,网络带宽等,看看是否有帮助.如果是这样,您可能必须告诉用户他们需要为更大的VM付费才能获得他们在该工作负载上所需的性能.

逃避烧伤(当它不是你的问题时)

如果出于某种原因,用户违规将拒绝在单独的硬件上尝试相同的软件配置,那么您将不得不求助于他们在应用程序中解决他们的性能问题(这在Linux上很难实现,正如Brendan Gregg所描述的那样在他的谈话中;有时你可能只需要“磨损”性能成本),或者只是坚持用户是不正确的.这是支持开发人员在您的系统上的一个不幸的副作用.

此时,您可能需要问问自己与用户的业务关系(如果有).如果您在私营部门提供非托管主机,您可能必须坚持认为您不负责确保用户代码的性能.

如果您提供托管主机,或者已经同意帮助软件人员解决问题,无论问题是他们的错,您可能不得不卷起袖子,弄脏手,并开始运行更复杂的性能分析工具,看看你是否能发现实际问题.它只是一个非常繁琐的协议阻塞网络套接字?它是内存I / O绑定的吗?或者BIOS可能没有启用VT-x?甚至列出的方式太多了.

总结一下这一部分:如果你能找到一些商业或政治理由来原谅自己不负责解决这个问题,那么这可能是最简单,最有效的方法.不幸的是,这也意味着用户可能永远无法解决他们的问题,并且可以选择寻找其他业务合作伙伴作为替​​代方案.

扇动火焰(当你的问题出现时)

由于共同主题“看起来”是Java,因此您可以从至少确定Java进程本身是否正在运行某些非常慢的代码开始.为此,理想情况下,开发人员/用户/客户将能够为您提供其Java程序(以及所有依赖库)的源代码.

尝试在良好的profiler下运行该程序.有免费和非免费的分析器;一个免费的例子是NetBeans附带的一个例子.让探查器成功启动并检测你的应用程序可能是一个挑战,具体取决于该应用程序是什么,但结果几乎总是以某种方式告诉.

您当然可以使用htop和/或iotop来检测Java VM(或关联的RDBMS)是否正在执行过多的CPU,内存I / O或磁盘I / O,超出了您的数量考虑“合理”(考虑到硬件和工作量).这些都是极其广泛的工具,并不总能为您提供全面的图片,因为有时性能问题是关于程序在等待其他东西时没有做的事情,这可能与资源瓶颈无关.这与试图启动汽车以确定发动机是否正常运行的故障排除步骤相同.如果它没有启动,那么,你做了什么?这就是为什么一个合适的Java分析器可以派上用场,如果你真的需要深入研究.

最后,我将回应Brendan Gregg在他的演讲中所说的内容,并提及DTrace. DTrace的全部功能尚未在Linux上进行复制,既不是通过dtrace-on-linux重新实现,也不是像SystemTap那样的任何竞争对手.也就是说,您可以尝试使用其中一种工具,看看它是否有帮助.一些见解可能比没有好.

当然,您将需要使用这些非常“瑞士军刀”式工具的专业知识.您将通过大量经验获得大部分专业知识(阅读:试错,谷歌搜索).这不仅仅是启动工具并让它指向您的问题;你需要根据可用的数据来解决问题.这是不容易的.表现很少.

标签:java,centos,kvm,openvz
来源: https://codeday.me/bug/20190809/1634413.html