Playframework потоков бассейнов

Я профилирую приложение playframework 2.2.3 с YourKit, чтобы попытаться устранить некоторые проблемы с производительностью. Это не мое приложение, и я не знаком с игрой 2. Это многопользовательская социальная игра, в которой используются веб-сокеты. Работает на Amazon EC2 m3.large

Что я вижу в профилировщике, так это то, что логика игрового процесса (начатая вызовами веб-сокетов) выполняется в 1 из 2 потоков в контексте play-internal-исполнительный контекст. Некоторые подпрограммы включают ввод-вывод, и происходит некоторая блокировка из-за частичной синхронизации методов. Существует пул потоков с именем play-internal-execute-context, но в любое время используются только два. Время от времени активность перемещается в новые потоки, и я вижу, что сейчас используются имена потоков: play-internal-execute-context-600 и 601.

Я могу видеть в документах игры

Play Внутренний пул потоков - используется внутри Play. Никакой код приложения никогда не должен выполняться потоком в этом пуле потоков, и никакая блокировка никогда не должна выполняться в этом пуле потоков. Его размер можно настроить, установив internal-threadpool-size в application.conf, и по умолчанию это число доступных процессоров.

Как я вижу, следы стека в потоках, которые включают в себя код приложения, вероятнее всего, что разработчики имеют неправильный дизайн, или это просто из-за асинхронной природы фреймворка, что код на самом деле просто выполняется play в этих внутренних потоках?

Всего наилучшего

Джон

1 ответ

Убедитесь, что вы не запускаете блокирующий код внутри метода обратного вызова onReady WebSocket. Любые блокировки или тяжелые вычисления должны быть выгружены в какой-либо другой пул потоков (используйте обещание или субъект).

Другие вопросы по тегам