tomcat 内存溢出_玩转Tomcat监控管理

2188c4bc6c4b3d592c62614e6a2a7185.png

Tomcat Manager

Tomcat Manager是一个Tomcat内置的管理界面, 管理界面随Tomcat的每次安装一起启动,提供包括快速入门指南和相关文档的链接。通过此界面,您可以查看Tomcat指标,并通过JMX代理Servlet查询指标数据。

f8151f55f9ae17e0decff77b8ade2e4a.png

Tomcat Manager角色和权限

虽然管理界面是开箱即用的,但是在没有设置适当的用户和角色之前,您将无法访问。Tomcat提供多个角色访问Tomcat Manager,主要的两个角色是:

  • manager-jmx :提供对JMX代理servlet和Tomcat服务器状态页面的访问

  • manager-gui :授予对Tomcat应用程序管理器的访问权限,您可以在其中运行诊断程序并手动触发垃圾回收

如果需要从管理界面访问Tomcat指标,您需要为用户分配适当的角色。您可以通过更新Tomcat的conf / tomcat-users.xml配置文件来完成此操作:

rolename="manager-gui"/>

rolename="manager-jmx"/>

" roles="manager-jmx,manager-gui"/>

此代码段首先定义了我们要分配给用户的两个角色。然后,它创建一个新的 tomcat-jmx用户,为其分配这些角色,并为用户设置密码。如果您使用全新安装的Tomcat,则需要创建一个新用户; 否则,您可以将角色分配给现有用户。

Tomcat Manager的Web界面

默认情况下,可以从 http://localhost:8080本地访问Tomcat Manager,你也可以在Tomcat的服务器配置文件中进行更改。当你访问Web界面前,系统将提示您登录。主要的数据指标如下:

  • 服务器和应用程序状态页面 :显示JVM,连接器和应用程序指标的高级概述,包括内存使用,线程计数和请求处理时间

  • 应用程序管理器 :提供诊断工具,用于调查应用程序中的内存泄漏

  • JMX代理 :用于查询Tomcat指标的基于文本的界面

Tomcat的服务器状态页面

应用程序和服务器状态的高级视图 ,可以导航到 /manager/status页面或单击主页上的“Server Status”按钮。此页面包含有关Tomcat服务器及其AJP和HTTP连接器的信息,以及JVM的内存使用情况。

ee66ad5fb3480aa2424f496e77deafee.png

每个连接器部分显示有关线程使用情况的信息(例如,最大线程数,当前线程数和当前繁忙线程数)以及请求吞吐量和性能(例如,处理时间,错误计数和接收的字节数),以及每个连接器的信息。

每个线程在处理请求时都会经历一系列阶段:

  • 就绪(Ready):该线程可用于处理请求。

  • 解析和准备请求(Parse and prepare request):该线程正在解析请求头或准备读取请求的主体。

  • 服务(Service):线程正在处理并生成传入请求的响应。

  • 完成(Finishing):线程已完成处理请求并将生成的响应发送回客户端。

  • Keep-Alive:线程保持连接打开,以便同一客户端发送另一个请求。此阶段的最长持续时间由服务器配置文件中设置的 keepAliveTimeout值确定。连接超时后,线程返回就绪阶段。

线程阶段可以帮助您准确地衡量准备接受传入请求的线程数。您还可以在服务器状态页面上的Tomcat应用程序列表中查看每个已部署应用程序的请求计数。

Tomcat应用程序状态页面

如果要查看所有已部署应用程序的状态,您可以导航到 manager/status/all页面。此页面(页面往下拉)列出了所有应用程序,包括Tomcat Manager本身,因此您可以快速查看处理时间,活动会话以及为每个应用程序加载的JSP servlet数量。

61dd984e72dd6d596888de738eeaea09.png

应用程序管理器

要运行诊断程序,您可以在 /manager/html导航到Tomcat的应用程序管理器界面,或者单击Tomcat Manager主页上的“Manager App”按钮。应用程序管理器提供了一个用于快速管理应用程序的简单界面,以及用于排除内存泄漏故障的诊断部分。

f39c5785534e6d4c89f1110d2dbe5c5c.png

“Find leaks”按钮可以对应用程序中的内存泄漏运行诊断检查。当垃圾收集器无法通过删除应用程序不再需要的对象来释放工作内存时,会发生内存泄漏。这会导致应用程序使用更多资源,直到它用完为止,从而产生致命的内存错误甚至内存溢出。请注意,应谨慎使用此诊断检查,因为它会触发垃圾回收,对性能有一定的影响。

这个界面只是简单的访问Tomcat服务器的状态,使您能够快速查看相关数据。后面的章节会有详细的讲解。

查询Tomcat指标

Tomcat Manager可以使用 manager-jmx角色访问JMX代理servlet,该角色允许您从Web浏览器查询。您可以在 http://localhost:8080/manager/jmxproxy找到Tomcat的可用MBean列表(纯文本格式)。

daa999101925fa468b554b7df8ebac4b.png

如果要查询特定MBean的数据,可以按以下格式将参数添加到MBean的域,类型,名称和属性的URL中:

http://localhost:8080/manager/jmxproxy/?get=:type=,name=""&att=

在上述的JMX属性和MBean列中找到这些参数。您可以使用以下命令查看HTTP连接器的最大请求处理时间的数据:

http://localhost:8080/manager/jmxproxy/?get=Catalina:type=GlobalRequestProcessor,name="http-nio-8080"&att=maxTime

这将产生以下结果:

OK - Attribute get 'Catalina:type=GlobalRequestProcessor,name="http-nio-8080"' - maxTime = 189

命令模式使用起来比较复杂并且不直观,同时不能比较多个指标或查看数据随时间的变化情况。为了更深入地了解Tomcat的运行状况和性能,我们需要使用其他工具,如JConsole。

为Tomcat监视工具启用远程JMX连接

在使用JConsole监视Tomcat服务器之前,需要为JMX启用远程连接。JConsole可能会消耗大量系统资源,因此Oracle 建议仅通过连接到远程主机,将JConsole与正在监视的服务器隔离。请注意,启用远程JMX访问需要适当的安全预防措施,因为JMX提供有限制的访问控制。为了演示的方便,我们禁用SSL。

首先,在Tomcat的/ bin目录中创建一个setenv.sh文件,并包含以下内容:

export JAVA_OPTS="${JAVA_OPTS} -Dcom.sun.management.jmxremote" export JAVA_OPTS="${JAVA_OPTS} -Dcom.sun.management.jmxremote.port=" export JAVA_OPTS="${JAVA_OPTS} -Djava.rmi.server.hostname=" export JAVA_OPTS="${JAVA_OPTS} -Dcom.sun.management.jmxremote.ssl=false" export JAVA_OPTS="${JAVA_OPTS} -Dcom.sun.management.jmxremote.authenticate=true" export JAVA_OPTS="${JAVA_OPTS} -Dcom.sun.management.jmxremote.access.file=${CATALINA_BASE}/conf/jmxremote.access export JAVA_OPTS="${JAVA_OPTS} -Dcom.sun.management.jmxremote.password.file=${CATALINA_BASE}/conf/jmxremote.password

这将设置JConsole可用于远程连接到Tomcat服务器的主机名和端口。您可以指定任何主机名和未使用的端口。虽然此示例不包含SSL,但它确实启用了密码验证,并指定了在何处查找访问(用户名)和密码文件; 如果它们尚不存在,您可能需要创建它们。您可以通过编辑$ {CATALINA_BASE} /conf/jmxremote.access文件来添加新用户并为他们提供两种权限之一( readonlyreadwrite ):

tomcatUserRead readonly

tomcatUserWrite readwrite

第一行授予 tomcatUserRead用户 readonly权限,这意味着该用户可以查看MBean属性并接收通知。

第二行 tomcatUserWrite用户提供了 readwrite权限,允许该用户添加和删除MBean,设置属性和运行操作。

接下来,在$ {CATALINA_BASE} /conf/jmxremote.password文件中为这些用户设置密码:

tomcatRead tomcatWrite

保存文件并重新启动Tomcat服务器。接下来,打开JConsole并运行以下命令,确保包含您在setenv.sh文件中定义的主机和端口:

jconsole :

这将打开JConsole界面,您可以在其中开始查看与JVM和Tomcat服务器相关的数据。

使用JConsole

JConsole是JDK附带的图形界面。JConsole提供了一种更直观的方式来监视关键JVM指标,如堆内存使用情况,线程使用情况和CPU使用情况。而不是通过有限的接口(如JMX代理)查询数据,您可以使用JConsole快速查看多个指标的数据,并深入查看Tomcat的Catalina和JVM的java.lang域的特定MBean类型和属性。您可以导航到六个不同的选项卡:概览,内存,线程,类,VM摘要和MBean。每个选项卡都提供一个下拉菜单,使您可以查看作用于不同时间范围的数据,例如最近五分钟,过去一个月或从服务器开始(在下拉列表中显示为“全部”选项)。

概览

JConsole的Overview选项卡显示了与JVM的内存使用情况,线程数,应用程序加载的Java类以及CPU使用率相关的信息,因此您可以一目了然地监视虚拟机的运行状况。

ef75b909e351db2167fc041478a92a0e.png

VM摘要

在“VM摘要”选项卡中,您可以查看有关JVM体系结构及其特征的更多详细信息。如果您需要快速查看系统级属性或JVM配置设置,这将非常有用。这包括您在Tomcat的/bin/setenv.sh配置文件中指定的任何参数。

01eae2f90a0620282ca8d88ed7eb6085.png

内存

在“内存”选项卡下,您可以查看有关虚拟机堆和非堆内存使用情况的更详细统计信息,以及有关内存池的数据。在此选项卡中,您可以单击“执行GC”以运行垃圾回收,就像在Tomcat管理器中一样。

1e3a8277e5e6451bc9f2782e5c02a032.png

如果需要查看与特定内存池相关的数据,可以从“内存”选项卡左上角的“图表”下拉列表中选择该数据。

9feb7e0f38526526f1239ef3874aaec4.png

线程

JConsole的“线程”选项卡提供有关可用JVM线程的更多详细信息以及对死锁线程的检查。“线程”列表显示线程名称,状态(类似于您在Tomcat的服务器状态页面上看到的线程“阶段”),以及每个可用线程的堆栈跟踪。死锁检查对于查找可能导致应用程序挂起的线程非常有用。如果找到任何死锁线程,您将看到一个新的死锁选项卡,其中包含有关导致死锁的更多信息。

924c88284a177a53024b90926973fc2b.png

MBean

要查看与您正在监视的Tomcat指标相关的实时数据,您可以在MBeans选项卡下查看Catalinajava.lang域,并深入查看特定属性。与Tomcat Manager一样,JConsole从MBean服务器收集数据,但提供了一个更简单的界面来查找所需的指标。

c97526a5916640d93e60cd5b5546347a.png

JConsole提供了JVM和MBean数据的完美摘要,它使您能够绘制JVM数据图形,以可视化资源使用趋势。

自定义Tomcat访问和服务器日志

默认情况下,Tomcat访问日志使用公共日志格式 ,并记录服务器处理的所有请求。您可以在Tomcat的conf / server.xml配置文件中查看访问日志中包含的内容:

className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log" suffix=".txt" pattern="%h %l %u %t "%r" %s %b" />

Valve元素的 pattern属性指定应包含在每个日志条目中的每个请求(及其响应)的信息:

  • 发出请求的客户端的主机名或IP地址( %h )

  • 来自identd服务的用户名(总是返回' - ')( %l )

  • 经过身份验证的用户名(返回 -如果未使用)( %u )

  • 请求的日期和时间( %t )

  • 请求方法和URI( %r )

  • 响应的HTTP状态代码( %s )

  • 返回给客户端的对象大小,以字节为单位( %b )

上面示例中使用的模式将按以下格式记录请求:

192.168.33.1 - - [21/Sep/2018:16:51:59 +0000] "GET /sample/ HTTP/1.1" 403 1145

Tomcat默认也会生成服务器日志,并使用java.util.logging 包来实现 。服务器日志显示与Tomcat JVM和Catalina服务器相关的信息,包括内存不足(OOM)错误和部署活动,如下例所示:

16-Oct-2018 18:37:08.624 INFO [main] org.apache.catalina.core.StandardService.startInternal Starting service [Catalina] 16-Oct-2018 18:37:08.625 INFO [main] org.apache.catalina.core.StandardEngine.startInternal Starting Servlet Engine: Apache Tomcat/9.0.10 16-Oct-2018 18:37:08.629 SEVERE [main] org.apache.catalina.startup.HostConfig.beforeStart Unable to create directory for deployment: [/opt/tomcat/conf/Catalina/localhost] 16-Oct-2018 18:37:08.672 INFO [main] org.apache.catalina.startup.HostConfig.deployWAR Deploying web application archive [/opt/tomcat/webapps/sample.war] 16-Oct-2018 18:37:09.341 INFO [main] org.apache.catalina.startup.HostConfig.deployWAR Deployment of web application archive [/opt/tomcat/webapps/sample.war] has finished in [667] ms

Tomcat将服务器日志写入控制台和Catalina日志文件(例如, catalina.2018-07-03.log)。您可以自定义Tomcat应记录的信息类型,例如Tomcat日志记录属性文件( conf / logging.properties )中的最小日志级别,输出目录和输出格式。

处理程序是处理传入日志消息并格式化其输出的Java组件,使用格式化程序记录到文件( FileHandler )或控制台( ConsoleHandler )。Tomcat的日志记录属性文件包括Catalina服务器,Tomcat Manager和已部署的Web应用程序日志的配置:

############################################################ # Handler specific properties. # Describes specific configuration info for Handlers. ############################################################ 1catalina.org.apache.juli.FileHandler.level = FINE 1catalina.org.apache.juli.FileHandler.directory = ${catalina.base}/logs 1catalina.org.apache.juli.FileHandler.prefix = catalina. 2localhost.org.apache.juli.FileHandler.level = FINE 2localhost.org.apache.juli.FileHandler.directory = ${catalina.base}/logs 2localhost.org.apache.juli.FileHandler.prefix = localhost. 3manager.org.apache.juli.FileHandler.level = FINE 3manager.org.apache.juli.FileHandler.directory = ${catalina.base}/logs 3manager.org.apache.juli.FileHandler.prefix = manager. 3manager.org.apache.juli.FileHandler.bufferSize = 16384 java.util.logging.ConsoleHandler.level = FINE java.util.logging.ConsoleHandler.formatter = org.apache.juli.OneLineFormatter ############################################################ # Facility specific properties. # Provides extra control for each logger. ############################################################ org.apache.catalina.core.ContainerBase.[Catalina].[localhost].level = INFO org.apache.catalina.core.ContainerBase.[Catalina].[localhost].handlers = \ 2localhost.org.apache.juli.FileHandler org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/manager].level = INFO org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/manager].handlers = \ 3manager.org.apache.juli.FileHandler

默认情况下,Tomcat为其处理程序( FINE )和工具( INFO )设置两个不同的日志级别。FINE日志级别包括有关服务器活动的详细信息, INFO级别记录更高级别的信息性消息。处理程序属性整体管理Tomcat日志,而工具属性使您可以管理每个已部署应用程序的配置,包括Tomcat Manager。例如,要调整Tomcat Manager的日志级别,可以编辑以下处理程序和工具属性:

3manager.org.apache.juli.FileHandler.level = FINE 3manager.org.apache.juli.FileHandler.directory = ${catalina.

总结

通过设置一些简单权限,您可以立即开始使用Tomcat Manager查看Tomcat和JVM数据。一旦为JMX启用了远程连接,就可以使用JConsole等工具通过简单的图形界面监控Tomcat数据。Tomcat还在其访问和服务器日志中提供有关请求和服务器活动的基本诊断信息。

推荐阅读:

filter、interceptor、aspect不知如何选择

Redis 下购物车设计实战

Lambda表达式入门(下篇)

1ab4721bd82b7b3bbb442ebfba451dce.png

就知道你 “在看”91821b2063ba3d6ed0423681c44e85cc.gif

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值