Мне нужна ваша помощь по поводу проблем с производительностью при запуске нашего корпоративного Java-приложения на сервере HP \ UX.Приложение представляет собой автономный инструмент, который синхронизирует данные из нескольких баз данных в одну, связывается с удаленным управлением по протоколу XML-RPC и использует локальный экземпляр базы данных Derby (Java DB) для хранения данных конфигурации и т. Д. У нас нет проблем с производительностью в других средах.та же нагрузка, что и в Windows XP, Linux и AIX, использующих Sun JVM.После серии тестов мы обнаружили, что больше всего времени занимает связь с базой данных Derby.Большая часть времени уходит на чтение из сокета и в 10-100 раз больше, чем на других платформах.Мы точно знаем, что Derby работает нормально, у нас есть резерв ЦП (загрузка составляет около 30% -40%), поэтому наиболее вероятной причиной является транспортный уровень между локальной базой данных и приложением.
Существует ли способ диагностики проблем ввода-вывода через сокет в HP-UX или, возможно, есть некоторые возможные ограничения, которые можно настроить?Может быть, есть необходимая опция JVM?Любые идеи с вашей стороны будут высоко оценены.
Мы пытались оптимизировать параметры 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:Java HotSpot (TM) 64-разрядная серверная виртуальная машина (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 МБ Размер подкачки: 4 090 МБ
Вот пример медленно работающего кода.Выполнение в 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"));
}
}
Заранее благодарим за все ваши идеи