У меня есть несколько приложений 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, что означает, что эта соответствующая ошибка исправлена.