2014-10-01 91 views
12

我正在处理一个系统,该系统在其自己的JVM中为每个客户运行一个Java应用程序。我们现在有大约六台专用服务器,它们现在总共运行近100个JVM,并且有一组用于管理这些JVM的自定义脚本。这种设置在这一点上真正展现了它的时代:管理许多JVM正在成为监控/管理的噩梦,并且我们一直在处理堆大小问题。我们希望采用更现代化的方法,并在每台物理机器的一台应用程序服务器上运行大量应用程序。但是,保持应用程序的独立性在隔离方面具有明显的优势(例如,内存不足错误只会影响一个客户)。每个客户的软件堆栈的内存要求差异很大。多个JVM与单个应用程序服务器

我的问题:有没有办法让这里两全其美,并在一个JVM(应用程序服务器)中运行多个应用程序,并仍保持某种级别的隔离?或者这仅仅是现代生活中的事实,你现在需要管理一组应用程序的内存需求?除了应用服务器或Java EE容器(例如Wildfly或Spring),我还有其他解决方案吗?看起来这个系统是另一个时代的坚持!

+1

现代方法越来越多地使用虚拟化主机上的每个应用程序JVM。对于您需要的规模,我强烈建议您查看Cloud Foundry以抽象出您正在讨论的大部分管理。 – chrylis 2014-10-02 02:00:59

+0

与chrylis的评论类似,现代方法不使用应用程序服务器。多租户也是死的,因为为什么有这样的麻烦,当你可以使用像Docker这样的虚拟机或容器来给你真正的分离? – SteveD 2014-10-02 08:23:06

+0

我认为你关注的是一个错误的问题:为什么你经常遇到堆大小问题?你的应用程序是否泄漏内存?你有无限的内存消耗吗?您的应用程序是否不适用于给定工作负载的稳定内存使用? – SteveD 2014-10-02 16:26:11

回答

6

签出'多租户'JVM's。

IBM的JRE有它已经:http://www.ibm.com/developerworks/library/j-multitenant-java/

Waratek已经实现了它在Oracle JRE的顶部,他们创造ElastiCat,一个Tomcat叉来隔离在同一容器中不同的应用:http://www.elasticat.com/faq/

多传闻租赁也会出现在官方的Oracle Java 9 JVM中。

============================================== =========

更新:Java 9已经出来,但没有提及Oracle有关多租户的消息。 看来他们更喜欢现在有多个JVM,甚至多个容器(例如docker)。

4

有正反两种方法的缺点:

共享JVM

  • 较低的开销 - JVM内存占用(核心库等),只需要加载一次。
  • 更好的内存使用情况。 Java进程将占用目前可能未使用的堆空间的操作系统内存。

独立JVM

  • 从 '贪婪的' 或 '泄漏' 的应用程序绝缘。
  • 更好的安全性从恶意代码。
  • 更新更简单,更新一个应用程序而不打倒其他应用程序。

总体而言,我不会设置一揽子政策。寻找小型/微型服务或其他低使用率的应用程序,这些应用程序可能是首先分享并扩展的优秀候选人。

+0

谢谢Mikaveli。我很清楚这里的权衡。我正在处理的是〜100个相同应用程序的实例,每个实例都在其自己的JVM中运行(每个客户一个实例)。这给了我们很大的灵活性(可以根据客户运行不同版本的应用程序)和隔离(应用程序崩溃不影响其他客户)。然而,这只是感觉老旧笨拙,难以管理/监控,而且越来越难以扩展。必须有更现代的方式来处理这些应用程序部署... – Noky 2014-10-01 16:24:55

+0

我建议将任何适当的东西移动到现代应用程序服务器(JBoss或Glassfish),这取决于它们主要是Web应用程序还是它们会需要一些返工。应用程序服务器承担了很多管理和监视的痛苦,所以它可能值得转换的痛苦。 – Mikaveli 2014-10-01 16:28:17

+0

Glassfish已经死了 - 我不会推荐任何人转移到它。 – SteveD 2014-10-02 17:04:43

1

有一个现代版的管理的方式

+1

这些都用于创建单独的虚拟机。您解决了监视/管理问题,但仍需手动执行内存管理。 – greyfairer 2014-10-02 14:52:02

+0

我怀疑核心问题不在于应用程序及其内存的管理,但为什么应用程序如此不稳定以至于需要不断调整内存? – SteveD 2014-10-02 16:28:06

+0

好点SteveD。问题不在于应用程序不稳定。这不是一个web应用程序,而是一个相当大的应用程序,其中包含许多不同的自定义选项和插件,它们根据客户的需求和大小而有所不同。所以,没有一款适用于应用程序的“一刀切”分配内存的方式。虽然该应用程序通常非常稳定,但有时存在问题是生活中的事实;当出现问题时,将应用程序隔离开来是一个巨大的胜利。能够为每个客户奉献大量的记忆因此是祝福和诅咒。 – Noky 2014-10-06 14:22:05

0

运行Java的另一个重要原因,一看Spring BootFabric8有多个JVM,而不是一个人面对NUMA组时。就像使用多个jvm进程一样,您不能在适当的numa组内的一个JVM内分发线程。至少我从来没有找到办法。

我们在这里有两个CPU的机器,每个机器有18个核心,这给了两个numa组,我们不能强制34个线程传播到两个CPU上,如果只使用一个JVM的话。这显然是因为它假定相同JVM进程的所有线程都需要快速访问相同的内存,而不是这种情况。

拥有34个进程时,系统假定他们不需要共享内存,从而将它们传播到两个cpus上。

如果有人知道这样做的更好方法,我会很高兴听到它。

相关问题