У меня есть несколько приложений Java, которые используют MINA, и все они используют 20 потоков MINA. Одно приложение обслуживает около 10 000 одновременных подключений, которые обычно неактивны, но иногда принимают вход. 20, вероятно, является разумной встречей для этого приложения, хотя я точно не профилировал его (к чему этот вопрос идет). Другое приложение обслуживает только около 15 подключений одновременно, но инициирует работу ввода-вывода, поэтому они очень заняты и имеют 20 потоков MINA, что явно слишком много.
То, что странно для меня, - оба приложения всегда выделяют около 30%, иногда до 60%, своего времени процессора в метод MINA select(), профилированный в VisualVM. Стек вызова выглядит следующим образом:
java.lang.Thread.State: RUNNABLE
at sun.nio.ch.EPollArrayWrapper.epollWait(Native Method)
at sun.nio.ch.EPollArrayWrapper.poll(EPollArrayWrapper.java:228)
at sun.nio.ch.EPollSelectorImpl.doSelect(EPollSelectorImpl.java:81)
at sun.nio.ch.SelectorImpl.lockAndDoSelect(SelectorImpl.java:87)
- locked <40ca5d54> (a sun.nio.ch.Util$2)
- locked <24649fe8> (a java.util.Collections$UnmodifiableSet)
- locked <3fae9662> (a sun.nio.ch.EPollSelectorImpl)
at sun.nio.ch.SelectorImpl.select(SelectorImpl.java:98)
at org.apache.mina.transport.socket.nio.NioProcessor.select(NioProcessor.java:72)
at org.apache.mina.core.polling.AbstractPollingIoProcessor$Processor.run(AbstractPollingIoProcessor.java:1093)
at org.apache.mina.util.NamePreservingRunnable.run(NamePreservingRunnable.java:64)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
at java.lang.Thread.run(Thread.java:722)
Кажется, что он основан на занятом опросе, который звучит для меня совершенно неправильно.
Должен ли я беспокоиться, когда я вижу, что это высоко? Что вызывает это? Это что-то, что мне нужно для оптимизации или это более похоже на спящий или простой режим? Если он больше похож на режим сна, он как-то запланирован на более низкий приоритет, чем работа другого процессора?
Обновление: этот поток, похоже, та же проблема. Я выполнил его рекомендации, и теперь я запускаю Java 1.7.0_45, но я все еще вижу, что select
занимает до 90% времени процессора в приложении с подключением 10 тыс..
Мы используем MINA 2.0.4, что означает исправлена эта соответствующая ошибка.