J'ai la machine en cours d'exécution avec l'application Spring (Spring Boot 1.5.2.RELEASE)
. Récemment, je reçois beaucoup d’avertissements dans mon fichier journal:
.w.s.m.s.DefaultHandlerExceptionResolver : Failed to read HTTP message: org.springframework.http.converter.HttpMessageNotReadableException: Could not read document: null; nested exception is Java.net.SocketTimeoutException
J'ai vérifié avec tcpdump
et de nombreuses demandes n'ont pas de corps (vide/nul) ou ont un corps incorrect, par exemple. \00\00\00\00\00\00\00speed":"23.3","user_id":106312}
Le plus gros problème est qu'après un certain temps, je commence à recevoir des exceptions dans mon application:
org.Apache.Tomcat.util.net.NioEndpoint : Socket accept failed
Java.io.IOException: Too many open files
at Sun.nio.ch.ServerSocketChannelImpl.accept0(Native Method)
at Sun.nio.ch.ServerSocketChannelImpl.accept(ServerSocketChannelImpl.Java:241)
at org.Apache.Tomcat.util.net.NioEndpoint$Acceptor.run(NioEndpoint.Java:443)
at Java.lang.Thread.run(Thread.Java:745)
ulimit -n
indique que la limite du nombre de fichiers ouverts est définie sur 65536
. Je pense donc que sa taille est suffisante.
Je suppose que recevoir un grand nombre de demandes non valides provoque une exception IOException, mais pourquoi? Et que dois-je faire pour l'éviter et le réparer?
Je suppose que vous utilisez une prise Web avec une botte à ressort. Vous ne pouvez écouter que sur le port 65535 maximum. Vous ne pouvez pas dépasser cette valeur sur une machine. Vous devriez vérifier si vous fermez correctement vos sockets.