jvm调优

响应时间=网络传输时间+服务器响应时间+网络传输时间+前端渲染时间

TPS:是指每秒通过事务数,直接反应系统性能的指标,该值越大时,系统性能会比较好,当然每个系统都会有它的上线

每秒点击数:每秒点击数代表用户每秒向WEB服务器提交的HTTP请求书。

吞吐量:单位时间内系统处理的请求数。

资源利用率:cpu:系统CPU 用户CPU

Load Average:指一段时间内cpu正在处理和等待cpu处理的任务,也就是cpu使用队列的长度的统计信息

Memroy:短时间内可用内存越来越少,不代表一定有内存泄露或溢出。

IO:与磁盘的交互,重点关注交互频率,磁盘队列长度。

并发测试:并发数=pv/pv Time * 页面链接次数 * HTTP响应时间 * 因数 /web 服务器数量。


Tomcat 与 JVM优化


 <!--

tomcat/conf/server.xml  

系统日志:现在日志分析是越来越重要的性能测试需求获取手段,大型公司越来越多重视日志分析,数据挖掘中,很重要的一点是对日志进行分析,然后分析用户使用行为,通过日志分析,可以帮助性能测试人员快速获取系统性能参数,如并发量,响应时间,业务分部情况等,日志分析也能用于测试人员进行性能预警和容量规划工作,一般的WEB Server 有两部分日志:一是运行 中日志,它主要纪录的一些信息,尤其是一些异常错误日志信息;二是访问日志信息,他记录访问的时间、ip地址、访问的资料等相关信息。为了获取系统性能测试的需求,可以分析WEB Server的访问日志以了解更多真实负载和主要的业务场景,将下面的日志打开,去掉注释即可,其中directory试生产目录,tomcat的安装目录catalina作为当前目录,pattern表示日志生产的格式,common是tomcat提供的一个标准设置格式,期具体表达式%h %l %u %t %r %s %b 

-->

   

     <!--

        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"  

               prefix="localhost_access_log." suffix=".txt" pattern="common" resolveHosts="false"/>

        -->


Tomcat的运行是基于JAVA的虚拟机。SUN的JVM动态库有client和Server两个版本,分别对桌面应用和服务器应用做了相应的优化,client版本加载速度比较快,server版本加载速度比较慢但运行起来比较快。

在命令行输入java -version 可以看到jvm目前配置的那个版本。如果要修改jvm的版本可更改默认java.exe调用的jvm.dll,这个由jvm.cfg决定。编辑%JAVA_HOME%jre/leb/i386/jvm.cfg文件,里面第一行写的是-client(默认就是client版本),把第二行的-server KNOWN放到第一行,重启tomcat,命令java -version.

表明Tomcat修改使用Server版本的jvm,读者可进行比对测试,对比一下client版本的JVM和Server版本性能差异,从而决定采用哪个版本的JVM。


tomcat与内存泄露

tomcat默认内存可以使用的内存为128MB(不同的版本有所区别),在较大型的应用项目中,这点内存是不够的,需要调大,否则很容易出现"out of memery"的问题。

在Linux下,修改配置文件{tomcat_home}/bin/catalina.sh , 增加如下设置。

JAVA_OPTS='-Xms【初始化内存大小】 -Xmx【可以使用内存大小】'

需要根据服务器可用的内存把这

另外,对于SUN的JVM,MaxpermSize 参数的调整比较重要。PermSize的大小决定了保持对象(类、方法)的大小,如果碰到"OutOfMemoryError:PermGen"的错误提示,应该考虑到调整这个参数的大小,SUM JVM默认保留64MB作为PermSize大小


maxThreads:链接线程数监控与调整

可以通过修改Tomcat安装目录的conf文件夹中的配置文件server.xml文件来调整tomcat最大链接线程数。maxThreads是最大并发线程数,如果同时的并发请求量超过这个值,tomcat也不会再增加线程,这是并发请求进入队列,增加maxThreads的值可以加大tomcat的并发处理能力,但是设置过高的maxThreads值也会对性能带来影响,占用过多的系统资源,甚至造成tomcat崩溃。

当maxThreads设置比较小时,tomcat处理请求的速度有所下降,同时也需要设置最大并发请求数

**一般web服务器允许的最大链接数还受限制于操作系统内核参数设置,通常linux是1000个左右,在centos中可以用一下命令查看Socket最大连接数:  ulimit -a 

其中的open files是允许打开的最大文件数,centos默认是1024

修改vi /etc/security/limits.conf  配置文件 ,将文件数设置为32768,在配置文件中添加:

* soft nofile 32768

* hard nofile 32768

重启系统

acceptCount:最大排队的设置

acceptCount是指当所有线程都已经被用于处理请求时,允许多少新的连接请求进入排队队列等候处理,当队列满时,任何新的请求都将被拒绝,默认设置为1000

<Connector port="8080" protocol="HTTP/1.1" 

               connectionTimeout="20000" 

  acceptCount="2000"

  maxThreads="800"

               redirectPort="8443" URIEncoding="UTF-8"/>

应用代码性能诊断分析

1、内存泄露诊断分析

程序代码中,与内存有关的问题可以分为两大类:内存访问错误和内存使用错误

内存访问错误包含读内存错误和写内存错误,读内存错误可能让程序模块返回意想不到的结果,从而导致后续的程序模块运行异常。

内存使用错误主要指程序模块申请的内存没有正确释放,系统可用内存逐渐减少,是程序运行逐渐减慢,直至停止。

2、代码书写问题导致内存泄露

一般我们常说内存泄露指的是堆内存的泄露,堆内存是指程序从堆中分配的,大小任意的(内存块的大小可以再程序运行期决定)使用完后必须显示释放的内存。

一般使用:malloc , calloc ,realloc , new ,等函数从堆中分配到一块内存,使用完后,城西南 必须负责相应的调用free和delete释放内存块,否则,这块内存就不能被内存再次使用,我们就说这块内存泄露了。

造成内存泄露的原因很多,最常见的有以下几种。

分配完内存忘记回收,

程序写法有问题,造成没有办法回收

某些API函数的使用不正确,造成内存泄露

没有及时释放

JVM内存泄露诊断分析--JVM原理与监控

PermGen是JVM自用的区域,是内存的永久保护区,用于存放反射代理和Class,在Class被装载时会被放到PermGen中

JVM启动参数介绍

JVM启动时允许加载指定的参数,如果参数指定不恰当,可能会对JVM性能造成较大的影响

Xmn:Eden Generation的Heap大小,一般设置为Xmx的1/3 或 1/4

Xmx:设置JVM Heap大小最大值,这里的heap= NEW Generation+Old Generation,但不包括PermGen。

Xms:设置JVM Heap大小初始值

XX:NewRatio :New/Old 的大小比率

XX:NewSize : New Generation Heap的大小

XX:MaxNewSize :可以通过NewRatio 和 -Xmx计算得到

XX:SurvivorRatio : Eden/Survivor Space大小比率

XX:PermSize : PermGen的初始值

XX:MaxpermSize: PermGen最大值

Xss:设置每个线程的Stack大小

XX:+UseParNewGc:表示多CPU下缩短Minor Gc的时间

XX:+UseParallelGc :设置后可以使用并行清除收集器(多CPU)

XX:+ParallelGcThreads:可用来增加并行度(多CPU)

XX:+AggressiveOpts :是否允许激活最近的实验性性能调整

XX:-Xnoclassgc:是否允许类垃圾收集,默认设置时允许类GC


Servlet 常见性能问题分析与优化

Servlet是J2EE架构中重要的组成部分,Servlet可以生成动态的WEB页面,它是客户端请求(web浏览器或其他HTTP客户端程序)与服务器响应(HTTP服务器上的数据库或应用程序)的中间层

Servlet压缩输出

http压缩可以大大提高浏览器的速度,它的原理是:在客户端请求网页后,从服务器端将网页文件压缩,再下载到客户端,由客户端的浏览器负载压缩后在解析呈现,HTTP压缩大概可以节省40%左右的流量。

public void doGet(HttpServletRequest request ,HttpServletResponse response) throws IOException , ServletException{

String  c = request.getParameter("c");

if("c".equals(c)){

response.setHeader("Content-Encoding","gzip");

compressionResponse cResponse = new CompressionResponse(response);

response.setContentTyPe("text/plain");

final OutputStream out =  cResponse.getOutputStream();

for(int i=0;i<1000;i++){

out.write(UUID.randomUUID().toString().getBytes());

out.flush();

}

out.close();

}

else{

response.setContentTyPe("text/plain");

PrintWriter out = response.getWrite();

for(int i=0;i<1000;i++){

out.print(UUID.randomUUID().toString().getBytes());

out.flush();

}

out.close();

}

}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章