【问题标题】:I'm trying to identify performance differences with the same java code on linux vs windows. On the face of it, performance under linux is much worse我试图在 linux 和 windows 上使用相同的 java 代码来识别性能差异。表面上看,linux下的性能差很多
【发布时间】:2012-07-10 22:46:01
【问题描述】:

我意识到这个问题非常笼统,我正在寻找有关如何协调 linux (RedHat 5) 与 Windows (2008 Server) 上的性能差异的非常一般的输入。我有一个 java 应用程序,它是多个服务的集合,这些服务正在处理来自线路的 netflow 数据包,在完全相同的硬件上,它似乎在 Linux 和 Windows 上以大约一半的容量执行。该应用程序涉及从套接字中提取数据包,并对它们执行一些非常简单的处理,并写出一个压缩的输出文件以由不同的 C++ 应用程序在下游进行处理。

计划中的相关领域: 从套接字中拉出数据包 数据库访问(mysql 5.1.45) 大量的文件 i/o

就优化而言,我对 Linux 的经验很少,如果有人能指出一些在尝试针对不同于 Windows 的 Linux 进行优化时需要注意的事项,那就太好了。

另外,我不完全确定我还能提供哪些其他信息。就像,我知道我没有提供很多有用的信息,我很感激能指出我正确方向的问题。

是否有提供跨 Linux 和 Windows 的 Java 性能基准测试的实用程序?

如果这个问题没有意义,或者我提供的信息太少,甚至无法提出有用的问题,请随意击落我。

谢谢!

编辑: 所有 jvm 设置都是相同的(在两种情况下,我们对所涉及的服务使用完全相同的包装器配置文件)

编辑: 我想暂时提出这个问题。除了运行一个基本的分析器和比较结果之外,我已经无法花更多的时间来探索这个了。 linux 和 windows 上的结果看起来几乎相同,除了从 NIC 中提取数据包的延迟要大得多。我仍然不明白为什么会这样,或者这是与其他网络状况有关的异常情况。当我有时间再看这个时,我会发布更多。

感谢大家的回答!

【问题讨论】:

  • 你用的是 NIO 还是 java.io.File 你都试过了吗?
  • 是的,我正在使用 NIO。我们在切换到 NIO 之前尝试了 java.io.File,这是在需要 Linux 支持之前。
  • 同一个网段和交换机?不同的网卡规格?

标签: java windows linux sockets


【解决方案1】:

建议:找到适合您的场景的分析工具,并在两种环境中运行它。

例如,Eclipse TFTP:

PS:

Affe 对 NIO 的建议是一个很好的建议。诚然,它引出了一个问题,即为什么似乎存在性能差异。但是,如果您还没有使用 NIO,它可以使这两种环境都受益。恕我直言...

【讨论】:

  • 这是一个很好的建议,明天我会尝试看看配置文件看起来是否有所不同。也感谢您的链接。
【解决方案2】:

从表面上看,对于相同的硬件,Linux 并不比 Windows 慢。在责怪操作系统(或操作系统上的 Java)之前,我先看看其他事情:

  • 硬件是否相同?相同的处理器规格?一样的内存?相同的光盘规格?

  • 是不是数据库有问题? Windows 和 Linux 系统是否与同一个数据库实例通信?他们是否以同样的方式与之交谈。如果数据库实例不同,它们的配置是否相同?调音了吗?

此类问题的解决方案通常涉及打开性能监控、分析等,并分析系统的行为以查看瓶颈所在。

IMO,在花费(浪费)时间在一些理论(例如)使用 NIO 将解决问题之前,您需要弄清楚瓶颈到底在哪里。


是否有提供跨 Linux 和 Windows 的 Java 性能基准测试的实用程序?

我不知道。

【讨论】:

  • 两种情况下的硬件是相同的。事实上,为了确保这一点,我什至尝试更换机器,并得到相同的结果。两种情况下的数据库也是相同的(在配置和调优方面),与数据库通信的代码也是相同的。
  • 分析和性能监控数字说明了什么?瓶颈在哪里?
【解决方案3】:

其他一些可能影响性能的因素: - JVM - 您是否使用相同的供应商 JVM?同一个版本?都是 64 位还是 32 位? - 内核问题:您正在运行自定义内核吗?为您的处理器正确编译? - Linux 上的 CLI 性能工具(top、ntop、iostat、vmstat)告诉你什么?例如,如果 iostat 的 IO 等待时间较长,则可能是驱动器配置方式存在问题

有很多因素会影响 Java 性能。从简单开始,向后工作。在我看来,简单的 == 基本统计数据,例如内存页面和 IO 性能。如果我们谈论的是完全相同的代码,那么开始识别差异(显然是操作系统,但还有什么?)

【讨论】:

  • 哦,我同意 Stephen C 的观点……根据我的经验,最常见的怀疑是数据库和磁盘 IO。在磁盘写入和对数据库的调用周围放置一些打印输出,在 Windows 和 Linux 上运行它,看看你得到了什么......可能会被证明是有用的。
【解决方案4】:

JVisualVM 可能已经在您的目标平台上可用。一个例子可以在here找到。

【讨论】:

    猜你喜欢
    • 2018-12-15
    • 2014-12-23
    • 2022-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-15
    • 2017-03-24
    相关资源
    最近更新 更多