Назад | Перейти на главную страницу

Колебания пропускной способности при работе Java-сервера

Мы используем распределенную систему Java-серверов (os: linux), выполняющих много вычислений с обменом данными по TCP. Пока наша схема движения в не прерывистый, на некоторых машинах мы видим колебания в использовании пропускной способности сети, как показано ниже:

    02:56:32 PM     IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s
    02:56:33 PM        lo     61.00     61.00      8.69      8.69      0.00      0.00      0.00
    02:56:33 PM      eth0      0.00      0.00      0.00      0.00      0.00      0.00      0.00

    02:56:33 PM     IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s
    02:56:34 PM        lo    107.00    107.00     13.70     13.70      0.00      0.00      0.00
    02:56:34 PM      eth0  15514.00  15794.00   8036.93   7148.15      0.00      0.00      0.00

    02:56:34 PM     IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s
    02:56:35 PM        lo     59.00     59.00      8.85      8.85      0.00      0.00      0.00
    02:56:35 PM      eth0      0.00      0.00      0.00      0.00      0.00      0.00      0.00
    [pattern continues] 

По сути, использование полосы пропускания колеблется от 0 до 8 МБ / с. Нам не удалось выяснить причину таких колебаний.

Любые указатели / предложения будут большим подспорьем.

Изменить 1: для TCPNODELAY установлено значение true.

Изменить 2: Java ParNew GC запускается на этих машинах каждую секунду.

Изменить 3: мы запускаем только один Java-процесс.

Изменить 4: мы работаем с + XX: + DisableExplicitGC

Думаю, это ваша подсказка:

Java ParNew GC запускается на этих машинах каждую вторую секунду.

Ваше приложение Java обменивается данными через сеть. Каждую секунду вы приостанавливаете приложение Java для запуска сборки мусора. Вы видите сетевой трафик только каждую секунду, что означает, что приложение запускается только каждую секунду.

Кажется, ваш сетевой трафик в точности соответствует ожидаемому?

Запуск сборки мусора каждые две секунды определенно не помогает. Если JVM запускает это сама, вам потребуется больший размер кучи. Если вы запрашиваете эту коллекцию с System.gc() или Runtime.gc() затем попробуйте не запрашивать его так часто и посмотрите, следует ли шаблон трафика за паузами сборщика мусора.

Поиск и устранение неполадок в сборке мусора вашего конкретного приложения выходит далеко за рамки ответа на этом сайте, но я бы предложил выбрать некоторую метрику, которая важна для вашего приложения, и измерить эту метрику, пробуя разные размеры кучи, разные запросы GC интервалы и различные GC в вашей JVM. Есть много статей об использовании мусорщик для анализа производительности ГХ.

Не беспокойтесь о частоте пауз, количестве или продолжительности пауз. Используйте сборщик мусора и настройки, которые позволяют получить наилучшие показатели того, что важно для вашего приложения.

Я думаю, вы найдете много Java-инженеров, которые сказали бы, что вообще не запрашивайте сборку мусора вручную. Разработчики JVM приложили массу усилий для настройки автоматических интеллектуальных сборщиков мусора. Они знают больше, чем простые смертные, такие как вы или я. Доверяйте им.