cat*_*nts 7 kvm centos java openvz
这是一个非常笼统的问题,但对我来说它越来越频繁地出现。我想尝试为这个通用案例确定一个适当的行动方案,因为我认为它可以在未来使我和其他系统管理员受益。尽管在所有情况下的共同点是 java。我在这里问这个问题而不是堆栈溢出的原因是这是一个系统管理员问题。我觉得这里很合适。
一个用户走到我面前说“我的应用程序很慢。你给我的服务器性能很差。” 该服务器可以是裸机、OpenVZ 或 KVM。在所有情况下,操作系统都是 CentOS 6。当用户告诉我这一点时,他们指的是页面加载时间 (JIRA) 或基准数字。(硒或专有应用程序)
现在,我偷偷怀疑服务器本身没问题。我ssh
到服务器上,注意到负载小于 1。内存使用也很好,范围从 2 到 20 演出免费 ram 不等。最后,我查看iowait
了vmstat
,注意到它是 0。cpu idle 是 99。
查看带有 的 Java top
,我可以看到该进程的 CPU 百分比约为 200% 左右。这是在具有 4 到 24 个内核的系统上。
当然,openvz
处理器分配是否与 KVM 或裸机不同。)如果这发生在一个openvz
或kvm
来宾上,我也会跳到主机上,并看到类似的事情。cpu空闲是99%。iowait 为 0。内存有时有数百个免费演出。
我用strace
, 和strace -f
. 有大量的 futex、时钟和epoll
. 如果我反转 grep 那些,我只剩下 ioctl、stat、sendto。
发生这种情况的应用程序:Selenium、JIRA 和 misc 专有的 Java 应用程序。虽然总是java。
我已经考虑过调整 java 进程的 niceness,但是 AFAIK niceness 只会影响进程的调度方式。如果负载较低,则无助于加快速度。
有时应用程序使用 mysql,但在顶部查看 mysql 显示那里几乎没有 cpu 使用率。我猜如果那是瓶颈,我们会看到更高的 CPU 使用率。
底线:我如何向用户证明服务器运行良好,但他们的应用程序很糟糕?理论上,应用程序可能会很慢,因为它遇到了永远不会退出的 while 循环。这让我相信这个任务是不可能的,类似于解决停机问题。o_O 但也许我可以调整 java 以使其表现得更好,或者也许有一种方法可以分析正在运行的应用程序,指向一段代码并说“这是你的问题”。
一旦排除了不可能,剩下的,无论多么不可能,都一定是事实。——亚瑟·柯南·道尔
首先,您可能想看看这个演讲,这是关于性能问题的来源以及如何诊断它们的讨论。它将 Linux 与 SmartOS 进行了比较,后者与您的帖子的观点有所不同,但它也有助于阐明性能问题的来源。
通常当你用软件调试性能问题时,你应该尝试在单独的物理机器上复制完全相同的软件配置,使用相同的 Java 版本、相同的内核、相同的用户空间等。 如果性能问题不存在,然后您可以开始查看您的机器上的物理硬件、管理程序/容器层或安装问题。
如果用户以前从未在此特定操作系统/版本配置中运行过此软件,则他们不能立即声称这是您的服务器。我宁愿把举证责任在他们证明,运行CentOS 6的(具有相同的次要版本和相同的管理程序和相同的主机操作系统,如果它不是在裸机上运行),他们能够获得更好的性能。
如果性能更好是因为它们具有更优越的系统规格(例如,它们在基础架构上的低端处理器上的 1 GB KVM 上运行它,但在他们自己的 24 核 Ivy Bridge E5 系统上运行它,其中 8 个 PCIe SSD硬件 RAID0,它快了 1000%),那么你就可以开始谈论物理硬件了。如果物理硬件相同或非常相似,您可以开始谈论操作系统/管理程序配置。
您还可以考虑这样一种可能性,根据应用程序的性能以及用户数量和数据工作量,为用户分配的硬件根本不足以完成任务。如果这是一个非常重要的客户并且让他们满意对您的业务至关重要,您可以尝试取消一些您可能对他们的虚拟容器或 VM 实例施加的限制;例如,暂时给他们更多的 RAM 或 CPU 时间、网络带宽等,看看是否有帮助。如果是这样,您可能必须告诉用户他们需要为更大的 VM 付费才能在该工作负载上获得他们想要的性能。
如果出于某种原因,用户完全拒绝在不同的硬件上尝试相同的软件配置,您将不得不求助于帮助他们解决应用程序中的性能问题(这在 Linux 上可能很难甚至不可能,正如 Brendan Gregg 所描述的那样)在他的演讲中;有时您可能只需要“佩戴”那个性能成本),或者只是坚持认为用户是不正确的。这是在您的系统上支持开发人员的不幸副作用。
在这一点上,您可能需要问问自己您与用户的业务关系(如果有的话)。如果您在私营部门提供非托管托管,您可能必须坚持认为您不负责确保用户代码的性能。
如果您提供托管主机,或者同意帮助软件人员解决他们的困境,无论问题是否是他们的错,您可能不得不卷起袖子,亲自动手,并开始运行一些更复杂的性能分析工具,看看你是否能发现实际问题。它只是在网络套接字上阻塞的一个非常健谈的协议吗?它是否受内存 I/O 限制?或者 BIOS 没有启用 VT-x?有太多的可能性甚至无法列出。
总结本节:如果你能找到一些商业或政治理由来借口自己不负责解决这个问题,这可能是最简单、最有效的出路。不幸的是,这也意味着用户可能永远无法解决他们的问题,并且可能会求助于其他业务合作伙伴作为替代方案。
由于共同主题“似乎”是 Java,因此您至少可以首先确定 Java 进程本身是否正在运行一些非常慢的代码。为此,理想情况下,开发人员/用户/客户将能够向您提供他们的 Java 程序(以及所有相关库)的源代码。
尝试在良好的分析器下运行该程序。有免费和非免费的分析器;免费的一个例子是NetBeans附带的。让分析器成功启动和检测您的应用程序可能是一个挑战,具体取决于该应用程序是什么,但结果几乎总是以某种方式说明问题。
当然,您可以使用htop
和/或iotop
检测 Java VM(或相关联的 RDBMS)是否正在执行过多的 CPU、内存 I/O 或磁盘 I/O,超出您考虑的数量”合理”(考虑到硬件和工作量)。这些是非常广泛的工具,并不总能给你全貌,因为有时性能问题与程序在等待其他事情时没有做的事情有关,这可能与资源瓶颈无关。这与尝试启动汽车以确定发动机是否正常运行一样通用的故障排除步骤。如果它没有开始,那么你会怎么做?那'
最后,我将回应 Brendan Gregg 在他的演讲中所说的,并提到 DTrace。DTrace 的全部功能尚未在 Linux 上复制,无论是 dtrace-on-linux 重新实现,还是任何竞争对手,如 SystemTap。也就是说,您可以尝试使用这些工具之一,看看它是否有帮助。有些洞察力总比没有好。
当然,您将需要使用这些非常“瑞士军刀”式工具的特定专业知识。您将通过大量经验获得大部分专业知识(阅读:反复试验和谷歌搜索)。这不仅仅是启动工具并让它指向您的问题;您需要根据可用数据解决问题。这是不容易的。性能很少。
归档时间: |
|
查看次数: |
2370 次 |
最近记录: |