Quantas requisiçõe o tomcat aguenta? Será menos de 1000?

No server.xml está assim:

<Connector port="8080" executor="tomcatThreadPool"  protocol="HTTP/1.1" 
               connectionTimeout="20000" maxThreads="1000" 
               acceptorThreadCount="2" redirectPort="8443" socket.directBuffer="false"/> 

No log do tomcat eu olhei este arquivos.

  • catalina.out

Feb 19, 2008 1:29:33 PM org.apache.coyote.http11.Http11Protocol init SEVERE: Error initializing endpoint java.net.BindException: Address already in use:8080 at org.apache.tomcat.util.net.JIoEndpoint.init(JIoEndpoint.java:501) at org.apache.coyote.http11.Http11Protocol.init(Http11Protocol.java:176) at org.apache.catalina.connector.Connector.initialize(Connector.java:1058) at org.apache.catalina.core.StandardService.initialize(StandardService.java:677) at org.apache.catalina.core.StandardServer.initialize(StandardServer.java:795) at org.apache.catalina.startup.Catalina.load(Catalina.java:530) at org.apache.catalina.startup.Catalina.load(Catalina.java:550) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at org.apache.catalina.startup.Bootstrap.load(Bootstrap.java:260) at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:412) Feb 19, 2008 1:29:33 PM org.apache.catalina.startup.Catalina load SEVERE: Catalina.start LifecycleException: Protocol handler initialization failed: java.net.BindException: Address already in use:8080 at org.apache.catalina.connector.Connector.initialize(Connector.java:1060) at org.apache.catalina.core.StandardService.initialize(StandardService.java:677) at org.apache.catalina.core.StandardServer.initialize(StandardServer.java:795) at org.apache.catalina.startup.Catalina.load(Catalina.java:530) at org.apache.catalina.startup.Catalina.load(Catalina.java:550) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at org.apache.catalina.startup.Bootstrap.load(Bootstrap.java:260) at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:412) Feb 19, 2008 1:29:33 PM org.apache.catalina.startup.Catalina load SEVERE: Catalina.start LifecycleException: Protocol handler initialization failed: java.net.BindException: Address already in use:8080 at org.apache.catalina.connector.Connector.initialize(Connector.java:1060) at org.apache.catalina.core.StandardService.initialize(StandardService.java:677) at org.apache.catalina.core.StandardServer.initialize(StandardServer.java:795) at org.apache.catalina.startup.Catalina.load(Catalina.java:530) at org.apache.catalina.startup.Catalina.load(Catalina.java:550) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at org.apache.catalina.startup.Bootstrap.load(Bootstrap.java:260) at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:412) Feb 19, 2008 1:29:33 PM org.apache.catalina.startup.Catalina load INFO: Initialization processed in 2560 ms Feb 19, 2008 1:29:34 PM org.apache.catalina.core.StandardService start INFO: Starting service Catalina Feb 19, 2008 1:29:34 PM org.apache.catalina.core.StandardEngine start INFO: Starting Servlet Engine: Apache Tomcat/6.0.16 Feb 19, 2008 1:29:41 PM org.apache.catalina.core.StandardContext addApplicationListener INFO: The listener "listeners.ContextListener" is already configured for this context. The duplicate definition has been ignored. Feb 19, 2008 1:29:41 PM org.apache.catalina.core.StandardContext addApplicationListener INFO: The listener "listeners.SessionListener" is already configured for this context. The duplicate definition has been ignored. Feb 19, 2008 1:29:41 PM org.apache.coyote.http11.Http11Protocol start INFO: Starting Coyote HTTP/1.1 on http-8080 Feb 19, 2008 1:29:43 PM org.apache.jk.common.ChannelSocket init INFO: JK: ajp13 listening on /0.0.0.0:8009 Feb 19, 2008 1:29:43 PM org.apache.jk.server.JkMain start INFO: Jk running ID=0 time=0/303 config=null Feb 19, 2008 1:29:43 PM org.apache.catalina.startup.Catalina start INFO: Server startup in 15431 ms Feb 19, 2008 1:29:44 PM org.apache.catalina.core.StandardContext addApplicationListener INFO: The listener "listeners.ContextListener" is already configured for this context. The duplicate definition has been ignored. Feb 19, 2008 1:29:44 PM org.apache.catalina.core.StandardContext addApplicationListener INFO: The listener "listeners.SessionListener" is already configured for this context. The duplicate definition has been ignored. Feb 19, 2008 1:29:44 PM org.apache.coyote.http11.Http11Protocol start SEVERE: Error starting endpoint java.net.BindException: Address already in use:8080 at org.apache.tomcat.util.net.JIoEndpoint.init(JIoEndpoint.java:501) at org.apache.tomcat.util.net.JIoEndpoint.start(JIoEndpoint.java:515) at org.apache.coyote.http11.Http11Protocol.start(Http11Protocol.java:203) at org.apache.catalina.connector.Connector.start(Connector.java:1131) at org.apache.catalina.core.StandardService.start(StandardService.java:531) at org.apache.catalina.core.StandardServer.start(StandardServer.java:710) at org.apache.catalina.startup.Catalina.start(Catalina.java:578) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:288) at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:413)

no localhost.2008-02-19.log:

Feb 19, 2008 1:28:29 PM org.apache.catalina.core.StandardHostValve custom SEVERE: Exception Processing ErrorPage[exceptionType=java.lang.Exception, location=/WEB-INF/jsp/errors/servleterror.jsp] org.apache.jasper.JasperException: File "/WEB-INF/jsp/errors/servleterror.jsp" not found at org.apache.jasper.compiler.DefaultErrorHandler.jspError(DefaultErrorHandler.java:51) at org.apache.jasper.compiler.ErrorDispatcher.dispatch(ErrorDispatcher.java:409) at org.apache.jasper.compiler.ErrorDispatcher.jspError(ErrorDispatcher.java:116) at org.apache.jasper.compiler.JspUtil.getInputStream(JspUtil.java:847) at org.apache.jasper.xmlparser.XMLEncodingDetector.getEncoding(XMLEncodingDetector.java:108) at org.apache.jasper.compiler.ParserController.determineSyntaxAndEncoding(ParserController.java:309) at org.apache.jasper.compiler.ParserController.doParse(ParserController.java:173) at org.apache.jasper.compiler.ParserController.parse(ParserController.java:103) at org.apache.jasper.compiler.Compiler.generateJava(Compiler.java:153) at org.apache.jasper.compiler.Compiler.compile(Compiler.java:314) at org.apache.jasper.compiler.Compiler.compile(Compiler.java:294) at org.apache.jasper.compiler.Compiler.compile(Compiler.java:281) at org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:566) at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:317) at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:337) at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:266) at javax.servlet.http.HttpServlet.service(HttpServlet.java:803) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at com.opensymphony.module.sitemesh.filter.PageFilter.doFilter(PageFilter.java:39) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:630) at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:438) at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:374) at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:302) at org.apache.catalina.core.StandardHostValve.custom(StandardHostValve.java:424) at org.apache.catalina.core.StandardHostValve.throwable(StandardHostValve.java:271) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583) at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447) at java.lang.Thread.run(Thread.java:619) Feb 19, 2008 1:28:37 PM org.apache.catalina.core.StandardWrapperValve invoke INFO: Servlet probe is currently unavailable Feb 19, 2008 1:28:37 PM org.apache.catalina.core.ApplicationDispatcher invoke WARNING: Servlet probe is currently unavailable Feb 19, 2008 1:28:42 PM org.apache.catalina.core.StandardWrapperValve invoke INFO: Servlet probe is currently unavailable Feb 19, 2008 1:28:42 PM org.apache.catalina.core.ApplicationDispatcher invoke WARNING: Servlet probe is currently unavailable Feb 19, 2008 1:29:02 PM org.apache.catalina.core.ApplicationContext log INFO: SessionListener: contextDestroyed() Feb 19, 2008 1:29:02 PM org.apache.catalina.core.ApplicationContext log INFO: ContextListener: contextDestroyed() Feb 19, 2008 1:29:41 PM org.apache.catalina.core.ApplicationContext log INFO: ContextListener: contextInitialized() Feb 19, 2008 1:29:41 PM org.apache.catalina.core.ApplicationContext log INFO: SessionListener: contextInitialized() Feb 19, 2008 1:29:44 PM org.apache.catalina.core.ApplicationContext log INFO: ContextListener: contextInitialized() Feb 19, 2008 1:29:44 PM org.apache.catalina.core.ApplicationContext log INFO: SessionListener: contextInitialized() Feb 19, 2008 1:29:45 PM org.apache.catalina.core.ApplicationContext log INFO: SessionListener: contextDestroyed() Feb 19, 2008 1:29:45 PM org.apache.catalina.core.ApplicationContext log INFO: ContextListener: contextDestroyed() Feb 19, 2008 1:29:48 PM org.apache.catalina.core.ApplicationContext log INFO: Loading WebApplicationContext for Spring FrameworkServlet 'probe' (END)

[quote=Jedi_FeniX]O primeiro teste que eu falei que rodou foi assim, dentro da servlet tem uma classe que eu chamo que abre o arquivo, grava os dados e fecha o arquivo, então, tirei o objeto de dentro da servlet. E rodou tranquilo.
No segundo teste deixei o objeto que faz as persistências no arquivo, mas tirei a parte que abre o arquivo, grava os dados e fecha. E não rodou as 1000 requisições.

O erro que eu recebo na linha de comando é este:

[quote]HTTP request sent, awaiting response… 500 Internal Server Error
11:15:11 ERROR 500: Internal Server Error.[/quote][/quote]

Ola só pra lembrar que se fosse um problema de falta de memoria o erro seria um OutOfMemoryError… e olha que a minha aplicação ocorria isto :((

Mas vamos lá, vc disse que com o teste que vc “exclui” a classe que persiste do servlet, isto é, vc não faz referencia nenhuma a ela, o teste funciona… e no
teste que vc faz referencia a ela, mas dentro dela vc tira a parte que faz a persistencia, o teste dá erro…

Uma pergunta: vc está considerando que o metodo doGet, por definição é um metodo que não pode alterar o estado do servidor, tem uma palavra que define isto… mas não lembro… então tente fazer isto pelo doPost… só pra testar :wink:

Uma parada… por definição os servlets não são thread-safe, então os metodos que respondem a requisições tem que ser preparados para isto… o que pode estar acontecendo realmente seja excesso de io, olhe que vc não só abre o arquivo de output, mas um de input em toda requisição:

[code]

File fileProperties = new File("/usr/local/apache-tomcat-6.0.16/webapps/AppWeb/WEB-INF/config/conf.properties");

FileInputStream fileInputStream = new FileInputStream(fileProperties);

Properties properties = new Properties();

properties.load(fileInputStream); [/code]

Será que não seria melhor vc fazer isto uma única vez? uma vez que estas definições não mudarão?? pelo que vejo.

Uma parada… quando vc tirou a parte que faz a persistencia da classe OpenFile… vc a comentou toda? ou só as partes de IO?

Esses logs não estão dizendo muita coisa do que estamos procurando faça o seguinte:

-Limpe o arquivo catalina.out
-Reinicie o tomcat e rode o seu teste.

Então peque o conteudo do catalina.out e cole aí pra nós.

PS.: Você não está usando connector NIO. Está usando o connector default.

Fiz mais um teste sendo que o resultado deu igual aos outros só fo aceito 972 requisições de 1000 e fiz mais requisição, depois das 1000, só que pelo browser e recebi este erro:

java.io.FileNotFoundException: $CATALINA_HOME/webapps/App/WEB-INF/config/conf.properties (Too many open files)
	java.io.FileInputStream.open(Native Method)
	java.io.FileInputStream.<init>(FileInputStream.java:106)
	servlet.MainServlet.doGet(MainServlet.java:20)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:690)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:803)

Será que uns dos motivos dos erros pode estar sendo criado pelo Log4J? Estava vendo alguns artigos na internet e vi que tem como “juntar” o Log4J com o tomcat, alguém saberia fazer essa junção?

Mudei o server.xml na parte do connector para usar o Nio.
Ficou assim:

<Connector port="8080"  protocol="org.apache.coyote.http11.Http11NioProtocol"
               connectionTimeout="20000" maxThreads="1000"
               acceptorThreadCount="2" redirectPort="8443" socket.directBuffer="false"/>

E continuei tendo o mesmo erro, as 1000 requisiçõe param na 972

[quote=Jedi_FeniX]Fiz mais um teste sendo que o resultado deu igual aos outros só fo aceito 972 requisições de 1000 e fiz mais requisição, depois das 1000, só que pelo browser e recebi este erro:

java.io.FileNotFoundException: $CATALINA_HOME/webapps/App/WEB-INF/config/conf.properties (Too many open files)
	java.io.FileInputStream.open(Native Method)
	java.io.FileInputStream.<init>(FileInputStream.java:106)
	servlet.MainServlet.doGet(MainServlet.java:20)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:690)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:803)

Será que uns dos motivos dos erros pode estar sendo criado pelo Log4J? Estava vendo alguns artigos na internet e vi que tem como “juntar” o Log4J com o tomcat, alguém saberia fazer essa junção?[/quote]

Pronto,

ta ai o seu problema

java.io.FileNotFoundException: $CATALINA_HOME/webapps/App/WEB-INF/config/conf.properties (Too many open files)

primeiro que um properties não pode ser aberto toda hora, ele deve ser carregado estaticamente. Eu tive uma aplicação que herdei assim que entrei na empresa, que o cara fazia isso, de tempos em tempos a aplicação estourava, justamente por causa disso.

Não há o porque carregar um arquivo de properties toda hora!!!

Para verificar o máximo de arquivos permitidos abrir no servidor, digite em seu console:
ulimit -a

Abraços

É, parece que é o problema da quantidade de arquivos abertos mesmo…

Mas como já foi dito, não abra o arquivo toda hora, não faz sentido.

É o tomcat passou de 1000 requisições, acabei fazendo todas as configurções que vcs falaram e passei a abrir o arquivo properties e o outro arquivo para guardar as requisições uma única vez, deixando os mesmos em memória.
Mas agora quando o tomcat chega a 1600 requisições ele fica lento passsando a processar praticamente uma requisição por segundo ou até mais, teria como aumentar este desempenho ainda mais?
Abaixo segue como ficou o server.xml:

<Connector port="8080"  protocol="org.apache.coyote.http11.Http11NioProtocol"
               connectionTimeout="2000" maxThreads="10000" acceptCount="5000"
               acceptorThreadCount="2" redirectPort="8443" socket.directBuffer="false"/>

Verifique a memória, quanto está disponivel pra ele?

O mínimo é 256 e o máximo é 1Gb.

Amigo,

Você colocou 10 Mil Threads!
Não faça isso.
Quando se utiliza NIO basta ele não utiliza uma thread por requisição.
10000 Threads é MUITO! Deve tar mais atrapalhando do que ajudando.

Utilize o lamba probe.
Vai te ajudar a verificar o seu problema.