我们有一台 VMWare ESXi 4.1 服务器,托管许多 Linux 和 Windows 客户机。最近,一台新的 Linux 客户机被添加到此服务器,并且似乎运行良好。然后,Tomcat 和一些其他应用程序被安装在此服务器上,这似乎导致服务器运行非常缓慢,而没有任何明显的资源问题。
性能缓慢包括:
- 通过 ssh 输入密码提示所需的时间以前是瞬间完成的,但现在需要几秒钟。
- 解压一个 zip 文件所需的时间以前是几秒钟,现在大约需要 30 秒
- 编译 vmware tools 所需的时间也增加了类似的因素
VMWare 控制台和监控命令均未报告任何有关 CPU 或内存使用率过高的问题,但显然有些东西以某种方式减慢了服务器的速度。
有谁知道是什么原因导致了这个问题以及如何解决?
谢谢,
汤姆
编辑
根据您的问题,我查看了 VM 主机和 VM 客户机上的一些性能指标。
首先,我尝试为该虚拟机保留全部内存(3GB)——该服务器上的其他机器没有任何内存保留。
VM 主机和客户机的换入率和换出率现在都为零。
客户机上的气球内存为零,主机上的气球内存为 3.5gb(主机上的总内存为 12gb)
客人的掉期利率也为零。
主机使用的交换空间平均为 200mb。
主机和客户机的压缩和解压缩率为零。
主机的命令中止为零。
读取延迟非常低 – 最大 10ms,平均 0.8ms。
写入延迟较高 - 有几个峰值达到 170ms,但大多数时候在 25ms 左右 - 这很糟糕吗?
队列命令延迟为零。
物理磁盘读取延迟平均为 5ms,但通常为 10ms
物理磁盘写入延迟平均为 15 毫秒,但通常为 20 毫秒
我希望这会有所帮助 - 如果您需要更多信息,请告诉我。
答案1
Java 往往会混淆 VMWare 内存管理系统,因为它增加了另一层内存管理。
有一篇知识库文章,链接如下。但关键是将保留的 VM 内存(而不仅仅是 VM 内存大小)的大小设置为大于或等于 Java(tomcat)的内存。
答案2
您发布的磁盘延迟数字其实并不低,而是相当高。10ms 或更长的磁盘延迟将使交互式使用变得非常缓慢。查看您的存储系统,看看 IOPS 是否超额订阅。
http://www.techrepublic.com/blog/datacenter/calculate-iops-in-a-storage-array/2182
答案3
这里使用的是双重虚拟化。您有一个客户操作系统 Java,它运行在虚拟化主机上的另一个客户操作系统 (LINUX) 中。Java 中的所有调用都必须经过双重转换才能访问实际的硬件资源。在大多数情况下,与本机相比,这会导致性能低于预期。
像 Java 和数据库解决方案这样的客户操作系统通常具有自己的自然合并层,以便能够在单个硬件上整合多个实例,从而实现与在虚拟化解决方案下将整个主机操作系统转变为客户操作系统相同的成本节省。使用本机合并机制的核心优势是,您避免在访问客户操作系统 (Java) 使用的实际硬件资源的过程中添加另一个仲裁层。有时,虚拟机管理程序会帮助您访问资源,但很多时候却不是。
您是否考虑过削减一个用于访问硬件的仲裁层,并查看更原生的 VM tomcat 实例(例如 VMWARE 的 tc 服务器),http://www.vmware.com/products/vfabric-tcserver/或者甚至是像 JNODE 或 SANOS 这样的 Java OS 实例?
答案4
我们在 Debian Lenny (5.0) 服务器上也遇到过这种情况,主要是在安装 Tomcat 后出现的 SSH 登录时间问题。在看到大量有关 DNS 解析的评论后,我们发现导致系统变慢的是 Avahi-Daemon,而不是 Tomcat。
执行“apt-get purge avahi-daemon”解决了 ssh 登录延迟问题。