关于在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/ae/tprf_tunejvm_v61.html优化JVM选项,但没有得到任何显着的改进。
JVM信息: Java HotSpot(TM) 64位服务器VM (19.1-b02-jinteg:2011mar11-16:46 PA2.0W (aCC_AP),混合模式) Java:版本1.6.0.10,供应商“惠普公司”
我们使用以下实例:操作系统: HP-UX (B.11.23)架构: PA_RISC2.0W 64位处理器:2
总物理内存大小:4088MB交换大小:4090MB
下面是运行缓慢的代码示例。在HP上执行需要几秒钟,而在Windows上需要10-30ms:
/** 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"));
}
}预先感谢您的所有想法
发布于 2011-05-26 15:36:32
我想知道getLastLogs()方法。为什么查询获取会话UUID,然后在另一个查询中使用它呢?我猜可以在一个查询中完成。
当您提到Derby时,我会认为只有Java才能访问该数据库。这是真的吗?你知道它优化得很好吗(例如,每个WHERE子句都有合适的索引)?
你使用连接池吗?这样,您就可以预先支付创建连接的成本,并将其分摊到您运行的所有查询中。
我看到了jdbcTemplate,所以你一定是在用Spring。我会将调试或跟踪拦截器连接起来,看看时间都花在哪里了。
我也推荐使用Visual VM 1.3.2来安装所有插件。它将为您提供更多的数据。
发布于 2011-05-26 19:49:23
可能的原因可能是HP-UX上的GC工作缓慢和阻塞。尝试删除冗余的System.gc()调用,并使用一些JVM选项来优化:)
查看关于HP性能调优的精彩演示文稿:http://www.scribd.com/doc/47433278/Javamemorymanagemen
https://stackoverflow.com/questions/6135070
复制相似问题