性能瓶颈分析___JVM
jvisualVM远程连接监控tomcat
- 此工具在jdk的bin目录下
- 在要监控的服务器的Tomcat的bin目录下的catalina.sh中加入以下内容
- 如果应用在容器中增加Dcom.sun.management.jmxremote.rmi
#插入位置,在#————————Execute The Requested Command ——————————#之后
CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=8999 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.hostname=服务器IP"
- 重启Tomcat
- 命令行:losf -i:8999检查端口是否被监听
- 在JvisualVM中添加服务器IP-Ramete-add
用JvisualVM能监控哪些层东西
jmc监控Tomcat
- 此工具在jdk的bin目录下
- 在要监控的服务器的Tomcat的bin目录下的catalina.sh中加入以下内容
- 如果应用在容器中增加Dcom.sun.management.jmxremote.rmi
#插入位置,在#————————Execute The Requested Command ——————————#之后
CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=8999 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.hostname=服务器IP"
- 重启Tomcat
- 命令行:losf -i:8999检查端口是否被监听
- 在file-connect中添加服务器
Tomcat的性能参数
- 在tomcat/conf中的server.xml中
参数 |
说明 |
connectionTimeout |
网络连接超时,单位:毫秒。设置为0表示永不超时,通常可设置为30000毫秒。 |
keepAliveTimeout |
长连接最大保持时间(毫秒)。此处为15秒。 |
maxKeepAliveRequests |
最大长连接个数,1表示不限制个数,默认100个。⼀般设置在100~200之间 |
maxHttpHeaderSize http |
HTTP请求头信息的最大程度,超过此长度的部分不予处理。一般8K。 |
URIEncoding |
指定Tomcat容器的URL编码格式。 |
acceptCount |
指定当所有可以使用的处理请求的线程数都被使⽤时,可以放到处理队列中的请求数,超过这个数的请求将不予处理,默认为10个。 如果设的较小,可以保证接受的请求较快相应,但是超出的请求可能就直接被拒绝,如果设的较大,可能就会出现大量的请求超时的情况,因为我们系统的处理能力是一定的。 |
disableUploadTimeout |
上传时是否使用超时机制 |
enableLookups |
是否反查域名,取值为:true或false。为了提高处理能力,应设置为false |
bufferSize |
缓冲值,输入流在connector创建时定义的值大小。默认值是 2048 bytes。 |
maxSpareThreads |
最大空闲连接数,一旦创建的线程超过这个值,Tomcat就会关闭不再需要的socket线程。默认值为 50。 |
maxThreads |
最大连接数,Tomcat使⽤线程来处理接收的每个请求。这个值表示Tomcat可创建的最⼤的线程数。默认值 200。 |
minSpareThreads |
最小空闲线程数,Tomcat初始化时创建的线程数,默认值为4。 |
- 重要参数maxThreads、maxSpareThreads 、minSpareThreads
分析是否这些参数影响的TPS无法提高
- 增加压力,查看服务器CPU、内存是否没有达到瓶颈,如果没有占用很多说明不是CPU和内存的问题
- 使用jvisualVM查看服务器server.xml启动线程是否达到了maxThreads,如果没有达到最大线程数,说明不是线程数配置错误的问题
- 看JDK的堆是否健康,如果已达到最大给的堆容量,设置堆大小
- 使用jvisualVM-Sampler查看self Time,Total Time来查看服务器处理线程时间的分布
- 当self Time为0时,那么说明本身代码没问题,问题出在了Toatl Time
- 使用dump功能,打印调用栈,查看具体消耗在哪里,查看其中都调用了哪些其他服务,然后对应去看调用的服务的服务器消耗。找到问题在哪