Мы используем Apache Camel для извлечения данных из SQS и выполнения некоторой обработки и импорта в базу данных.
Поскольку нам нужна большая производительность, мы проводим эксперимент с 4 приложениями, развернутыми в Apache Tomcat версии 8, каждое из которых имеет 12 маршрутов, указывающих на соответствующие 12 очереди SQS, развернутые на одном сервере (64 ГБ ОЗУ).
Каждый маршрут имеет 500 потоков и 750 макс. Размер пула. Всего для 4 приложений у нас всего 24000 потоков и 36000 максимального размера пула.
Когда мы запускаем тест, Tomcat неожиданно останавливался из-за следующего сообщения об ошибке,
Предупреждение виртуальной машины 64-разрядного сервера Java HotSpot (TM): Ошибка INFO: os :: commit_memory (0x00007f3395aef000, 12288, 0); error = 'Невозможно выделить память' (errno = 12) Java HotSpot (TM) 64-Bit Server VM warning: # Попытка защитить страницы защиты стека не удалась. # Недостаточно памяти для продолжения работы среды выполнения Java.
фиксация зарезервированной памяти.
Но при проверке общего использования ОЗУ сервером используется только от 16 до 18 ГБ.
Таким образом, мы уменьшили размер потока каждого маршрута до 250, а максимальный размер пула до 500. В целом для 4 приложений у нас всего 12000 потоков и 24000 максимального размера пула. В это время приложение работает нормально, без проблем.
Размер кучи в Tomcat: 40 ГБ
Мы не уверены, почему мы сталкиваемся с проблемой, когда у нас больше потоков?. Нужно ли нам изменять какую-либо конфигурацию в Tomcat для поддержки большего количества потоков?
Не могли бы вы помочь нам решить эту проблему?