Я пишу приложение Netty. Приложение работает в 64-битном восьмиядерном ядре Linux
Приложение Netty - это простой маршрутизатор, который принимает запросы (входящий конвейер), считывает некоторые метаданные из запроса и пересылает данные в удаленную службу (исходящий конвейер).
Эта удаленная служба вернет один или несколько ответов на исходящий конвейер. Приложение Netty направит ответы обратно исходному клиенту (входящему конвейеру)
Будут тысячи клиентов. Будут тысячи удаленных сервисов.
Я занимаюсь небольшим тестированием (десять клиентов, десять пультов), и я не вижу суб 10-миллисекундной производительности, которую ожидаю на уровне 99,9 процентиля. Я измеряю задержку как со стороны клиента, так и с сервера.
Я использую полностью асинхронный протокол, похожий на SPDY. Я фиксирую время (я просто использую System.nanoTime()), когда мы обрабатываем первый байт в FrameDecoder. Я останавливаю таймер перед вызовом channel.write(). Я измеряю субмиллисекундное время (99,9 процентиля) от входящего трубопровода до исходящего трубопровода и наоборот.
Я также измерил время от первого байта в FrameDecoder до того, как был вызван обратный вызов ChannelFutureListener на (выше) message.write(). Время было высоким десятки миллисекунд (99,9 процентиля), но мне не удалось убедить себя, что это полезные данные.
Моя первоначальная мысль заключалась в том, что у нас были медленные клиенты. Я просмотрел channel.isWritable() и зарегистрировался, когда это вернуло false. Этот метод не возвращал false при нормальных условиях
Некоторые факты:
- Мы используем фабрики NIO. Мы не настроили рабочий размер
- У нас отключен Nagel (tcpNoDelay = true)
- Мы включили keep keep (keepAlive = true)
- CPU не работает 90%% времени
- Сеть простаивает
- GC (CMS) вызывается каждые 100 секунд или около того в течение очень короткого промежутка времени.
Есть ли способ отладки, который я мог бы выполнить, чтобы определить, почему мое приложение Netty работает не так быстро, как я полагаю, он должен?
Похоже, что channel.write() добавляет сообщение в очередь, и мы (разработчики приложений, использующие Netty) не имеют прозрачности в этой очереди. Я не знаю, является ли очередь очередью Netty, очередью ОС, очередью сетевой карты или чем. В любом случае, я просматриваю примеры существующих приложений, и я не вижу никаких анти-шаблонов, которые я следую за
Спасибо за любую помощь/понимание