【发布时间】:2019-02-22 06:37:33
【问题描述】:
我正在使用 Tomcat 8.5 来托管用于 java REST 服务的 WAR。
在我的休息服务中,我创建一个连接并从用户那里获取一个多部分表单数据文件,使用扫描引擎对其进行扫描并返回结果。一开始,tomcat 运行良好,速度接近 57-58 Mbps,但随着时间的推移会下降(在 5-8 分钟内下降到近一半)
我的setenv.bat 文件如下所示。
"set "JAVA_OPTS=%JAVA_OPTS% -Xms1024m -Xmx5120m -XX:MaxMetaspaceSize=512m -Xincgc -server""
JVM 正在使用ParNewGC 进行垃圾回收。
我的server.xml 文件如下所示
<Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
maxThreads="100" minSpareThreads="8" maxSpareThreads="10" acceptorThreadCount="16" acceptCount="500"/>
<!--acceptCount :The maximum queue length for incoming connection requests when all possible request processing threads are in use. Any requests received when the queue is full will be refused. The default value is 100.
A "Connector" represents an endpoint by which requests are received
and responses are returned. Documentation at :
Java HTTP Connector: /docs/config/http.html
Java AJP Connector: /docs/config/ajp.html
APR (HTTP/AJP) Connector: /docs/apr.html
Define a non-SSL/TLS HTTP/1.1 Connector on port 8080
-->
<Connector executor="tomcatThreadPool" port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" socket.rxBufSize="10000000" socket.txBufSize="3000000" socket.directBuffer="true" />
<!-- A "Connector" using the shared thread pool-->
因为我的反应是完全动态的。我没有使用任何类型的缓存。请帮我解决这个问题。
【问题讨论】:
-
了解正在发生的事情的唯一方法是使用分析器并跟踪内存消耗以及线程活动。
-
谢谢你的建议,你能告诉我我该怎么做吗?我正在监控 CPU 消耗并看到 CPU 不足,因为性能开始下降。
-
例如。使用 JProfiler 并连接到您的实时 JVM。然后,您将获得几个选项卡/视图。一个是 CPU 活动,另一个是线程活动。这有助于了解发生了什么、谁使用了资源以及最终导致线程之间出现饥饿的锁。
-
我做到了,先生。发生的事情是我的大多数线程都由 I/o 控制,这减少了可运行的线程,从而导致性能下降。你能提出任何解决方案吗??
-
不确定您的意思。有多少线程处于活动状态?共享的资源是什么?锁是如何管理的?活动线程的数量是否随时间增长?你释放所有资源(流、连接等)
标签: java rest tomcat file-upload tomcat8