Publié le: 2015-09-30

NIO connector

Tomcat 7 utilise par défaut le connecteur BIO qui créée 1 thread bloquant par connexion. Cela peut poser des problèmes de locks et de load très élevés lors de connexions en parallèles très importantes, en plus d’avoir un pool de threads statique qui peut arriver à saturation dans certains cas.

Introduit en Tomcat 6 de manière expérimentale et non activé en Tomcat 7 par défaut dû à un retard de la décision de l’équipe tomcat par rapport à la roadmap, NIO offre des performances supérieures à BIO en changeant le modèle de fonctionnement des threads JAVA. A partir de Tomcat 8, NIO devient le connecteur standard et NIO2 est en cours de développement.

NIO créée un pool réduit de threads Tomcat et affecte les requêtes aux différents threads par le biais de différentes queues. NIO utilise des I/O non bloquantes, permettant de réduire la latence des requêtes au détriment d’un usage CPU légèrement supérieur. Il faut également savoir que le nombre de threads du connecteur correspond au nombre de CPU et, depuis la version 7.0.28, peut correspondre au maximum à 2 fois le nombre de CPU de la machine.

Suivant les cas et surtout avec un nombre de threads élevés en BIO sur vos serveurs Tomcat, le gain de performance peut varier de 5 à 30% sur la performance du traitement des requêtes.

Pour passer votre connecteur AJP en NIO, il suffit de changer l’argument protocol dans le server.xml:

<Connector port="8009" enableLookups="false" protocol="org.apache.coyote.ajp.AjpNioProtocol" />

Vous pouvez faire de même avec le connecteur HTTP:

<Connector port="8080" enableLookups="false" protocol="org.apache.coyote.http11.Http11NioProtocol" />

Conclusion

Vous savez désormais comment augmenter les performances de votre serveur Tomcat 7, gratuitement.

Si vous souhaitez aller plus loin en terme de performances il est possible de configurer Tomcat pour utiliser la librairie native APR, qui utilisera des sockets C pour la couche réseau Tomcat, en mode événementiel et non bloquant.