2008年9月21日星期日

oracle数据库超大数据量的处理

问题:

一个表中有1000万以上的数据,要对其进行10万次以上的增删查改的操作,请问如何优化java程序对数据库的操作?

解答:

通过使用一些辅助性工具来找到程序中的瓶颈,然后就可以对瓶颈部分的代码进行优化。一般有两种方案:即优化代码或更改设计方法。我们一般会选择后者,因为不去调用以下代码要比调用一些优化的代码更能提高程序的性能。而一个设计良好的程序能够精简代码,从而提高性能。 下面将提供一些在JAVA程序的设计和编码中,为了能够提高JAVA程序的性能,而经常采用的一些方法和技巧。 1.对象的生成和大小的调整。 JAVA程序设计中一个普遍的问题就是没有好好的利用JAVA语言本身提供的函数,从而常常会生成大量的对象(或实例)。由于系统不仅要花时间生成对象,以后可能还需花时间对这些对象进行垃圾回收和处理。因此,生成过多的对象将会给程序的性能带来很大的影响。 例1:关于String ,StringBuffer,+和append JAVA语言提供了对于String类型变量的操作。但如果使用不当,会给程序的性能带来影响。如下面的语句: String name=new String("HuangWeiFeng"); System.out.println(name+"is my name"); 看似已经很精简了,其实并非如此。为了生成二进制的代码,要进行如下的步骤和操作: (1) 生成新的字符串 new String(STR_1); (2) 复制该字符串; (3) 加载字符串常量"HuangWeiFeng"(STR_2); (4) 调用字符串的构架器(Constructor); (5) 保存该字符串到数组中(从位置0开始); (6) 从java.io.PrintStream类中得到静态的out变量; (7) 生成新的字符串缓冲变量new StringBuffer(STR_BUF_1); (8) 复制该字符串缓冲变量; (9) 调用字符串缓冲的构架器(Constructor); (10) 保存该字符串缓冲到数组中(从位置1开始); (11) 以STR_1为参数,调用字符串缓冲(StringBuffer)类中的append方法; (12) 加载字符串常量"is my name"(STR_3); (13) 以STR_3为参数,调用字符串缓冲(StringBuffer)类中的append方法; (14) 对于STR_BUF_1执行toString命令; (15) 调用out变量中的println方法,输出结果。 由此可以看出,这两行简单的代码,就生成了STR_1,STR_2,STR_3,STR_4和STR_BUF_1五个对象变量。这些生成的类的实例一般都存放在堆中。堆要对所有类的超类,类的实例进行初始化,同时还要调用类极其每个超类的构架器。而这些操作都是非常消耗系统资源的。因此,对对象的生成进行限制,是完全有必要的。 经修改,上面的代码可以用如下的代码来替换。 StringBuffer name=new StringBuffer("HuangWeiFeng"); System.out.println(name.append("is my name.").toString()); 系统将进行如下的操作: (1) 生成新的字符串缓冲变量new StringBuffer(STR_BUF_1); (2) 复制该字符串缓冲变量; (3) 加载字符串常量"HuangWeiFeng"(STR_1); (4) 调用字符串缓冲的构架器(Constructor); (5) 保存该字符串缓冲到数组中(从位置1开始); (6) 从java.io.PrintStream类中得到静态的out变量; (7) 加载STR_BUF_1; (8) 加载字符串常量"is my name"(STR_2); (9) 以STR_2为参数,调用字符串缓冲(StringBuffer)实例中的append方法; (10) 对于STR_BUF_1执行toString命令(STR_3); (11)调用out变量中的println方法,输出结果。 由此可以看出,经过改进后的代码只生成了四个对象变量:STR_1,STR_2,STR_3和STR_BUF_1.你可能觉得少生成一个对象不会对程序的性能有很大的提高。但下面的代码段2的执行速度将是代码段1的2倍。因为代码段1生成了八个对象,而代码段2只生成了四个对象。 代码段1: String name= new StringBuffer("HuangWeiFeng"); name+="is my"; name+="name"; 代码段2: StringBuffer name=new StringBuffer("HuangWeiFeng"); name.append("is my"); name.append("name.").toString(); 因此,充分的利用JAVA提供的库函数来优化程序,对提高JAVA程序的性能时非常重要的.其注意点主要有如下几方面; (1) 尽可能的使用静态变量(Static Class Variables) 如果类中的变量不会随他的实例而变化,就可以定义为静态变量,从而使他所有的实例都共享这个变量。 例: public class foo { SomeObject so=new SomeObject(); } 就可以定义为: public class foo { static SomeObject so=new SomeObject(); } (2) 不要对已生成的对象作过多的改变。 对于一些类(如:String类)来讲,宁愿在重新生成一个新的对象实例,而不应该修改已经生成的对象实例。 例: String name="Huang"; name="Wei"; name="Feng"; 上述代码生成了三个String类型的对象实例。而前两个马上就需要系统进行垃圾回收处理。如果要对字符串进行连接的操作,性能将得更差,因为系统将不得为此生成更多得临时变量,如上例1所示。 (3) 生成对象时,要分配给它合理的空间和大小JAVA中的很多类都有它的默认的空间分配大小。对于StringBuffer类来讲,默认的分配空间大小是16个字符。如果在程序中使用StringBuffer的空间大小不是16个字符,那么就必须进行正确的初始化。 (4) 避免生成不太使用或生命周期短的对象或变量。对于这种情况,因该定义一个对象缓冲池。以为管理一个对象缓冲池的开销要比频繁的生成和回收对象的开销小的多。 (5) 只在对象作用范围内进行初始化。JAVA允许在代码的任何地方定义和初始化对象。这样,就可以只在对象作用的范围内进行初始化。从而节约系统的开销。 例: SomeObject so=new SomeObject(); If(x==1) then { Foo=so.getXX(); } 可以修改为: if(x==1) then { SomeObject so=new SomeObject(); Foo=so.getXX(); } 2.异常(Exceptions) JAVA语言中提供了try/catch来发方便用户捕捉异常,进行异常的处理。但是如果使用不当,也会给JAVA程序的性能带来影响。因此,要注意以下两点: (1) 避免对应用程序的逻辑使用try/catch 如果可以用if,while等逻辑语句来处理,那么就尽可能的不用try/catch语句。 (2) 重用异常 在必须要进行异常的处理时,要尽可能的重用已经存在的异常对象。以为在异常的处理中,生成一个异常对象要消耗掉大部分的时间。 3. 线程(Threading) 一个高性能的应用程序中一般都会用到线程。因为线程能充分利用系统的资源。在其他线程因为等待硬盘或网络读写而 时,程序能继续处理和运行。但是对线程运用不当,也会影响程序的性能。 例2:正确使用Vector类 Vector主要用来保存各种类型的对象(包括相同类型和不同类型的对象)。但是在一些情况下使用会给程序带来性能上的影响。这主要是由Vector类的两个特点所决定的。第一,Vector提供了线程的安全保护功能。即使Vector类中的许多方法同步。但是如果你已经确认你的应用程序是单线程,这些方法的同步就完全不必要了。第二,在Vector查找存储的各种对象时,常常要花很多的时间进行类型的匹配。而当这些对象都是同一类型时,这些匹配就完全不必要了。因此,有必要设计一个单线程的,保存特定类型对象的类或集合来替代Vector类.用来替换的程序如下(StringVector.java): public class StringVector { private String [] data; private int count; public StringVector() { this(10); // default size is 10 } public StringVector(int initialSize) { data = new String[initialSize]; } public void add(String str) { // ignore null strings if(str == null) { return; } ensureCapacity(count + 1); data[count++] = str; } private void ensureCapacity(int minCapacity) { int oldCapacity = data.length; if (minCapacity > oldCapacity) { String oldData[] = data; int newCapacity = oldCapacity * 2; data = new String[newCapacity]; System.arraycopy(oldData, 0, data, 0, count); } } public void remove(String str) { if(str == null) { return; // ignore null str } for(int i = 0; i <> count) { return null; // index is > # strings } else { return data[index]; // index is good } } } 因此,代码: Vector Strings=new Vector(); Strings.add("One"); Strings.add("Two"); String Second=(String)Strings.elementAt(1); 可以用如下的代码替换: StringVector Strings=new StringVector(); Strings.add("One"); Strings.add("Two"); String Second=Strings.getStringAt(1); 这样就可以通过优化线程来提高JAVA程序的性能。用于测试的程序如下(TestCollection.java): import java.util.Vector; public class TestCollection { public static void main(String args []) { TestCollection collect = new TestCollection(); if(args.length == 0) { System.out.println("Usage: java TestCollection [ vector stringvector ]"); System.exit(1); } if(args[0].equals("vector")) { Vector store = new Vector(); long start = System.currentTimeMillis(); for(int i = 0; i < 1000000; i++) { store.addElement("string"); } long finish = System.currentTimeMillis(); System.out.println((finish-start)); start = System.currentTimeMillis(); for(int i = 0; i < 1000000; i++) { String result = (String)store.elementAt(i); } finish = System.currentTimeMillis(); System.out.println((finish-start)); } else if(args[0].equals("stringvector")) { StringVector store = new StringVector(); long start = System.currentTimeMillis(); for(int i = 0; i < 1000000; i++) { store.add("string"); } long finish = System.currentTimeMillis(); System.out.println((finish-start)); start = System.currentTimeMillis(); for(int i = 0; i < 1000000; i++) { String result = store.getStringAt(i); } finish = System.currentTimeMillis(); System.out.println((finish-start)); } } } 关于线程的操作,要注意如下几个方面: (1) 防止过多的同步 如上所示,不必要的同步常常会造成程序性能的下降。因此,如果程序是单线程,则一定不要使用同步。 (2) 同步方法而不要同步整个代码段 对某个方法或函数进行同步比对整个代码段进行同步的性能要好。 (3) 对每个对象使用多”锁”的机制来增大并发。 一般每个对象都只有一个”锁”,这就表明如果两个线程执行一个对象的两个不同的同步方法时,会发生”死锁”。即使这两个方法并不共享任何资源。为了避免这个问题,可以对一个对象实行”多锁”的机制。如下所示: class foo { private static int var1; private static Object lock1=new Object(); private static int var2; private static Object lock2=new Object(); public static void increment1() { synchronized(lock1) { var1++; } } public static void increment2() { synchronized(lock2) { var2++; } } } 4.输入和输出(I/O) 输入和输出包括很多方面,但涉及最多的是对硬盘,网络或数据库的读写操作。对于读写操作,又分为有缓存和没有缓存的;对于数据库的操作,又可以有多种类型的JDBC驱动器可以选择。但无论怎样,都会给程序的性能带来影响。因此,需要注意如下几点: (1) 使用输入输出缓冲 尽可能的多使用缓存。但如果要经常对缓存进行刷新(flush),则建议不要使用缓存。 (2) 输出流(Output Stream)和Unicode字符串 当时用Output Stream和Unicode字符串时,Write类的开销比较大。因为它要实现Unicode到字节(byte)的转换.因此,如果可能的话,在使用Write类之前就实现转换或用OutputStream类代替Writer类来使用。 (3) 当需序列化时使用transient 当序列化一个类或对象时,对于那些原子类型(atomic)或可以重建的原素要表识为transient类型。这样就不用每一次都进行序列化。如果这些序列化的对象要在网络上传输,这一小小的改变对性能会有很大的提高。 (4) 使用高速缓存(Cache) 对于那些经常要使用而又不大变化的对象或数据,可以把它存储在高速缓存中。这样就可以提高访问的速度。这一点对于从数据库中返回的结果集尤其重要。 (5) 使用速度快的JDBC驱动器(Driver) JAVA对访问数据库提供了四种方法。这其中有两种是JDBC驱动器。一种是用JAVA外包的本地驱动器;另一种是完全的JAVA驱动器。具体要使用哪一种得根据JAVA布署的环境和应用程序本身来定。 5.一些其他的经验和技巧 (1) 使用局部变量。 (2) 避免在同一个类中动过调用函数或方法(get或set)来设置或调用变量。 (3) 避免在循环中生成同一个变量或调用同一个函数(参数变量也一样)。 (4) 尽可能的使用static,final,private等关键字。 (5) 当复制大量数据时,使用System.arraycopy()命令。

浏览器缓存

浏览器缓存
  定义:浏览器缓存(Browser Caching)是为了加速浏览,浏览器在用户磁盘上对最近请求过的文档进行存储,当访问者再次请求这个页面时,浏览器就可以从本地磁盘显示文档,这样就可以加速页面的阅览。它是网站访问统计最难解决的问题之一。
  但是,Web服务器可能因此而未计算一个页面或广告已被阅览的次数。
  缓存的方式节约了网络的资源,提高了网络的效率。
  自动清理IE缓存的方法:打开IE,选择“工具--internet选项”,切换到“高级”选项卡,找到“关闭浏览器时清空internet临时文件夹”,并将其选中,确定即可.
   要清空 Mozilla Firefox 的缓存,请按以下步骤操作:
  注销您的 AdSense 帐户。关闭所有其他打开的浏览器窗口。
  单击浏览器顶部的"Tools"(工具)菜单,并选择"Options"(选项)。
  单击"Privacy"(隐私)。
  单击"Cache"(高速缓冲)旁边的"Clear"(清空缓存)。
  单击"OK"(确定)。
  要清空 Mozilla 和 Netscape 的缓存,请按以下步骤操作:
  注销您的 AdSense 帐户。关闭所有其他打开的浏览器窗口。
  单击浏览器顶部的"Edit"(编辑)菜单,然后选择"Preferences"(首选项)。
  单击"Advanced"(高级)旁边的"+"。
  单击"Advanced"(高级)下面的"Cache"(高速缓存)。
  单击"Clear Cache"(清除高速缓存)。
  单击"OK"(确定)。
  要清空 Safari 的缓存,请按以下步骤操作:
  注销您的 AdSense 帐户。关闭所有其他打开的浏览器窗口。
  打开浏览器工具栏中的"Safari"菜单。
  选择"Empty Cache"(清空缓存)。
  单击该对话框中的"Empty"(清空)。
  某些情况下,可能需要多次清空您的缓存。

运用LOADRUNNER .NET ADD-IN 写的性能测试脚本

运用LOADRUNNER .NET ADD-IN 写的性能测试脚本
using System;using System.Runtime.InteropServices; using System.Data.OleDb;using System.Data;
namespace LoadRunnerUser1{ /// /// Summary description for VuserClass. /// [ClassInterface(ClassInterfaceType.AutoDual)] public class VuserClass { LoadRunner.LrApi lr;
public VuserClass() { // LoadRunner Standard API Interface :: DO NOT REMOVE!!! lr = new LoadRunner.LrApi(); }
// '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' public int Initialize() { // TO DO: Add virtual user's initialization routines lr.message("Initialize部分,我只执行一次哦!"); return lr.PASS; }
// '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' public int Actions() { // TO DO: Add virtual user's business process actions lr.message("Actions部分,我可以重复执行(在设置迭代情况下)!"); try { //设置连接字符串开始 string strConnection="Provider=Microsoft.Jet.OleDb.4.0;"; strConnection+=@"Data Source=C:\\test.mdb"; //设置连接字符串结束
//插入一个集合点开始 lr.rendezvous("集合点"); //插入一个集合点结束
//事务开始 lr.start_transaction("SQL语句性能");
//建立OleDbConnection和OleDbCommand,并指定要运行的Sql语句开始 System.Data.OleDb.OleDbConnection conn=new System.Data.OleDb.OleDbConnection(strConnection); System.Data.OleDb.OleDbCommand cmd = new System.Data.OleDb.OleDbCommand(); cmd.Connection = conn; cmd.CommandText = "select * from testdb"; //建立OleDbConnection和OleDbCommand,并指定要运行的Sql语句结束
//插入一个日志开始 lr.log_message("LOG: Sql语句开始执行了,Sql="+cmd.CommandText); //插入一个日志结束
//将查询结果填充到DataTable开始 DataTable dt = new DataTable(); System.Data.OleDb.OleDbDataAdapter oleDA = new System.Data.OleDb.OleDbDataAdapter(); oleDA.SelectCommand = cmd; oleDA.Fill(dt); //将查询结果填充到DataTable结束
//插入一个日志开始 lr.log_message("LOG: Sql语句执行完成,Sql="+cmd.CommandText); //插入一个日志结束
//取得结果集的记录数 int iCountRec=Convert.ToInt32(dt.Rows.Count.ToString()); conn.Close();//关闭连接 //如果记录数大于0,完整这个事务,否则标识事务失败 if(iCountRec>0) lr.end_transaction("SQL语句性能",lr.PASS); else lr.end_transaction("SQL语句性能",lr.FAIL);
//再来一个参数化的示例开始 lr.output_message("Welcome "+lr.eval_string("")+"!");
//再来一个参数化的示例结束
//Thinktime 的应用,就是模拟手工操作的延时,在这里我们延时3秒钟 lr.think_time(3); }
catch(Exception ex) { conn.Close();//关闭连接 string error = ex.Message; }
return lr.PASS; }
// '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' public int Terminate() { // TO DO: Add virtual user's termination routines lr.message("Terminate部分,我只执行一次哦!"); return lr.PASS; }
}}

Windows性能管理解析

为了让用户满意,就必须确保服务器性能达到最佳。根据所提供服务的不同,对硬件的要求也有所不同。例如,FTP 服务比 Web 服务需要的内存要少。另外,Active Server Pages (ASP) 应用程序、公共网关接口 (CGI) 脚本、数据库查询和视频文件对处理器的要求比静态 HTML 网页对处理器的要求更高。通信量和站点内容发生变化时,性能也会有所变化。为了有效地对性能进行调整,服务器管理员必须制定一个涉及多种工具的监视策略。
本节包含下列内容:
测试和调整的循环特性
用于监视性能的工具
磁盘优化
测试和调整的循环特性
性能测试和调整是一个连续性过程。要有效地进行测试和调整,首先必须详细规划评估策略。第一步是测量当前的性能级别。由于服务器性能随时间的不同可能存在很大差异,所以必须确保足够长的监视时间以获得真实的服务器活动数据。
要改善服务器的性能,需要检查整个系统的各个部分,找出潜在的性能瓶颈。瓶颈可能是由于硬件配置不完善或不正确引起的,也可能是由于 IIS 或 Windows XP 中的软件设置所致。一个完善的监视规划应能够全方位地对性能进行检查。
了解服务器性能之后,便可以着手进行一些更改以提高性能。最好一次只更改一项设置,因为同时更改多项设置时的效果不易观察。
每次完成更改后,请继续进行监视,观察这些更改是否达到了预期的效果,是否产生了负面影响。由于对某项资源的更改可能会导致其他方面的瓶颈,因此进行更改之后,需要检查所有资源的性能。了解此项更改带来的影响之后,就可以确定是否需要进一步对设置进行更改。
性能监视工具
对服务器进行监视是服务器管理中的一项关键性任务。使用适当的监视工具,可以检测服务器问题,评估更改网站内容的效果以及规划升级,使站点更便于用户访问。
选择哪种监视工具和哪种监视方法效果最好,取决于所需要的信息。例如,如果需要测量 Web 服务器的总负荷,可以使用性能监视器提供一周内的性能数据,显示诸如计算机连接数和文件传输数等信息。再如,如果发现服务器性能有所下降,可以查看事件查看器中的错误记录。事件查看器是查看由 Windows XP 生成的日志的工具。
还可以通过检查 IIS 生成的日志来监视服务器。这些日志是 Windows XP 生成日志的扩展。有关日志记录的详细信息,请参阅记录站点活动中的相应主题。
Windows XP 提供了下列监视工具,这些工具既可以提供实时信息,也可以提供摘要信息:
性能监视器
事件查看器
任务管理器
网络监视器
除了 Windows XP 中的内置工具,还有一些其他性能监视工具可供使用。详细信息,请参阅性能和可扩展性测试
性能监视器
性能监视器是一个功能强大的 MMC 管理单元,可用来监视服务器的活动,并根据选定的时间间隔进行性能汇总。使用此工具,可以在实时图表或报告中显示性能数据,将收集到的数据保存在文件中,并在发生严重事件时发出警告。可以使用这些数据确定导致系统瓶颈的原因,并相应地调整系统及应用程序的性能。
下面是三种访问性能监视器的方法:
从“开始”菜单,单击“程序”,单击“管理工具”,再单击“性能”。
从“开始”菜单,单击“运行”,在文本框中输入“perfmon”,再按 Enter 键。
在任意命令提示符窗口中,输入“perfmon”。
性能监视器检查性能计数器的输出,而性能计数器用来监视特定性能对象(即控制服务器资源的特定服务或机制)的活动。例如,单击性能监视器中的加号按钮,可以查看 Web Service 性能对象,以及监视每秒接收的字节数或每秒尝试的连接数等事件的计数器列表。在此窗口中,可以向性能监视器的图形化显示中添加或删除计数器,或者对计数器进行配置,使其使用特定的方式进行记录。如果同时运行多个计数器,性能可能会稍有下降,因此必须有所选择。
Windows XP 包括数百个计数器,可分别记录磁盘使用情况及 TCP 活动等。IIS 还有自己的计数器,包括 Web Service 计数器、FTP Service 计数器、Active Server Pages 应用程序计数器和 IIS Global 计数器。Web Service、FTP Service 计数器及 Active Server Pages 对象计数器监视脚本的连接活动,Internet Information Services Global 计数器监视带宽使用情况及所有 IIS 服务的缓存活动。计数器一般以数量或长度进行度量,选择要显示的计数器时需记住这一点。
系统监视器既可以提供短期内有关服务器及站点负载的信息,也可以提供这方面的长期信息。下表列出了一些对监视服务器很有用的系统监视器计数器,并提供了每个计数器的理想值。性能监视器的图形化显示范围为 0 到 100,因此对于记录较小值的个别计数器,可能需要更改显示范围。
对象\计数器
理想值
Memory\Pages/sec
0-20(如果大于 80,表示有问题)。
Memory\Available Bytes
最少 20 MB。
Memory\Committed Bytes
不超过物理内存的 75%。
Memory\Pool Nonpaged Bytes
稳定(缓慢增长表示存在内存泄漏问题)。
Processor\% Processor Time
小于 75%。
Processor\Interrupts/sec
取决于处理器。486/66 处理器最大可达 1,000;P90 可达 3,500;P200 可能大于 7,000。此值越低,表示性能越佳。
Processor\System Processor Queue Length
不大于 2。
(Logical or Physical) Disk \ % Disk Time
尽可能低。
(Logical or Physical) Disk \ Avg. Disk Queue Length
小于 2。
(Logical or Physical) Disk \ Avg Disk Bytes/Transfer
尽可能高。
Internet Information Services Global\File Cache Hits %
虽然此值取决于站点内容,但是应尽可能高。
Web Service\Bytes Total/sec
尽可能高。
Active Server Pages\Request Wait Time
ASP\Request Execution Time
Active Server Pages\Requests Queued
零。
Active Server Pages\Transactions/sec
尽可能高。
有关使用系统监视器的详细信息,请参阅 Windows XP 文档。有关 IIS 提供的完整计数器列表,请参阅计数器参考
事件查看器
Windows XP 包括事件日志记录服务,可以记录错误或成功启动服务等事件。这些事件日志可以通过事件查看器查看。还可以通过事件查看器监视系统、安全性和应用程序事件日志。通过这些信息,可以更好地了解导致特殊性能问题的事件序列和类型。有关如何使用事件查看器的详细信息,请参阅 Windows XP 文档。
任务管理器
使用任务管理器,可以查看正在进行的任务和线程,也可以更改已分配的进程优先级。但是,进程完成后,新的优先级设置将丢失。可以实时查看 CPU 和内存的使用情况,但不会随时保存这些信息。有关使用任务管理器的详细信息,请参阅 Windows XP 文档。
网络监视器
网络监视器捕获进出计算机的通信信息,并提供正在发送和接收的帧的详细信息。此工具可以帮助分析复杂的网络通信模式。通过它,可以查看发送到服务器的 HTTP 和 FTP 请求中所包含的头信息。通常情况下,需要设计捕获筛选器,它的功能与数据库查询类似,可以筛选出正在传输的帧的一个子集。还可以使用捕获触发器,通过启动某项操作(如启动可执行文件)响应网络事件。Windows XP 中包含网络监视器的简装版,Systems Management Server 中包含网络监视器的完整版。有关网络监视器的详细信息,请参阅 Windows XP 文档(包括 Windows XP 资源大全)。
磁盘优化
硬盘瓶颈在那些存在大量可随机访问的文件集的站点上更为常见。IIS 对硬盘的访问频率与 RAM 数量及请求文件的数量和大小直接相关。如果 RAM 偏低,或者正在请求大量各种各样的文件,或者请求的文件过大,IIS 将无法在 RAM 中保存文件副本以加速访问。这种情况下,IIS 必须从硬盘访问文件。硬盘的访问速度和大小决定了 IIS 定位所请求文件的速度。
要监视硬盘驱动器,可以使用性能监视器记录 CPU 使用百分率、网卡饱和度及 Physical Disk 对象的 % Disk Time 计数器。如果 % Disk Time 计数器值很高,而 CPU 和网卡均没有饱和,说明磁盘驱动器导致了瓶颈。有关 Physical Disk % Disk Time 的详细信息,请参阅 Windows XP 文档。
要改善磁盘访问状况,可以使用独立驱动器冗余阵列 (RAID) 和条带状磁盘集。如果服务器的数据库负载过大,数据库将与 IIS 抢占内存、CPU 和磁盘资源,因此可能需要考虑在另一台计算机上运行最新、最合适的 Windows Server 版本。如果数据库服务器与 Windows XP 必须在同一台计算机上运行,可能需要数千兆的 RAM 以减少访问延迟,或者要求驱动器控制器具有较大的 RAM 缓存。同时还应保留一定的冗余度,这样当某一驱动器无法运行时,不用从备份副本还原。许多新的控制器允许“热替换”,这样当某一驱动器出错时,不必强制关闭服务器就可以对它进行替换。当然,即使这样,仍然应该适当地保留备份,并在现场以外的位置保留一个副本。

Application Center Test知识点滴积累

Application Center Test 在测试运行中自动监视 HTTP 性能统计信息,但性能计数器必须在测试运行之前明确进行配置。
请检查 ACTTrace.log 文件和报告,并确保不存在以下错误:脚本错误 DNS 错误 套接字连接错误 HTTP 错误 如有必要,请在重新运行测试之前改正其中的错误。
dcomcnfg.exe 启动 DCOM 配置工具
计算页面性能的公式以下公式通过测量每个请求所需的处理器周期数来量化 Web 应用程序的性能。该公式用所消耗的周期数除以所处理的请求数。
(sum of processor speed x processor use)________________________________________ = cost, in cycles/request (or Hz/rps) number of requests per second例如,在应力测试中,ASP 页面的最大容量可达每秒 800 个请求,同时 Web 服务器的处理器使用率为 85%。如果 Web 服务器的处理器频率为 700 MHz(每秒 700,000,000 周期),可以使用以下公式来计算页面的成本:
((4 x 700 000 000 cycles/s) x 0.85) ___________________________________ = 2 975 000 cycles/request 800 requests/s计算页面性能的 VBScript 代码使用以下 VBScript 函数计算成本:
'''''''''''''''''''''''''''''''''''''''''''''''''''''''' Function to return the cost of a page, based on ' stress test values and Web server/cluster hardware. '' Returns: page cost, in millions of cycles per request'Function GetPageCost(iSumOfProcessorSpeeds, _ fAverageProcessorUse, iAverageRPS) Dim iSpentCyclesPerSecond
' calculate the number of cycles used over the testing period iSpentCyclesPerSecond = iSumOfProcessorSpeeds _ * fAverageProcessorUse
' calculate the amount of work performed by the Web server If (iAverageRPS > 0) Then GetPageCost = iSpentCyclesPerSecond / iAverageRPS Else GetPageCost = 0 End IfEnd Function 使用页面成本的示例了解页面成本有许多用途。
最显而易见的用途是比较两个不同页面的性能,或者比较同一页面在调整前后的成本。
特别是当测试对站点中的所有页面进行请求时,可以通过成本初步估计是否需要随着要处理的通信量的增加、CPU 使用率的更改(或者同时处理两者)添加附加硬件。
在前面的示例中,需要多大的处理器速度才能保证处理两倍的站点通信量,同时使处理器的使用率保持在 40% 左右,以便可以轻松处理至少达到 3200 rp 的临时负载增长?
以下计算表明需要的处理器速度大约为 11900 MHz:
page cost x target RPSestimated processor speed = ______________________ processor use
2 975 000 cycles/request x 1600 requests/sestimated processor speed = __________________________________________ 0.40
estimated processor speed = 11 900 000 000 cycles/s
number of 700 MHz processors needed = 11 900 MHz / 700 MHz = 17新的性能目标要求 Web 服务器群集中有大约 17 个处理器,而原来只需 4 个。再次强调,这些估计仅当处理器速度是限制 Web 应用程序性能的因素时才有意义。

QTP知识点滴积累

1. dos命令的执行Dim oShell Set oShell = CreateObject ("WSCript.shell") oShell.run "cmd /K CD C:\ & Dir" Set oShell = Nothing 2.使用可选步骤OptionalStep.Browser("browser_name").Page("page_name").Link("link_name")
默认可选步骤
默认情况下,QuickTest 将打开下列对话框的步骤视为可选:

对话框标题栏

自动完成

文件下载

Internet Explorer

Netscape

输入网络密码

错误

安全警报

安全信息

安全警告

所需的用户名和密码 3. 处理运行错误

停止 - 停止运行会话。如果 QuickTest 配置为在运行后显示测试结果,则会显示测试结果。
重试 - QuickTest 尝试再次执行该步骤。如果该步骤成功,则运行会继续。
跳过 - QuickTest 跳过引发错误的步骤,然后从下一步骤继续运行。
调试 - QuickTest 暂停运行以便对测试或组件进行调试。可以执行本章描述的任何调试操作。在调试之后,可以从测试或组件停止的那一步开始继续运行会话,也可以使用单步命令来控制运行会话的其余部分。
帮助 - 对于显示的错误消息,打开 QuickTest 故障排除帮助。在查看“帮助”主题之后,可以在错误消息框中选择另一个按钮。
详细信息 - 将消息框扩展为显示其他有关错误的信息。
4.下列语句指示 QuickTest 等待打开“航班表”对话框时最多等待 20 秒。
blnDone=Window("Flight Reservation").Dialog("Flights Table").Exist
counter=1
While Not blnDone
Wait (2)
blnDone=Window("Flight Reservation").Dialog("Flights Table").Exist
counter=counter+1
If counter=10 then
blnDone=True
End if
Wend5. ExecuteFile "c:\test.vbs"6. msgbox Environment.Value("home")7.请教不将测试结果记录到日志的语句。对于已知是错误的验证点,在测试报告中能否记录通过,或者根本不记录呢?
Reporter.Filter = NewMode
The mode can be one of the following values:
Mode Description
0 or rfEnableAll Default. All reported events are displayed in the Test Results. 1 or rfEnableErrorsAndWarnings Only event with a warning or fail status are displayed in the Test Results. 2 or rfEnableErrorsOnly Only events with a fail status are displayed in the Test Results. 3 or rfDisableAll No events are displayed in the Test Results. 8.库中不需要有对象存在也可执行:Dim aaa,bbbaaa="Login"bbb="OK"Dialog("Title:="&aaa).ActivateDialog("Title:="&aaa).WinButton("text:="&bbb).Click9.setting的应用举例If Setting.Exists("Tester Name") Then Setting.Remove ( "Tester Name")End If
Setting.Add "Tester Name", "Mark Train" Setting("Tester Name") ="hello"MsgBox Setting("Tester Name") 10.qtp 关键字头+空格(技巧)

什么是同族专利?  

什么是同族专利?  
人们把具有共同优先权的由不同国家公布或颁发的内容相同或基本相同的一组专利申请或专利称为同族专利。尽管对同族专利有明确的定义,但在专利文献检索系统中,同族专利的概念外延很广,有以下几种类型:
(1)简单同族专利(Simple Patent Family):指一组同族专利中所有专利都以共同的一个或几个专利申请为优先权;
(2)复杂同族专利(Complex Patent Family):指一组同族专利中所有专利仅以一个共同的专利申请为优先权;
(3)扩展同族专利(Extended Patent Family):指一组同族专利中每个专利至少与另一个专利以一个共同的专利申请为优先权;
(4)国内同族专利(National Patent Family):指由于增补、继续、部分继续、分案申请等原因产生的由一个国家出版的一组专利文献;
(5)仿同族专利(Artificial Patent Family):也叫智能同族专利、技术性同族专利或非传统型同族专利,即并非出自同一专利申请,但内容基本相同的一组由不同国家出版的专利文献。在同族专利检索服务中,仿同族专利常作为“其他类型的同族专利”而出现。