Archive for the "数据库" Category

26
Aug

作者:邹建
原文转自:http://topic.csdn.net/t/20030725/20/2072910.html

–数据测试:

–创建数据测试环境
declare   @TableA   table(id   int,in1   varchar(5),out1   varchar(5))
insert   into   @tablea(id,in1,out1)
select   1,’08:00′,’12:00′
union   all   select   2,’08:00′,’12:00′
union   all   select   3,’08:00′,’12:00′
union   all   select   4,’08:00′,’12:00′
union   all   select   5,’08:00′,’12:00′

–更新表
update   @tablea   set
in1=left(in1,3)+right(100+cast(floor(rand(id)*100000)   as   int)   %   60,2)
,out1=left(out1,3)+right(100+cast(floor(rand(id)*100000)   as   int)   %   60,2)

–显示结果
select   *   from   @tablea

–测试的数据结果
id                     in1       out1
———–   —–   —–
1                       08:19   12:19
2                       08:21   12:21
3                       08:22   12:22
4                       08:24   12:24
5                       08:26   12:26

26
Jun

http://topic.csdn.net/u/20070716/17/e575aa41-424e-406a-8ce0-f82c28c4ce11.html

26
Jun

Tomcat性能调整

Author: 比比巴儿

 http://tech.163.com/05/0711/10/1OCH7J2000091589.html

一. 引言

性能测试与分析是软件开发过程中介于架构和调整的一个广泛并比较不容易理解的领域,更是一项较为复杂的活动。就像下棋游戏一样,有效的性能测试和分析只能在一个良好的计划策略和具备了对不可预料事件的处理能力的条件下顺利地完成。一个下棋高手赢得比赛靠的不仅仅是对游戏规则的认识,更是靠他的自己的能力和不断地专注于分析自己对手的实力来更加有效地利用和发挥规则的作用。同样一个优秀的性能测试和分析人员将要面对的是来自一个全新的应用程序和环境下带来的整个项目的挑战。本文中作者结合自己的使用经验和参考文档,对Tomcat性能方面的调整做一简要的介绍,并给出Tomcat性能的测试、分析和调整优化的一些方法。

二. 测量Web服务器的性能

测量web服务器的性能是一项让人感到畏缩的任务,但是我们在这里将给出一些需要注意的地方并且指点你了解其中更多的细节性的内容。它不像一些简单的任务,如测量CPU的速率或者是测量程序占用CPU的比例,web服务器的性能优化中包括许调整许多变量来达到目标。许多的测量策略中都包含了一个看似简单的浏览实际上是在向服务器发送大量的请求,我们称之为客户端的程序,来测量响应时间。客户端和服务器端是在同一台机器上吗?服务器在测试的时候还运行着其它的什么程序吗?客户端和服务器端的通讯是通过局域网,100baseT,10baseT还是使用调制解调器?客户端是否一直重复请求相同的页面,还是随机地访问不同的页面?(这些影响到了服务缓存的性能)客户端发送请求的有规律的还是突发的?你是在最终的配置环境下运行服务的还是在调试的配置环境下运行服务的?客户端请求中包含图片还是只有HTML页面?是否有请求是通过servlets和JSP的,CGI程序,服务端包含(Server-Side Includes ,SSI是一个可以让你使用动态HTML文件的技术)?所有这些都将是我们要关心的,并且几乎我们不可能精确地把所有的问题都清楚地列出来。

1.压力测试工具

“工欲善其事,必先利其器”,压力测试只有借助于一些工具才可得以实施。

大多数web压力测试工具的实现原理都是通过重复的大量的页面请求来模拟多用户对被测系统的并发访问,以此达到产生压力的目的。产生压力的手段都是通过录制或者是编写压力脚本,这些脚本以多个进程或者线程的形式在客户端运行,这样通过人为制造各种类型的压力,我们可以观察被测系统在各种压力状况下的表现,从而定位系统瓶颈,作为系统调优的基础。目前已经存在的性能测试工具林林总总,数量不下一百种,从单一的开放源码的免费小工具如 Aapache 自带的 web 性能测试工具 Apache Benchmark、开源的Jmeter 到大而全的商业性能测试软件如 Mercury 的 LoadRunner 等等。任何性能测试工具都有其优缺点,我们可以根据实际情况挑选用最合适的工具。您可以在这里找到一些web压力测试工具http://www.softwareqatest.com/qatweb1.html#LOAD

这里我们所使用的工具要支持web应用服务认证才可以,要支持接收发送cookies,不仅如此Tomcat支持多种认证方式,比如基本认证、基于表单的认证、相互认证和客户端认证,而一些工具仅仅支持HTTP基本认证。真实地模拟用户认证是性能测试工具的一个重要的部分,因为认证机制将对一个web站点的性能特征产生重要的影响。基于你在产品中使用的不同的认证方式,你需要从上面的工具列表中选择使用这种特性的测试工具。

Apache Benchmark和http_load是命令行形式的工具,非常易于使用。Apache Benchmark可以模仿单独的URL请求并且重复地执行,可以使用不同的命令行参数来控制执行迭代的次数,并发用户数等等。它的一个特点是可以周期性地打印出处理过程的信息,而其它工具只能给出一个全局的报告。

2.压力测试工具介绍

三. 外部环境的调整

  在Tomcat和应用程序进行了压力测试后,如果您对应用程序的性能结果不太满意,就可以采取一些性能调整措施了,当然了前提是应用程序没有问题,我们这里只讲Tomcat的调整。由于Tomcat的运行依赖于JVM,所以在这里我们把Tomcat的调整可以分为两类来详细描述:

外部环境调整

调整非Tomcat组件,例如Tomcat运行的操作系统和运行Tomcat的java虚拟机。

自身调整

修改Tomcat自身的参数,调整Tomcat配置文件中的参数。

下面我们将详细讲解外部环境调整的有关内容,Tomcat自身调整的内容将在第2部分中阐述。

1.JAVA虚拟机性能优化

Tomcat本身不能直接在计算机上运行,需要依赖于硬件基础之上的操作系统和一个java虚拟机。您可以选择自己的需要选择不同的操作系统和对应的JDK的版本(只要是符合Sun发布的Java规范的),但我们推荐您使用Sun公司发布的JDK。确保您所使用的版本是最新的,因为Sun公司和其它一些公司一直在为提高性能而对java虚拟机做一些升级改进。一些报告显示JDK1.4在性能上比JDK1.3提高了将近10%到20%。

可以给Java虚拟机设置使用的内存,但是如果你的选择不对的话,虚拟机不会补偿。可通过命令行的方式改变虚拟机使用内存的大小。如下表所示有两个参数用来设置虚拟机使用内存的大小。

参数

描述

-Xms<size>

JVM初始化堆的大小

-Xmx<size>

JVM堆的最大值

这两个值的大小一般根据需要进行设置。初始化堆的大小执行了虚拟机在启动时向系统申请的内存的大小。一般而言,这个参数不重要。但是有的应用程序在大负载的情况下会急剧地占用更多的内存,此时这个参数就是显得非常重要,如果虚拟机启动时设置使用的内存比较小而在这种情况下有许多对象进行初始化,虚拟机就必须重复地增加内存来满足使用。由于这种原因,我们一般把-Xms和-Xmx设为一样大,而堆的最大值受限于系统使用的物理内存。一般使用数据量较大的应用程序会使用持久对象,内存使用有可能迅速地增长。当应用程序需要的内存超出堆的最大值时虚拟机就会提示内存溢出,并且导致应用服务崩溃。因此一般建议堆的最大值设置为可用内存的最大值的80%。

Tomcat默认可以使用的内存为128MB,在较大型的应用项目中,这点内存是不够的,需要调大。

Windows下,在文件{tomcat_home}/bin/catalina.bat,Unix下,在文件{tomcat_home}/bin/catalina.sh的前面,增加如下设置:

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

需要把这个两个参数值调大。例如:

JAVA_OPTS=’-Xms256m -Xmx512m’

表示初始化内存为256MB,可以使用的最大内存为512MB。

另外需要考虑的是Java提供的垃圾回收机制。虚拟机的堆大小决定了虚拟机花费在收集垃圾上的时间和频度。收集垃圾可以接受的速度与应用有关,应该通过分析实际的垃圾收集的时间和频率来调整。如果堆的大小很大,那么完全垃圾收集就会很慢,但是频度会降低。如果你把堆的大小和内存的需要一致,完全收集就很快,但是会更加频繁。调整堆大小的的目的是最小化垃圾收集的时间,以在特定的时间内最大化处理客户的请求。在基准测试的时候,为保证最好的性能,要把堆的大小设大,保证垃圾收集不在整个基准测试的过程中出现。

如果系统花费很多的时间收集垃圾,请减小堆大小。一次完全的垃圾收集应该不超过 3-5 秒。如果垃圾收集成为瓶颈,那么需要指定代的大小,检查垃圾收集的详细输出,研究 垃圾收集参数对性能的影响。一般说来,你应该使用物理内存的 80% 作为堆大小。当增加处理器时,记得增加内存,因为分配可以并行进行,而垃圾收集不是并行的。

 2.操作系统性能优化

这里说的操作系统是指运行web服务器的系统软件,当然,不同的操作系统是为不同的目的而设计的。比如OpenBSD是面向安全的,因此在它的内核中有许多的限制来防止不同形式的服务攻击(OpenBSD的一句座右铭是“默认是最安全的”)。这些限制或许更多地用来运行活跃的web服务器。

而我们常用的Linux操作系统的目标是易用使用,因此它有着更高的限制。使用BSD内核的系统都带有一个名为“Generic”的内核,表明所有的驱动器都静态地与之相连。这样就使系统易于使用,但是如果你要创建一个自定义的内核来加强其中某些限制,那就需要排除不需要的设备。Linux内核中的许多驱动都是动态地加载的。但是换而言之,内存现在变得越来越便宜,所以因为加载额外的设备驱动就显得不是很重要的。重要的是要有更多的内存,并且在服务器上腾出更多的可用内存。

小提示:虽然现在内存已经相当的便宜,但还是尽量不要购买便宜的内存。那些有牌子的内存虽然是贵一点,但是从可靠性上来说,性价比会更高一些。

如果是在Windows操作系统上使用Tomcat,那么最好选择服务器版本。因为在非服务器版本上,最终用户授权数或者操作系统本身所能承受的用户数、可用的网络连接数或其它方面的一些方面都是有限制的。并且基于安全性的考虑,必须经常给操作系统打上最新的补丁。

3.Tomcat与其它web服务器整合使用

虽然tomcat也可以作web服务器,但其处理静态html的速度比不上apache,且其作为web服务器的功能远不如apache,因此我们想把apache和tomcat集成起来,将html与jsp的功能部分进行明确分工,让tomcat只处理jsp部分,其它的由apache,IIS等这些web服务器处理,由此大大节省了tomcat有限的工作“线程”。

4.负载均衡

在负载均衡的思路下,多台服务器为对称方式,每台服务器都具有同等的地位,可以单独对外提供服务而无须其他服务器的辅助。通过负载分担技术,将外部发送来的请求按一定规则分配到对称结构中的某一台服务器上,而接收到请求的服务器都独立回应客户机的请求。

提供服务的一组服务器组成了一个应用服务器集群(cluster),并对外提供一个统一的地址。当一个服务请求被发至该集群时,根据一定规则选择一台服务器,并将服务转定向给该服务器承担,即将负载进行均衡分摊。

通过应用负载均衡技术,使应用服务超过了一台服务器只能为有限用户提供服务的限制,可以利用多台服务器同时为大量用户提供服务。当某台服务器出现故障时,负载均衡服务器会自动进行检测并停止将服务请求分发至该服务器,而由其他工作正常的服务器继续提供服务,从而保证了服务的可靠性。

负载均衡实现的方式大概有四种:第一是通过DNS,但只能实现简单的轮流分配,不能处理故障,第二如果是基于MS IIS,Windows 2003 server本身就带了负载均衡服务,第三是硬件方式,通过交换机的功能或专门的负载均衡设备可以实现,第四种是软件方式,通过一台负载均衡服务器进行,上面安装软件。使用Apache Httpd Server做负载平衡器,Tomcat集群节点使用Tomcat就可以做到以上第四种方式。这种方式比较灵活,成本相对也较低。另外一个很大的优点就是可以根据应用的情况和服务器的情况采取一些策略。

四. 自身调整

  本节将向您详细介绍一些加速可使Tomcat实例加速运行的技巧和方法,无论是在什么操作系统或者何种Java虚拟机上。在有些情况下,您可能没有控制部署环境上的操作系统或者Java虚拟机。在这种情况下,您就需要逐行了解以下的的一些建议,然而你应该在修改后使之生效。我认为以下方法是Tomcat性能自身调整的最佳方式。

1.禁用DNS查询

当web应用程序向要记录客户端的信息时,它也会记录客户端的IP地址或者通过域名服务器查找机器名转换为IP地址。DNS查询需要占用网络,并且包括可能从很多很远的服务器或者不起作用的服务器上去获取对应的IP的过程,这样会消耗一定的时间。为了消除DNS查询对性能的影响我们可以关闭DNS查询,方式是修改server.xml文件中的enableLookups参数值:

Tomcat4

<Connector className=”org.apache.coyote.tomcat4.CoyoteConnector” port=”80″ minProcessors=”5″ maxProcessors=”75″ enableLookups=”false” redirectPort=”8443″ acceptCount=”100″ debug=”0″ connectionTimeout=”20000″ useURIValidationHack=”false” disableUploadTimeout=”true” />

Tomcat5

<Connector port=”80″ maxThreads=”150″ minSpareThreads=”25″ maxSpareThreads=”75″ enableLookups=”false” redirectPort=”8443″ acceptCount=”100″ debug=”0″ connectionTimeout=”20000″ disableUploadTimeout=”true”/>
除非你需要连接到站点的每个HTTP客户端的机器名,否则我们建议在生产环境上关闭DNS查询功能。可以通过Tomcat以外的方式来获取机器名。这样不仅节省了网络带宽、查询时间和内存,而且更小的流量会使日志数据也会变得更少,显而易见也节省了硬盘空间。对流量较小的站点来说禁用DNS查询可能没有大流量站点的效果明显,但是此举仍不失为一良策。谁又见到一个低流量的网站一夜之间就流量大增呢?

2.调整线程数

另外一个可通过应用程序的连接器(Connector)进行性能控制的的参数是创建的处理请求的线程数。Tomcat使用线程池加速响应速度来处理请求。在Java中线程是程序运行时的路径,是在一个程序中与其它控制线程无关的、能够独立运行的代码段。它们共享相同的地址空间。多线程帮助程序员写出CPU最大利用率的高效程序,使空闲时间保持最低,从而接受更多的请求。

Tomcat4中可以通过修改minProcessors和maxProcessors的值来控制线程数。这些值在安装后就已经设定为默认值并且是足够使用的,但是随着站点的扩容而改大这些值。minProcessors服务器启动时创建的处理请求的线程数应该足够处理一个小量的负载。也就是说,如果一天内每秒仅发生5次单击事件,并且每个请求任务处理需要1秒钟,那么预先设置线程数为5就足够了。但在你的站点访问量较大时就需要设置更大的线程数,指定为参数maxProcessors的值。maxProcessors的值也是有上限的,应防止流量不可控制(或者恶意的服务攻击),从而导致超出了虚拟机使用内存的大小。如果要加大并发连接数,应同时加大这两个参数。web server允许的最大连接数还受制于操作系统的内核参数设置,通常Windows是2000个左右,Linux是1000个左右。

在Tomcat5对这些参数进行了调整,请看下表:

属性名

描述

maxThreads

Tomcat使用线程来处理接收的每个请求。这个值表示Tomcat可创建的最大的线程数。

acceptCount

指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理。

connnectionTimeout

网络连接超时,单位:毫秒。设置为0表示永不超时,这样设置有隐患的。通常可设置为30000毫秒。

minSpareThreads

Tomcat初始化时创建的线程数。

maxSpareThreads

一旦创建的线程超过这个值,Tomcat就会关闭不再需要的socket线程。

最好的方式是多设置几次并且进行测试,观察响应时间和内存使用情况。在不同的机器、操作系统或虚拟机组合的情况下可能会不同,而且并不是所有人的web站点的流量都是一样的,因此没有一刀切的方案来确定线程数的值。

3.加速JSP编译速度

当第一次访问一个JSP文件时,它会被转换为Java serverlet源码,接着被编译成Java字节码。你可以控制使用哪个编译器,默认情况下,Tomcat使用使用命令行javac进行使用的编译器。也可以使用更快的编译器,但是这里我们将介绍如何优化它们。

另外一种方法是不要把所有的实现都使用JSP页面,而是使用一些不同的java模板引擎变量。显然这是一个跨越很大的决定,但是事实证明至少这种方法是只得研究的。如果你想了解更多有关在Tomcat可使用的模板语言,你可以参考Jason Hunter和William Crawford合著的《Java Servlet Programming 》一书(O’Reilly公司出版)。

在Tomcat 4.0中可以使用流行而且免费的Jikes编译器。Jikes编译器的速度要由于Sun的Java编译器。首先要安装Jikes(可访问http://oss.software.ibm.com/pub/jikes 获得更多的信息),接着需要在环境变量中设置JIKESPATH包含系统运行时所需的JAR文件。装好Jikes以后还需要设置让JSP编译servlet使用Jikes,需要修改web.xml文件中jspCompilerPlugin的值:

<servlet>
<servlet-name>jsp</servlet-name>
<servlet-class>
org.apache.jasper.servlet.JspServlet
</servlet-class>
<init-param>
<param-name>logVerbosityLevel</param-name>
<param-value>WARNING</param-value>
</init-param>
<init-param>
<param-name>jspCompilerPlugin</param-name>
<param-value>
org.apache.jasper.compiler.JikesJavaCompiler
</param-value>
</init-param>
<init-param>
<!– <param-name>
org.apache.catalina.jsp_classpath
</param-name> –>
<param-name>classpath</param-name>
<param-value>
/usr/local/jdk1.3.1-linux/jre/lib/rt.jar:
/usr/local/lib/java/servletapi/servlet.ja
r</param-value>
</init-param>
<load-on-startup>3</load-on-startup>
</servlet>
在Tomcat 4.1(或更高版本),JSP的编译由包含在Tomcat里面的Ant程序控制器直接执行。这听起来有一点点奇怪,但这正是Ant有意为之的一部分,有一个API文档指导开发者在没有启动一个新的JVM的情况下,使用Ant。这是使用Ant进行Java开发的一大优势。另外,这也意味着你现在能够在Ant中使用任何javac支持的编译方式,这里有一个关于Apache Ant使用手册的javac page列表。使用起来是容易的,因为你只需要在 元素中定义一个名字叫“compiler”,并且在value中有一个支持编译的编译器名字,示例如下:

<servlet>
<servlet-name>jsp</servlet-name>
<servlet-class>
org.apache.jasper.servlet.JspServlet
</servlet-class>
<init-param>
<param-name>logVerbosityLevel</param-name>
<param-value>WARNING</param-value>
</init-param>
<init-param>
<param-name>compiler</param-name>
<param-value>jikes</param-value>
</init-param>
<load-on-startup>3</load-on-startup>
</servlet>

Ant可用的编译器

名称

别名

调用的编译器

classic

javac1.1, javac1.2

Standard JDK 1.1/1.2 compiler

modern

javac1.3, javac1.4

Standard JDK 1.3/1.4 compiler

jikes

The Jikes compiler

JVC

Microsoft

Microsoft command-line compiler from the Microsoft SDK for Java/Visual J++

KJC

The kopi compiler

GCJ

The gcj compiler (included as part of gcc)

SJ

Symantec

Symantec’s Java compiler

extJavac

Runs either the modern or classic compiler in a JVM of its own

由于JSP页面在第一次使用时已经被编译,那么你可能希望在更新新的jsp页面后马上对它进行编译。实际上,这个过程完全可以自动化,因为可以确认的是新的JSP页面在生产服务器和在测试服务器上的运行效果是一样的。

在Tomcat4的bin目录下有一个名为jspc的脚本。它仅仅是运行翻译阶段,而不是编译阶段,使用它可以在当前目录生成Java源文件。它是调试JSP页面的一种有力的手段。

可以通过浏览器访问再确认一下编译的结果。这样就确保了文件被转换成serverlet,被编译了可直接执行。这样也准确地模仿了真实用户访问JSP页面,可以看到给用户提供的功能。也抓紧这最后一刻修改出现的bug并且修改它J

Tomcat提供了一种通过请求来编译JSP页面的功能。例如,你可以在浏览器地址栏中输入http://localhost:8080/examples/jsp/dates/date.jsp?jsp_precompile=true,这样Tomcat就会编译data.jsp而不是执行它。此举唾手可得,不失为一种检验页面正确性的捷径。

4. 其它

前面我们提到过操作系统通过一些限制手段来防止恶意的服务攻击,同样Tomcat也提供了防止恶意攻击或禁止某些机器访问的设置。

Tomcat提供了两个参数供你配置:RemoteHostValve 和RemoteAddrValve。

通过配置这两个参数,可以让你过滤来自请求的主机或IP地址,并允许或拒绝哪些主机/IP。与之类似的,在Apache的httpd文件里有对每个目录的允许/拒绝指定。

例如你可以把Admin Web application设置成只允许本地访问,设置如下:

<Context path=”/path/to/secret_files” …>
<Valve className=”org.apache.catalina.valves.RemoteAddrValve”

allow=”127.0.0.1″ deny=”"/>
</Context>
如果没有给出允许主机的指定,那么与拒绝主机匹配的主机就会被拒绝,除此之外的都是允许的。与之类似,如果没有给出拒绝主机的指定,那么与允许主机匹配的主机就会被允许,除此之外的都是拒绝的。

五. 容量计划

容量计划是在生产环境中使用Tomcat不得不提的提高性能的另一个重要的话题。如果你没有对预期的网络流量下的硬件和带宽做考虑的话那么无论你如何做配置修改和测试都无济于事。

这里先对提及的容量计划作一个简要的定义:容量计划是指评估硬件、操作系统和网络带宽,确定应用服务的服务范围,寻求适合需求和软件特性的软硬件的一项活动。因此这里所说的软件不仅包括Tomcat,也包括与Tomcat结合使用的任何第三方web服务器软件。

如果在购买软硬件或部署系统前你对容量计划一无所知,不知道现有的软硬件环境能够支撑多少的访问量,甚至更糟直到你已经交付并且在生产环境上部署产品后才意识到配置有问题时再进行变更可能为时已晚。此时只能增加硬件投入,增加硬盘容量甚至购买更好的服务器。如果事先做了容量计划那么就不会搞的如此焦头烂额了。

我们这里只介绍与Tomcat相关的内容。

首先为了确定Tomcat使用机器的容量计划,你应该从一下列表项目种着手研究和计划:

1. 硬件

采用什么样的硬件体系?需要多少台计算机?使用一个大型的,还是使用多台小型机?每个计算机上使用几个CPU?使用多少内存?使用什么样的存储设备,I/O的处理速度有什么要求?怎样维护这些计算机?不同的JVM在这些硬件上运行的效果如何(比如IBM AIX系统只能在其设计的硬件系统上运行)?

2. 网络带宽

带宽的使用极限是多少?web应用程序如何处理过多的请求?

3. 服务端操作系统

采用哪种操作系统作为站点服务器最好?在确定的操作系统上使用哪个JVM最好?例如,JVM在这种系统上是否支持本地多线程,对称多处理?哪种系统可使web服务器更快、更稳定,并且更便宜。是否支持多CPU?

4. Tomcat容量计划

以下介绍针对Tomcat做容量计划的步骤:

1) 量化负载。如果站点已经建立并运行,可以使用前面介绍的工具模仿用户访问,确定资源的需求量。

2) 针对测试结果或测试过程中进行分析。需要知道那些请求造成了负载过重或者使用过多的资源,并与其它请求做比较,这样就确定了系统的瓶颈所在。例如:如果servlet在查询数据库的步骤上耗用较长的时间,那么就需要考虑使用缓冲池来降低响应时间。

3) 确定性能最低标准。例如,你不想让用户花20秒来等待结果页面的返回,也就是说甚至在达到访问量的极限时,用户等待的时间也不能超过20秒种(从点击链接到看到返第一条返回数据)。这个时间中包含了数据库查询时间和文件访问时间。同类产品性能在不同的公司可能有不同的标准,一般最好采取同行中的最低标准或对这个标准做出评估。

4) 确定如何合理使用底层资源,并逐一进行测试。底层资源包括CPU、内存、存储器、带宽、操作系统、JVM等等。在各种生产环境上都按顺序进行部署和测试,观察是否符合需求。在测试Tomcat时尽量多采用几种JVM,并且调整JVM使用内存和Tomcat线程池的大小进行测试。同时为了达到资源充分合理稳定地使用的效果,还需针对测试过程中出现的硬件系统瓶颈进行处理确定合理的资源配置。这个过程最为复杂,而且一般由于没有可参考的值所以只能靠理论推断和经验总结。

5) 如果通过第4步的反复测试如果达到了最优的组合,就可以在相同的生产环境上部署产品了。

此外应牢记一定要文档化你的测试过程和结果,因为此后可能还会进行测试,这样就可以拿以前的测试结果做为参考。另外测试过程要反复多次进行,每次的条件可能都不一样,因此只有记录下来才能进行结果比较和最佳条件的选择。

这样我们通过测试找到了最好的组合方式,各种资源得到了合理的配置,系统的性能得到了极大的提升。

六. 附加资料

很显然本文也很难全面而详尽地阐述性能优化过程。如果你进行更多研究的话可能会把性能调优做的更好,比如Java程序的性能调整、操作系统的调整、各种复杂环境与应用系统和其它所有与应用程序相关的东西。在这里提供一些文中提到的一些资源、文中提到的相关内容的链接以及本文的一些参考资料。

1. Web性能测试资料及工具

1) Jmeter Wiki首页,Jmeter为一个开源的100%Java开发的性能测试工具
http://wiki.apache.org/jakarta-jmeter/

2) Apache Benchmark使用说明
http://httpd.apache.org/docs-2.0/programs/ab.html

3) 一些Java相关测试工具的介绍,包含可以与Tomcat集成进行测试的工具
http://blog.csdn.net/wyingquan/

4) LoadRunner® 是一种预测系统行为和性能的工业标准级负载测试工具。它通过模拟数据以千万计用户来实施并发负载来对整个企业架构进行测试,来帮助您更快的查找和发现问题。
http://www.mercury.com/us/products/performance-center/loadrunner/

2. 文中介绍的相关内容的介绍

1) Apache 2.x + Tomcat 4.x做负载均衡,描述了如何利用jk配置集群的负载均衡。
http://raibledesigns.com/tomcat/index.html

2) 容量计划的制定,收集了许多有关制定web站点容量计划的例子:
http://www.capacityplanning.com/

3) 评测Tomcat5负载平衡与集群,
http://www.javaresearch.org/article/showarticle.jsp?column=556&thread=19777

4) Apache与Tomcat的安装与整合之整合篇
http://www.javaresearch.org/article/showarticle.jsp?column=23&thread=18139

5) 性能测试工具之研究,介绍了性能测试工具的原理与思路
http://www.51testing.com/emagzine/No2_2.htm

6) Java的内存泄漏
http://www.matrix.org.cn/resource/article/409.html

7) Web服务器和应用程序服务器有什么区别?
http://www.matrix.org.cn/resource/article/1429.html

8) 详细讲解性能中数据库集群的问题
http://www.theserverside.com/articles/article.tss?l=DB_Break

 

1
Jun

  刚刚回来,看到网友的评论,提到Consumer JRE快要出来了,就赶紧到了Chet Haase的博客上看了看,果真他在博文Early Access Granted: Java SE 6 Update N,原来Sun把以前的Consumer JRE重新命名成了Java SE 6 Update N。Chet认为这个新名字非常酷,但我觉得莫名其妙,而且容易和Java SE 6的Update Release想混淆。这儿需要澄清的是,Consumer JRE同标准JRE 安装不同。Consumer JRE出来之后,标准JRE安装还是继续独立发版的,只是安装版本多了个Consumer JRE版。因此Java SE 6 Update N很容易和Java SE Update 1, 2, 3..等等标准版JRE安装想混淆。不知道他们想过这个问题没有。

目前Consumer JRE包含的重要feature有:

Java Quickstarter : 更快的启动速度

        这可能是最重要的改进了,它将大大提高applet部署和启动的速度。以前浏览器的第一个applet的启动往往需要好几秒钟,而且还经常冻结浏览器。Quickstarter将大大减小第一次启动时间(也称冷启动时间)。根据Chet的解释,Quickstarter技术将Java热启动需要的二进制映像数据作为磁盘缓冲放在操作系统的交换分区里,这个过程在安装时完成。然后Java应用程序在第一次启动时,将这些映像缓冲直接交换到内存,达到快速启动的目的。

Deployment Toolkit: 更方便的部署工具

目前主要自动检测Java安装的工具是J2SE 5.0中发布的称作Auto-Install的ActiveX控件。这种机制局限于Internet Explorer,并且只有在用户允许ActiveX控件时才能起作用。除此外,安装过程需要许多手工过程,比如重定向到java.com网站下载安装java,而且还有可能导致回不到原来的网页。

新的部署检测方法的介绍可以在下面网页上看到:

http://java.sun.com/developer/technicalArticles/JavaLP/javawebstart/AutoInstall.html

部署工具项目目标是提供更强大的系统,可以在多种平台的多种浏览器中运行,允许开发者更为自动化的检测JRE安装和程序启动。另外还有浏览器插件允许高层检测、安装以及启动JRE。如果浏览器环境不允许使用插件,还有基于javascript的方案。

Graphics Performance : 缺省启动Windows平台上的Direct3D的图形加速功能

重新编写Windows上的图形管线(Graphics Pipeline),充分利用Direct3D提升性能,包括从简单的矩形填充和复制到透明处理、渐变、任意图形转换以及其他许多高级2D操作。无论是简单还是复杂的Swing应用程序都将极大地受益于此,对于Swing应用程序来说是一个极大的好消息。可以肯定经过图形加速后的Swing应用将在现在Java 6的基础上性能得到进一步地提高!

Swing的渲染是通过Java2D进行的,因此swing应用依赖于Java2D图形渲染速度来提高性能。在J2SE 1.4中,Swing开始通过DirectX使用本地硬件加速卡,但是仅限于基本操作,如矩形填充和复制、水平和垂直线渲染等。这些简单原语对于基本Swing组件的渲染起到了很大作用,大部分UI渲染是由这些原语组成。另外将Swing缓存成VRAM图像也极大的提升了双缓冲速度。随着Swing的UI界面变得越来越复杂,越来越多的高级操作如透明、反走样、渐变、放大、缩小等也越来越重要。

Java2D的开发小组已经能很大地提升DirectX的渲染速度。通过使用Windows平台提供的本地Direct3D类库,Java2D能加速更多更高级的图形操作。目前由于速度和稳定性的原因,并没有在Java2D缺省启用这些性能。同时他们还实现了并发OpenGL渲染管线,使Java2D具备更高级的能力。同样由于稳定性等原因,这些特性并没有缺省地启用。

现在他们打算重新编写DirectX管线,使其具备相当于OpenGL管线的能力。同时他们还要修改稳定性问题,使其能成为缺省渲染管线,并缺省地启用这些特性。这将使Swing能通过图形处理器运行在高速硬件加速卡上,大大提升目前Swing应用程序的性能,提升更为复杂和强大的Swing应用的性能,允许Swing集成复杂、华丽、动态的动画效果。

Nimbus: 新的快平台的NimbusLookAndFeel,取代以往的缺省外观

这个不再详细描述。简单地说以前Swing的缺省外观太过丑陋,他们想换一个新的基于Synth的外观。下面是新Nimbus外观的截图:

nimbus

至于Kernel JRE,根据项目主页上的说法, The Kernel installation mode will be available at a later date. Stay tuned or subscribe our live link feed for lastest news & information。

Java SE Update N主页在https://jdk6.dev.java.net/6uNea.html

17
May

SQL Server性能分析

Author: 比比巴儿

SQL Server性能分析 作者:豆腐 CHINAASP
当您怀疑计算机硬件是影响SQL Server运行性能的主要原因时,可以通过SQL Server Performance Monitor监视相应硬件的负载,以证实您的猜测并找出系统瓶颈。下文将介绍一些常用的分析对象及其参数。
Memory: Page Faults / sec
如果该值偶尔走高,表明当时有线程竞争内存。如果持续很高,则内存可能是瓶颈。
Process: Working Set
SQL Server的该参数应该非常接近分配给SQL Server的内存值。在SQL Server设定中,如果将”set working set size”置为0, 则Windows NT会决定SQL Server的工作集的大小。如果将”set working set size”置为1,则强制工作集大小为SQLServer的分配内存大小。一般情况下,最好不要改变”set working set size”的缺省值。
Process:%Processor Time
如果该参数值持续超过95%,表明瓶颈是CPU。可以考虑增加一个处理器或换一个更快的处理器。
Processor:%Privileged Time
如果该参数值和”Physical Disk”参数值一直很高,表明I/O有问题。可考虑更换更快的硬盘系统。另外设置Tempdb in RAM,减低”max async IO”,”max lazy writer IO”等措施都会降低该值。

网管网www_bitscn_com

Processor:%User Time
表示耗费CPU的数据库操作,如排序,执行aggregate functions等。如果该值很高,可考虑增加索引,尽量使用简单的表联接,水平分割大表格等方法来降低该值。
Physical Disk:Avg.Disk Queue Length
该值应不超过磁盘数的1.5~2倍。要提高性能,可增加磁盘。
注意:一个Raid Disk实际有多个磁盘。
SQLServer:Cache Hit Ratio
该值越高越好。如果持续低于80%,应考虑增加内存。 注意该参数值是从SQL Server启动后,就一直累加记数,所以运行经过一段时间后,该值将不能反映系统当前值。

16
May

如何让你的SQL运行得更快

Author: 比比巴儿

在使用SQL往往会陷入一个区,即太注于所得的果是否正确,而忽略了不同的实现方法之可能存在的性能差异,这种性能差异在大型的或是复杂的数据库环境中(如机事务处OLTP或决策支持系DSS)中表得尤

笔者在工作践中发现,不良的SQL往往来自于不恰当的索引设计、不充份的接条件和不可化的where子句。

们进行适当的化后,其运行速度有了明地提高!

下面我将从三个方面分别进总结

了更直问题,所有例中的SQL运行时间经过测试,不超1秒的均表示< 1秒)。—-

测试环: 主机:HP LH II—- 330MHZ—- 内存:128—-

操作系Operserver5.0.4—-

数据Sybase11.0.3

 

一、不合理的索引设计—-

例:表record620000行,看在不同的索引下,下面几个 SQL的运行情况:

—- 1.date上建有一非个群集索引

select count(*) from record where date >’19991201′ and date < ‘19991214′and amount >2000 (25)

select date ,sum(amount) from record group by date(55)

select count(*) from record where date >’19990901′ and place in (’BJ’,'SH’) (27)

—- 分析:—-

date上有大量的重复值,在非群集索引下,数据在物理上随机存放在数据上,在范围查,必须执行一次表描才能找到一范内的全部行。

—- 2.date上的一个群集索引

select count(*) from record where date >’19991201′ and date < ‘19991214′ and amount >2000 14秒)

select date,sum(amount) from record group by date28秒)

select count(*) from record where date >’19990901′ and place in (’BJ’,'SH’)14秒)

—- 分析:—- 在群集索引下,数据在物理上按序在数据上,重复值也排列在一起,因而在范围查,可以先找到个范的起末点,且只在个范描数据,避免了大范围扫描,提高了查询速度。

—- 3.placedateamount上的合索引

select count(*) from record where date >’19991201′ and date < ‘19991214′ and amount >2000 26秒)

select date,sum(amount) from record group by date27秒)

select count(*) from record where date >’19990901′ and place in (’BJ, ‘SH’)< 1秒)

—- 分析:—- 是一个不很合理的合索引,因它的前列是place,第一和第二条SQL没有引用place,因此也没有利用上索引;第三个SQL使用了place,且引用的所有列都包含在合索引中,形成了索引覆盖,所以它的速度是非常快的。

—- 4.dateplaceamount上的合索引

select count(*) from record where date >’19991201′ and date < ‘19991214′ and amount >2000(< 1)

select date,sum(amount) from record group by date11秒)

select count(*) from record where date >’19990901′ and place in (’BJ’,'SH’)< 1秒)

—- 分析:—- 是一个合理的合索引。它将date列,使SQL都可以利用索引,并且在第一和第三个SQL中形成了索引覆盖,因而性能达到了最

—- 5.总结—-

缺省情况下建立的索引是非群集索引,但有它并不是最佳的;合理的索引设计要建立在种查询的分析和预测上。

一般来

.有大量重复值、且常有范围查询between, >,< >=,< =)和order bygroup by生的列,可考建立群集索引;

.常同存取多列,且列都含有重复值可考建立合索引;

.合索引要尽量使关键查询形成索引覆盖,其前列一定是使用最繁的列。

 

二、不充份的接条件:

例:表card7896行,在card_no上有一个非聚集索引,表account191122行,在account_no上有一个非聚集索引,看在不同的表接条件下,两个SQL行情况:

select sum(a.amount) from account a,card b where a.card_no = b.card_no20秒)

select sum(a.amount) from account a,card b where a.card_no = b.card_no and a.account_no=b.account_no< 1秒)

—- 分析:—- 在第一个接条件下,最佳查询方案是将account作外表,card作内表,利用card上的索引,其I/O次数可由以下公式估算

account上的22541+(外account191122*card对应表第一行所要找的3=595907I/O

在第二个接条件下,最佳查询方案是将card作外表,account作内表,利用account上的索引,其I/O次数可由以下公式估算:外card上的1944+(外card7896*account对应一行所要找的4= 33528I/O

,只有充份的接条件,真正的最佳方案才会被行。

总结

1.多表操作在被实际执行前,查询优化器会根据接条件,列出几可能的接方案并从中找出系统开销最小的最佳方案。接条件要充份考虑带有索引的表、行数多的表;内外表的选择可由公式:外表中的匹配行数*表中一次找的次数确定,乘最小最佳方案。

2.行方案的方法set showplanon,打showplan选项,就可以看到序、使用何索引的信息;想看更详细的信息,需用sa角色dbcc(3604,310,302)

 

三、不可化的where子句

1.例:下列SQL条件句中的列都建有恰当的索引,但行速度却非常慢:

select * from record wheresubstring(card_no,1,4)=’5378′(13)

select * from record whereamount/30< 100011秒)

select * from record whereconvert(char(10),date,112)=’19991201′10秒)

分析:

where子句中列的任何操作果都是在SQL运行逐列算得到的,因此它不得不行表搜索,而没有使用列上面的索引;

如果果在查询编译时就能得到,那就可以被SQL化器化,使用索引,避免表搜索,因此将SQL重写成下面这样

select * from record where card_no like’5378%’< 1秒)

select * from record where amount< 1000*30< 1秒)

select * from record where date= ‘1999/12/01′< 1秒)

你会发现SQL快起来!

2.例:表stuff200000行,id_no上有非群集索引,看下面SQL

select count(*) from stuff where id_no in(’0′,’1′)23秒)

分析:—- where条件中的‘in’逻辑上相当于‘or’,所以法分析器会将in (’0′,’1′)id_no =’0′ or id_no=’1′行。

期望它会根据or子句分别查找,再将果相加,这样可以利用id_no上的索引;

实际上(根据showplan,它却采用了“OR策略,即先取出or子句的行,存入临时数据的工作表中,再建立唯一索引以去掉重行,最后从临时表中果。因此,实际过程没有利用id_no上索引,并且完成时间还要受tempdb数据性能的影响。

明,表的行数越多,工作表的性能就越差,当stuff620000时间竟达到220秒!不如将or子句分

select count(*) from stuff where id_no=’0’select count(*) from stuff where id_no=’1′

得到两个果,再作一次加法合算。因为每句都使用了索引,时间只有3秒,在620000行下,时间也只有4秒。

或者,用更好的方法,写一个简单的存储过程:

create proc count_stuff asdeclare @a intdeclare @b intdeclare @c intdeclare @d char(10)beginselect @a=count(*) from stuff where id_no=’0’select @b=count(*) from stuff where id_no=’1′endselect @c=@a+@bselect @d=convert(char(10),@c)print @d

直接算出果,时间同上面一快!

 

—- 总结—- ,所谓优化即where子句利用了索引,不可化即生了表描或开销

1.任何列的操作都将致表描,它包括数据函数、算表达式等等,查询时要尽可能将操作移至等号右

2.inor子句常会使用工作表,使索引失效;如果不生大量重复值,可以考把子句拆;拆的子句中应该包含索引。

3.要善于使用存储过程,它使SQL得更加灵活和高效。

从以上些例子可以看出,SQL化的实质就是在果正确的前提下,用化器可以识别句,充份利用索引,减少表描的I/O次数,尽量避免表搜索的生。其SQL的性能化是一个复杂程,上述些只是在次的一,深入研究及数据库层源配置、网络层的流量控制以及操作系统层设计

16
May

在网友的博客中看到这编文章不错,就记了下来。供大家参考,在写存储过程时的经验之谈

1、开发人员如果用到其他库的Table或View,务必在当前库中建立View来实现跨库操作,最好不要直接使用“databse.dbo.table_name”,因为sp_depends不能显示出该SP所使用的跨库table或view,不方便校验。

2、开发人员在提交SP前,必须已经使用set showplan on分析过查询计划,做过自身的查询优化检查。

3、高程序运行效率,优化应用程序,在SP编写过程中应该注意以下几点:

a) SQL的使用规范:

i. 尽量避免大事务操作,慎用holdlock子句,提高系统并发能力。

ii. 尽量避免反复访问同一张或几张表,尤其是数据量较大的表,可以考虑先根据条件提取数据到临时表中,然后再做连接。

iii. 尽量避免使用游标,因为游标的效率较差,如果游标操作的数据超过1万行,那么就应该改写;如果使用了游标,就要尽量避免在游标循环中再进行表连接的操作。

iv. 注意where字句写法,必须考虑语句顺序,应该根据索引顺序、范围大小来确定条件子句的前后顺序,尽可能的让字段顺序与索引顺序相一致,范围从大到小。

v. 不要在where子句中的“=”左边进行函数、算术运算或其他表达式运算,否则系统将可能无法正确使用索引。

vi. 尽量使用exists代替select count(1)来判断是否存在记录,count函数只有在统计表中所有行数时使用,而且count(1)比count(*)更有效率。

vii. 尽量使用“>=”,不要使用“>”。

viii. 注意一些or子句和union子句之间的替换

ix. 注意表之间连接的数据类型,避免不同类型数据之间的连接。

x. 注意存储过程中参数和数据类型的关系。

xi. 注意insert、update操作的数据量,防止与其他应用冲突。如果数据量超过200个数据页面(400k),那么系统将会进行锁升级,页级锁会升级成表级锁。

b) 索引的使用规范:

i. 索引的创建要与应用结合考虑,建议大的OLTP表不要超过6个索引。

ii. 尽可能的使用索引字段作为查询条件,尤其是聚簇索引,必要时可以通过index index_name来强制指定索引

iii. 避免对大表查询时进行table scan,必要时考虑新建索引。

iv. 在使用索引字段作为条件时,如果该索引是联合索引,那么必须使用到该索引中的第一个字段作为条件时才能保证系统使用该索引,否则该索引将不会被使用。

v. 要注意索引的维护,周期性重建索引,重新编译存储过程。

c) tempdb的使用规范:

i. 尽量避免使用distinct、order by、group by、having、join、***pute,因为这些语句会加重tempdb的负担。

ii. 避免频繁创建和删除临时表,减少系统表资源的消耗。

iii. 在新建临时表时,如果一次性插入数据量很大,那么可以使用select into代替create table,避免log,提高速度;如果数据量不大,为了缓和系统表的资源,建议先create table,然后insert。

iv. 如果临时表的数据量较大,需要建立索引,那么应该将创建临时表和建立索引的过程放在单独一个子存储过程中,这样才能保证系统能够很好的使用到该临时表的索引。

v. 如果使用到了临时表,在存储过程的最后务必将所有的临时表显式删除,先truncate table,然后drop table,这样可以避免系统表的较长时间锁定。

vi. 慎用大的临时表与其他大表的连接查询和修改,减低系统表负担,因为这种操作会在一条语句中多次使用tempdb的系统表。

d) 合理的算法使用:

根 据上面已提到的SQL优化技术和ASE Tuning手册中的SQL优化内容,结合实际应用,采用多种算法进行比较,以获得消耗资源最少、效率最高的方法。具体可用ASE调优命令:set statistics io on, set statistics time on , set showplan on 等

16
May

SQL语句优化技术分析

Author: 比比巴儿

操作符优化

IN 操作符

用IN写出来的SQL的优点是比较容易写及清晰易懂,这比较适合现代软件开发的风格。

但是用IN的SQL性能总是比较低的,从ORACLE执行的步骤来分析用IN的SQL与不用IN的SQL有以下区别:

ORACLE试图将其转换成多个表的连接,如果转换不成功则先执行IN里面的子查询,再查询外层的表记录,如果转换成功则直接采用多个表的连接方式 查询。由此可见用IN的SQL至少多了一个转换的过程。一般的SQL都可以转换成功,但对于含有分组统计等方面的SQL就不能转换了。

推荐方案:在业务密集的SQL当中尽量不采用IN操作符。

NOT IN操作符

此操作是强列推荐不使用的,因为它不能应用表的索引。

推荐方案:用NOT EXISTS 或(外连接+判断为空)方案代替

<> 操作符(不等于)

不等于操作符是永远不会用到索引的,因此对它的处理只会产生全表扫描。

推荐方案:用其它相同功能的操作运算代替,如

a<>0 改为 a>0 or a<0

a<>’’ 改为 a>’’

IS NULL 或IS NOT NULL操作(判断字段是否为空)

判断字段是否为空一般是不会应用索引的,因为B树索引是不索引空值的。

推荐方案:

用其它相同功能的操作运算代替,如

a is not null 改为 a>0 或a>’’等。

不允许字段为空,而用一个缺省值代替空值,如业扩申请中状态字段不允许为空,缺省为申请。

建立位图索引(有分区的表不能建,位图索引比较难控制,如字段值太多索引会使性能下降,多人更新操作会增加数