Приложение Java работает очень медленно (в 10-100 раз медленнее, чем в Windows, Linux, AIX) - PullRequest
2 голосов
/ 26 мая 2011

Мне нужна ваша помощь по поводу проблем с производительностью при запуске нашего корпоративного 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"));
    }
}

Заранее благодарим за все ваши идеи

Ответы [ 2 ]

1 голос
/ 26 мая 2011

Интересно, о методе getLastLogs(). Зачем запрашивать UUID сеанса, а затем развернуться и использовать его в другом запросе? Я предполагаю, что это можно сделать одним запросом.

Когда вы говорите «Дерби», это заставляет меня думать, что только Java обращается к этой базе данных. Это правда? Знаете ли вы, что он хорошо оптимизирован (например, правильные индексы для каждого предложения WHERE)?

Используете ли вы пул соединений? Таким образом, вы можете заранее оплатить стоимость создания соединений и амортизировать ее по всем выполняемым запросам.

Я вижу jdbcTemplate, поэтому вы должны использовать Spring. Я бы подключил перехватчик отладки или трассировки и посмотрел, на что тратится время.

Я бы также порекомендовал Visual VM 1.3.2, чтобы все плагины были установлены. Это даст вам гораздо больше данных.

0 голосов
/ 26 мая 2011

Возможная причина - медленная и блокирующая работа GC на HP-UX. Попробуйте удалить избыточные вызовы System.gc () и используйте некоторые опции JVM GC для оптимизации:)

См. Хорошую презентацию о настройке производительности HP: http://www.scribd.com/doc/47433278/Javamemorymanagemen

...