Selectors

Fiz uma aplicação usando as features novas da 1.4 (SelectableChannels, Selectors) e notei que estava consumindo muita CPU … procurando no site da Sun, achei uma dica bem importante sobre isso e resolveu meu problema em 85% do tempo. Estou lendo mais alguma documentação sobre a coisa, mas ainda sinto falta de uma abordagem mais “low level” sobre o assunto, alguém tem algum link ou sugestão? :slight_smile:
Engraçado como essas coisas bem importantes as vezes ficam relegadas nos materiais da Sun. Ano passado, quando praticamente eram bem recentes, eu perguntei no Sun Tech Days para o … como é mesmo o nome daquele tio de chapéuzinho de co-u-ro, mano? que estava lá, Rags, acho, sobre por que não falavam muito sobre a NIO e ele disse que no futuro eles falariam, mas não senti que estavam dando a devida importancia para uma coisa que pode ser uma mão na roda em certos casos …

Se você já trabalhou com io multiplexing e socket não blocantes fora do
java não existe segredo para usar Channels e Selectors, só umas pegadinhas como nunca depender do finalize ou fazer pooling.

Agora documentação boa sobre como usar legal, realmente não existe ou eu não achei

Eu uma vez comecei a ver algo beeeeem de leve em C e faz muuuuuito tempo ehehe então a minha primeira experiencia prática mesmo com isso está sendo no Java. Realmente tem umas pegadinhas bem @#$@%$@ que podem comprometer, e a falta (infelizmente) de documentação só complica mais as coisas ehehe. Como dizia acima, que pena a importancia menor que é dada , por parte da Sun, para uma coisa tão útil …

Algumas dicas uteis:

:arrow: não use Selectors para pooling, isso usa muita cpu

:arrow: se voce tiver muitos Channels no mesmo Selector talvez compense usar varias threads cada uma com 1 parte dos Channels. Muitos, na maioria dos casos, mais de 100.

:arrow: leia sempre todos dados disponiveis no Channel

:arrow: dependendo da situação, misturar seleção de operações read/write no mesmo Selector podem degradar em voce fazendo pooling.

:arrow: sempre feche seus channels quando terminar de usar eles.

:arrow: sockets não blocantes são um inferno de trabalhar, um ideal é estar sempre tentando diminuir ao mínimo o número de chamadas inuteis.

Eu havia registrado um SocketChannel em um Selector como OP_READ|OP_WRITE (falta de documentação ás vezes leva a umas coisas dessas ehehe), e isso estava realmente matando a CPU. Deixei só para OP_READ (afinal, não precisaria também monitorar a escrita) e isso reduziu a carga consideravelmente.
Muito obrigado pelas suas dicas. :smiley: