Web项目优化手册_第1页
Web项目优化手册_第2页
Web项目优化手册_第3页
Web项目优化手册_第4页
Web项目优化手册_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 项目性能优化手册性能优化手册性能优化手册3Oracle优化31、oracle虚拟内存大小SGA_MAX_SIZE32、修改oracle内核参数43、提高数据缓存命中率44、数据库线程设置6WebLogic优化71、修改weblogic域模式72、修改weblogic域环境的内存大小73、设置 Perm区大小84、Weblogic数据库连接池连接数设置85、weblogic线程池设置86、属性文件weblogic.xml97、Weblogic优化设置10线程粘滞(阻塞):10数据库连接池调整11Ibatis调整11SQL性能优化建议121、查看性能消耗多的SQL122、提高SQL查询效率13F

2、AQ15Oracle优化1、oracle虚拟内存大小SGA_MAX_SIZESGA是一组包含一个Oracle实例的数据和控制信息的共享内存结构。SGA包括了各个缓冲区和内存池,当Oracle实例启动时,各个内存区只分配实例所需的最小大小,在随后的运行过程中,再根据需要扩展它们的大小,而它们的总和大小受到SGA_MAX_SIZE的限制。SGA分配的是虚拟内存,但是,我们在配置SGA时,一定要使整个SGA区在物理内存中,否则会导致SGA频繁的页入页出,会极大的影响系统的性能。 配置SGA内存大小?     一般是系统内在的一半。系统内存SGA_MAX_SIZ

3、E1G400-500M2G1G4G2500M8G5G查询SGA内存情况:SQL> show parameter sgaNAME           TYPE           VALUE-            -     - lock_sga         boolean       FALSEpre_page_sga 

4、60; boolean       FALSEsga_max_size    big integer   276Msga_target        big integer   276M修改SGA大小:SQL> alter system set  sga_max_size =512M;alter system set sga_target=512MSQL> startup forceORACLE instance started.2、修改oracle内核

5、参数kernel.shmmax :单个共享内存段的最大值,如果该参数设置小于Oracle SGA设置,那么SGA就会被分配多个共享内存段。这在繁忙的系统中可能成为性能负担,带来系统问题。(以root身份进行修改 /etc/sysctl.conf 这个文件,加入或者修改以下的语句:kernel.shmmax =4294967296)536870912 512M 修改前4294967296 4G 修改后3、提高数据缓存命中率从内存中读取数据要比从硬盘中读取数据快10000倍,如果oracle用户访问的数据块在buffer cache 中(即命中cache hit),就直接从内存中读取该数

6、据块,如果不在则先从磁盘文件中读取到buffer cache ,然后才访问数据块,而buffer cache 是被所有oracle进程共享的。所以提高oracle buffer命中率就可以提高数据库系统的性能。在Oracle数据库中,有很多因素会影响到数据库的缓存命中率。主要影响缓存命中率的有三个因素,分别为连接、索引与数据缓存的大小。(1)、数据库缓存大小DB_CACHE_SIZE如果把这个参数设置的太大,则系统在切换后就很可能会莫名其妙的罢工;而若这个参数设置的太小,则管理员无论如何优化数据库系统,其性能都会十分的有限,由于数据库没有足够的数据缓存来处理相关的操作。假如

7、不考虑其它因素(如索引、连接)的影响,则一般情况下,假如这个参数设置的比较低的话,那么最近使用的数据就会被最近一次查询的数据所覆盖掉。如此的话,假如另外一个查询需要重新调用这些被覆盖的数据,则就必须重新从服务器的硬盘中读取相关的数据。此时就会极大的降低数据库查询的效率。9i 以后,推荐使用db_cache_size 来指定buffer cache 的大小。在OLTP 系统中,对于DB_CACHE_SIZE 的设置,我的推荐配置是:DB_CACHE_SIZE = SGA_MAX_SIZE/2 SGA_MAX_SIZE*2/3SQL> alter system set db_cache_si

8、ze=128M scope=spfile;          system altered.DB_CACHE_SIZE 是可以联机修改的,即实例无需重启。除了这个数据缓存大小为,还有索引、表连接等等。有时候可能索引或者表连接不合理,反而会造成很高的索引命中率。为此假如由于数据缓存命中率不高或者异常的高,在调整数据缓存之前最好先对索引或者表连接进行优化。对他们进行调整之后,再来判断是否需要调整数据缓存。一个良好性能的系统,这一值一般保持在95%左右。查看当前的Buffer Cache 命中率:SQL>select 1-(physical_r

9、eads)/(consistent_gets+db_block_gets)  from v$buffer_pool_statistics;  1-(PHYSICAL_READS)/(CONSISTENT  -     0.967658520581074SQL>(2)、索引和连接保证所有表都建有索引,SQL查询尽可能的带索引查询,否则建了索引也没用,两张表,百万数据,全表扫描,再连接,很费时间和性能。(3)、定期重建索引定期重建索引不仅可以提高查询性能,还能增加索引表空间空闲空间大小。用Toad(Oracle应用开发工具

10、)看哪些索引需要重建, ALTER INDEX <INDEXNAME> REBUILD(4)、整理oracle碎片如果段的碎片过多, 将其数据压缩到一个范围的最简单方法便是用正确的存储参数将这个段重建,然后将旧表中的数据插入到新表,同时删除旧表。这个过程可以用 Import/Export (输入 / 输出)工具来完成。  Export命令有一个(压缩)标志,这个标志在读表时会引发 Export 确定该表所分配的物理空间量,它会向输出转储文件写入一个新的初始化存储参数 - 等于全部所分配空间。若这个表关闭, 则使用 Import工具重新生成。这样,它的数据会放入一

11、个新的、较大的初始段中。例如: 1)、导出整个库:exp user/password file=exp.dmp compress=Y grants=Y indexes=Y  tables=(table1,table2); 2)、若输出成功,则从库中删除已输出的表,然后从输出转储文件中输入表: imp user/password file=exp.dmp commit=Y buffer=64000 full=Y 这种方法可用于整个数据库。 4、数据库线程设置通过设置以下语句查询和设置oracle的线程数:-查询最大线程数:show pa

12、rameter processes;-更改线程连接数: alter system set processes=500 scope=spfile;设置完重启数据库,启动后通过查询最大线程连接数(show parameter processes)查看是否设置正确并生效。说明:默认是150个,这个量并非越大越好,需要根据硬件性能来设置。WebLogic优化Weblogic环境:CPU 4core     内存  8G1、修改weblogic域模式设置为生产模式, 修改前是开发模式。点击basicWLSDomain,然后点击锁定并编辑,勾选生产模式即可。2、修改weblo

13、gic域环境的内存大小jvm heap 内存大小设置成Xms4000m -Xmx4000m ,修改前 Xms512m -Xmx512m修改文件:setDomainEnv.shif "$JAVA_VENDOR" = "Sun" ; thenWLS_MEM_ARGS_64BIT="-Xms256m -Xmx512m"export WLS_MEM_ARGS_64BITWLS_MEM_ARGS_32BIT="-Xms512m Xmx512m" /修改成Xms4000m -Xmx4000mexport WLS_MEM_ARG

14、S_32BITelseWLS_MEM_ARGS_64BIT="-Xms512m -Xmx512m"export WLS_MEM_ARGS_64BITWLS_MEM_ARGS_32BIT="-Xms512m -Xmx512m" /修改成Xms4000m -Xmx4000mexport WLS_MEM_ARGS_32BITfi说明:红色字为修改的内容,具体修改值根据实际物理内存而定,一般为物理内存的一半。32位操作系统JDK内存系统:最大可设置为1.5G,如果设置过大,会导致服务无法启动。64位操作系统JDK内存系统:最大可设置为物理内存的60%80%。3、

15、设置 Perm区大小修改setDomainEnv.cmd文件修改之前是-XX:PermSize=128m-XX:MaxPermSize=256m修改之后是-XX:PermSize=800m-XX:MaxPermSize=1024m4、Weblogic数据库连接池连接数设置受oracle数据库连接数的影响,可以参照同一时间连接数据库的用户数量进行设置,数据库的最大连接数不能小于高峰时期同一时间连接用户的数量。点击数据源,进入后选择连接池:初始容量:20 默认1最大容量:50 默认15容量增长:5 默认1说明:设置前得设置数据库的最大并发线程数,见(Oracle优化4数据库线程设置)。因为webl

16、ogic节点的连接池最大连接数之和不能大于数据库的最大线程数。5、weblogic线程池设置Weblogic8.x之前线程都是通过手动设置,weblogic9.x之后系统线程由weblogic自动按需分配。但仍可以手动的修改weblogic配置来改变线程数。第一种方式:修改脚本OracleMiddlewareuser_projectsdomainsbase_domainbin下的startWebLogic.sh在脚本中增加如下参数:echo "$JAVA_HOME/bin/java $JAVA_VM $MEM_ARGS -Dweblogic.Name=$SERVER_NAME -Dj

17、ava.security.policy=$WL_HOME/server/lib/weblogic.policy -Dweblogic.threadpool.MinPoolSize=100 -Dweblogic.threadpool.MaxPoolSize=500 $JAVA_OPTIONS $PROXY_SETTINGS $SERVER_CLASS"第二种方式:修改OracleMiddlewareuser_projectsdomainsbase_domainconfig下的config.xml文件在config.xml中,增加如下参数:<server><name&g

18、t;AdminServer</name><self-tuning-thread-pool-size-min>100</self-tuning-thread-pool-size-min><self-tuning-thread-pool-size-max>500</self-tuning-thread-pool-size-max > <listen-address></listen-address> </server>以上两种方法适合weblogic9,10,11g6、属性文件weblogic.xml所

19、在目录:OracleMiddlewarewlserver_10.3serverlibconsoleappwebappWEB-INF如果是windows系统加上盘符。Weblogic Server允许通过设置Weblogic应用程序扩展描述符(weblogic.xml)配置jsp容器,可配置的元素包含在<weblogic-web-app></weblogic-web-app>根节点下。7、Weblogic优化设置数据库oracle10g 硬件配置:8核CPU、 8G内存 ,Weblogic11g平台服务器类型系统软件参数类型参数值备注数据库服务器Oracle最大连接数50

20、0 默认值150应用服务器Weblogic数据库连接池初始连接数:50最大连接数:100步长:5默认1默认15默认1积压数300默认登录超时时间5000ms默认JDK内存设置最小内存:3072M最大内存:4096M默认256512M线程数最小线程:2500最大线程:5000默认没有参数domain->server->配置->优化:接受积压:300登录超时:5000 mS线程粘滞(阻塞):weblogic警告: threadPool has stuck threads(线程池阻塞线程)domain->server->配置->优化粘滞(阻塞)线程最长时间:在此服

21、务器将线程诊断为阻塞线程之前,线程必须连续工作的时间长度(秒)。默认情况下,WebLogic Server 认为线程在连续工作 600 秒后成为阻塞线程。粘滞(阻塞)线程计时器间隔:WebLogic Server 定期扫描线程以查看它们是否已经连续工作了 "阻塞线程最长时间" 字段中指定的时间长度的间隔时间(秒)。默认情况下,WebLogic Server 将此时间间隔设置为 600 秒。domain->server->配置->超载最长线程粘滞时间:600 默认为600s粘滞线程计数:20 默认为0数据库连接池调整优化之前使用的是默认连接池和参数,优化之后

22、改为JNDI方式连接。默认的连接方式:<datasources transaction-manager="local"><datasource id="1" name="测试数据库" type="Oracle"><connection user-name="ZXC_TEST" password="ZXC_TEST" server-name="31" port="1521" db-nam

23、e="testdb"></connection></datasource></datasources>JNDI连接方式:<datasources transaction-manager="local"><datasource id="1" name="测试数据库" type="Oracle"><connection jndi="jdbc/test" ></connection></

24、datasource></datasources>在weblogic控制台创建oracle连接池同时调整 weblogic datasource 的参数 初始连接数40 、最大连接数 100、 空闲数30、缓存180。Ibatis调整调整sqlmap-config.xml文件调整前:<settings cacheModelsEnabled="true" enhancementEnabled="true"lazyLoadingEnabled="true" maxRequests="32" ma

25、xSessions="10"maxTransactions="5" useStatementNamespaces="true" />调整后:<settings cacheModelsEnabled="true" enhancementEnabled="true"lazyLoadingEnabled="true" maxRequests="200" maxSessions="100"maxTransactions="

26、80" useStatementNamespaces="true" />SQL性能优化建议1、查看性能消耗多的SQL可以使用下面的SQL查看消耗IO和CPU比较多的SQL,要看清楚是应用程序执行的SQL还是系统执行的SQL。也可能通过oracle控制台来查看要优化的SQL。(1)、获取磁盘IO前100位的SQL,IO消耗多的一般都是执行比较慢的SQL,需要重点优化。大多为应用程序执行的SQL。SELECT * FROM (SELECT parsing_user_id, executions, sorts, command_type, disk_reads,

27、sql_text, S.HASH_VALUE FROM v$sqlarea s WHERE S.PARSING_USER_ID = uid ORDER BY disk_reads DESC) WHERE rownum < 100;(2)、获取CPU消耗前100位的SQL。大多为系统执行的SQL。SELECT * FROM (SELECT parsing_user_id, executions, sorts, disk_reads, s.BUFFER_GETS, s.CPU_TIME, s.ELAPSED_TIME, sql_text, command_type, S.HASH_VALUE

28、 FROM v$sqlarea s WHERE S.PARSING_USER_ID = uid ORDER BY CPU_TIME DESC) WHERE rownum < 100;2、提高SQL查询效率(1)、where子句中的连接顺序ORACLE采用自下而上的顺序解析WHERE子句。根据这个原理,表之间的连接必须写在其他WHERE条件之前,那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾。(2)、select子句中避免使用“*”ORACLE在解析的过程中, 会将*依次转换成所有的列名,这个工作是通过查询数据字典完成的。这意味着将耗费更多的时间。(3)、减少访问数据库的次数

29、ORACLE在内部执行了许多工作:解析SQL语句,估算索引的利用率,绑定变量,读数据块等。(4)、使用decode函数来减少处理时间使用DECODE函数可以避免重复扫描相同记录或重复连接相同的表。(5)、 用Where子句替换HAVING子句避免使用HAVING子句, HAVING 只会在检索出所有记录之后才对结果集进行过滤.。这个处理需要排序,总计等操作。如果能通过WHERE子句限制记录的数目,那就能减少这方面的开销。where的作用时间是在计算之前就完成的,而having就是在计算后才起作用的,所以在这种情况下,两者的结果会不同。在多表联接查询时,on比where更早起作用。系统

30、首先根据各个表之间的联接条件,把多个表合成一个临时表后,再由where进行过滤,然后再计算,计算完后再由having进行过滤。(6)、 通过内部函数提高SQL效率复杂的SQL往往牺牲了执行效率。能够运用函数解决问题的方法在实际工作中是非常有意义的。(7)、使用表的别名(Alias)当在SQL语句中连接多个表时,请使用表的别名并把别名前缀于每个Column上.这样一来,就可以减少解析的时间并减少那些由Column歧义引起的语法错误。(8)、用EXISTS替代IN、用NOT EXISTS替代NOT IN在许多基于基础表的查询中,为了满足一个条件,往往需要对另一个表进行联接。在这种情况下,

31、 使用EXISTS(或NOT EXISTS)通常将提高查询的效率。在子查询中,NOT IN子句将执行一个内部的排序和合并。无论在哪种情况下,NOT IN都是最低效的 (因为它对子查询中的表执行了一个全表遍历)。为了避免使用NOT IN,我们可以把它改写成外连接(Outer Joins)或NOT EXISTS。例子:(高效)SELECT * FROM EMP  WHERE EMPNO > 0 AND EXISTS (SELECT X FROM DEPT WHERE DEPT.DEPTNO = EMP.DEPTNO AND LOC = MELB) (低效)SELECT 

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论