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?
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.