关于在 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"));
}
}
提前感谢您的所有想法