2

关于在 HP\UX 服务器上运行我们的公司 Java 应用程序的性能问题,我需要您的帮助。应用程序是一个独立的工具,它将多个数据库上的数据同步为一个,通过 XML-RPC 协议与远程控制通信,并使用本地 Derby (Java DB) 数据库实例来保存配置数据等。我们在其他环境上没有性能问题与使用 Sun JVM 的 Windows XP、Linux 和 AIX 相同的负载。经过一系列测试,我们发现最耗时的是与 Derby 数据库的通信。大部分时间都花在了从套接字读取上,这个时间比其他平台要多 10-100 倍。我们确信 Derby 工作正常,我们有 CPU 储备(使用率约为 30%-40%),所以最可能的原因是本地数据库和应用程序之间的传输层。

有没有办法诊断 HP-UX 上的套接字 I\O 问题,或者可能存在一些可以配置的限制?也许有必要的JVM选项?您的任何想法将不胜感激。

我们尝试根据http://publib.boulder.ibm.com/infocenter/wasinfo/v6r1/index.jsp?topic=/com.ibm.websphere.wsfep.multiplatform.doc/info/ae优化 JVM 选项/ae/tprf_tunejvm_v61.html但没有得到任何显着改善。

JVM 信息:Java HotSpot(TM) 64 位服务器 VM(19.1-b02-jinteg:2011mar11-16:46 PA2.0W (aCC_AP),混合模式) Java:版本 1.6.0.10,供应商“Hewlett-Packard Company”

我们使用以下实例: 操作系统:HP-UX (B.11.23) 架构:PA_RISC2.0W 64 位处理器:2

总物理内存大小:4 088 MB 交换大小:4 090 MB

这是运行缓慢的代码的示例。在 HP 上执行需要几秒钟,而在 Windows 上需要 10-30 毫秒:

/** Template to communicate with local db. */
SimpleJdbcTemplate jdbcTemplate;

@Transactional(readOnly = true)
public List<JobLogEntry> getLastLogs(Integer dbnr, JobDataType dtype) {
    try {
        String uid = jdbcTemplate.queryForObject("SELECT session_uuid FROM "
                                                         + tableName + " WHERE id=(SELECT max(id) FROM "
                                                         + tableName + " WHERE dbnr=? AND dtype=?)",
                                                         String.class, dbnr, dtype.name());
        List<JobLogEntry> list = jdbcTemplate.query("SELECT id, dbnr, dtype, zeit, level, message FROM "
                                                             + tableName
                                                             + " WHERE dbnr=? AND dtype=? AND session_uuid=? ORDER BY ID",
                                                             new ConRowMapper(), dbnr, dtype.name(), uid);
        return list;
    } catch (org.springframework.dao.EmptyResultDataAccessException e) {
        return new ArrayList<JobLogEntry>();
    }
}



class ConRowMapper implements RowMapper<JobLogEntry> {
    private final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss");

    /**
     * Maps rows.
     */
    public JobLogEntry mapRow(ResultSet rs, int rowNum) throws SQLException {
        return new JobLogEntry(rs.getInt("dbnr"), 
                               rs.getString("dtype"), 
                               dateFormat.format(rs.getTimestamp("zeit")), 
                               rs.getString("level"), 
                               rs.getString("message"));
    }
}

提前感谢您的所有想法

4

2 回答 2

1

我想知道方法getLastLogs()。为什么要查询以获取会话 UUID,然后转身在另一个查询中使用它?我猜想可以在一个查询中完成。

当您说 Derby 时,它让我认为只有 Java 才能访问该数据库。真的吗?你知道它优化得很好(例如,每个 WHERE 子句都有适当的索引)吗?

你使用连接池吗?这样,您可以预先支付创建连接的成本,并将其分摊到您运行的所有查询中。

我看到 jdbcTemplate,所以你必须使用 Spring。我会连接调试或跟踪拦截器,看看时间花在了哪里。

我还推荐 Visual VM 1.3.2 将安装所有插件。它会给你更多的数据。

于 2011-05-26T07:36:31.917 回答
0

可能的原因可能是 HP-UX 上的 GC 工作缓慢且阻塞。尝试删除多余的 System.gc() 调用并使用一些 JVM GC 选项来优化 :)

请参阅有关 HP 性能调整的精彩演示:http ://www.scribd.com/doc/47433278/Javamemorymanagemen

于 2011-05-26T11:49:22.663 回答