Web项目优化手册

更新时间:2024-02-01 14:44:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

项目性能优化手册

性能优化手册

性能优化手册 ................................................................................................................................... 2

Oracle优化 ............................................................................................................................... 2

1、oracle虚拟内存大小SGA_MAX_SIZE ......................................................................... 2 2、修改oracle内核参数 ................................................................................................. 3 3、提高数据缓存命中率 ................................................................................................. 3 4、数据库线程设置 ......................................................................................................... 5 WebLogic优化 ......................................................................................................................... 6

1、修改weblogic域模式 ................................................................................................ 6 2、修改weblogic域环境的内存大小 ............................................................................ 6 3、设置 Perm区大小 ..................................................................................................... 7 4、Weblogic数据库连接池连接数设置 ......................................................................... 7 5、weblogic线程池设置 ................................................................................................. 7 6、属性文件weblogic.xml .............................................................................................. 8 7、Weblogic优化设置..................................................................................................... 9 线程粘滞(阻塞): ................................................................................................................. 9 数据库连接池调整 ................................................................................................................. 10 Ibatis调整 ............................................................................................................................... 10 SQL性能优化建议 ................................................................................................................ 11

1、查看性能消耗多的SQL .......................................................................................... 11 2、提高SQL查询效率 ................................................................................................. 12 FAQ ......................................................................................................................................... 14

Oracle优化

1、oracle虚拟内存大小SGA_MAX_SIZE

SGA是一组包含一个Oracle实例的数据和控制信息的共享内存结构。

SGA包括了各个缓冲区和内存池,当Oracle实例启动时,各个内存区只分配实例所需的最小大小,在随后的运行过程中,再根据需要扩展它们的大小,而它们的总和大小受到SGA_MAX_SIZE的限制。

SGA分配的是虚拟内存,但是,我们在配置SGA时,一定要使整个SGA区在物理内存中,否则会导致SGA频繁的页入页出,会极大的影响系统的性能。 配置SGA内存大小?

一般是系统内在的一半。

系统内存 1G 2G 4G 8G 查询SGA内存情况: SQL> show parameter sga NAME TYPE VALUE --------- ---------- ------------ lock_sga boolean FALSE pre_page_sga boolean FALSE sga_max_size big integer 276M sga_target big integer 276M

修改SGA大小:

SGA_MAX_SIZE 400-500M 1G 2500M 5G SQL> alter system set sga_max_size =512M; alter system set sga_target=512M SQL> startup force ORACLE instance started.

2、修改oracle内核参数

kernel.shmmax:单个共享内存段的最大值,如果该参数设置小于Oracle SGA设置,那么SGA就会被分配多个共享内存段。这在繁忙的系统中可能成为性能负担,带来系统问题。 (以root身份进行修改 /etc/sysctl.conf这个文件,加入或者修改以下的语句: kernel.shmmax =4294967296)

536870912 512M修改前

4294967296 4G修改后

3、提高数据缓存命中率

从内存中读取数据要比从硬盘中读取数据快10000倍,如果oracle用户访问的数据块在buffer cache 中(即命中cache hit),就直接从内存中读取该数据块,如果不在则先从磁盘文

件中读取到buffer cache ,然后才访问数据块,而buffer cache 是被所有oracle进程共享的。

所以提高oracle buffer命中率就可以提高数据库系统的性能。

在Oracle数据库中,有很多因素会影响到数据库的缓存命中率。主要影响缓存命中率的有三个因素,分别为连接、索引与数据缓存的大小。

(1)、数据库缓存大小DB_CACHE_SIZE

如果把这个参数设置的太大,则系统在切换后就很可能会莫名其妙的罢工;而若这个参数设置的太小,则管理员无论如何优化数据库系统,其性能都会十分的有限,由于数据库没有足够的数据缓存来处理相关的操作。

假如不考虑其它因素(如索引、连接)的影响,则一般情况下,假如这个参数设置的比较低的话,那么最近使用的数据就会被最近一次查询的数据所覆盖掉。如此的话,假如另外一个查询需要重新调用这些被覆盖的数据,则就必须重新从服务器的硬盘中读取相关的数据。此时就会极大的降低数据库查询的效率。

9i 以后,推荐使用db_cache_size来指定buffer cache 的大小。在OLTP 系统中,对于DB_CACHE_SIZE 的设置,我的推荐配置是:

DB_CACHE_SIZE = SGA_MAX_SIZE/2 ~ SGA_MAX_SIZE*2/3 SQL> alter system set db_cache_size=128M scope=spfile; system altered. DB_CACHE_SIZE 是可以联机修改的,即实例无需重启。

除了这个数据缓存大小为,还有索引、表连接等等。有时候可能索引或者表连接不合理,反而会造成很高的索引命中率。为此假如由于数据缓存命中率不高或者异常的高,在调整数据缓存之前最好先对索引或者表连接进行优化。对他们进行调整之后,再来判断是否需要调整数据缓存。

一个良好性能的系统,这一值一般保持在95%左右。

查看当前的Buffer Cache 命中率:

SQL>select1-(physical_reads)/(consistent_gets+db_block_gets) from v$buffer_pool_statistics; 1-(PHYSICAL_READS)/(CONSISTENT ------------------------------ 0.967658520581074 SQL> (2)、索引和连接

保证所有表都建有索引,SQL查询尽可能的带索引查询,否则建了索引也没用,两张

表,百万数据,全表扫描,再连接,很费时间和性能。

(3)、定期重建索引

定期重建索引不仅可以提高查询性能,还能增加索引表空间空闲空间大小。

用Toad(Oracle应用开发工具)看哪些索引需要重建, ALTER INDEX

REBUILD

(4)、整理oracle碎片

如果段的碎片过多,将其数据压缩到一个范围的最简单方法便是用正确的存储参数将这个段重建,然后将旧表中的数据插入到新表,同时删除旧表。这个过程可以用 Import/Export (输入 / 输出)工具来完成。

Export命令有一个(压缩)标志,这个标志在读表时会引发 Export 确定该表所分配的物理空间量,它会向输出转储文件写入一个新的初始化存储参数 -- 等于全部所分配空间。若这个表关闭,则使用 Import工具重新生成。这样,它的数据会放入一个新的、较大的初始段中。例如: 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 parameter processes; --更改线程连接数:

alter system set processes=500 scope=spfile;

设置完重启数据库,启动后通过查询最大线程连接数(show parameter processes)查看是否设置正确并生效。

说明:默认是150个,这个量并非越大越好,需要根据硬件性能来设置。

WebLogic优化

Weblogic环境:CPU 4core 内存 8G

1、修改weblogic域模式

设置为生产模式,修改前是开发模式。

点击basicWLSDomain,然后点击锁定并编辑,勾选生产模式即可。

2、修改weblogic域环境的内存大小

jvm heap 内存大小设置成Xms4000m -Xmx4000m,修改前Xms512m -Xmx512m 修改文件:setDomainEnv.sh

if [ \

WLS_MEM_ARGS_64BIT=\ export WLS_MEM_ARGS_64BIT

WLS_MEM_ARGS_32BIT=\–Xmx512m\修改成Xms4000m -Xmx4000m export WLS_MEM_ARGS_32BIT else

WLS_MEM_ARGS_64BIT=\ export WLS_MEM_ARGS_64BIT

WLS_MEM_ARGS_32BIT=\ //修改成Xms4000m -Xmx4000m export WLS_MEM_ARGS_32BIT

fi

说明:红色字为修改的内容,具体修改值根据实际物理内存而定,一般为物理内存的一半。

32位操作系统JDK内存系统:最大可设置为1.5G,如果设置过大,会导致服务无法启动。

64位操作系统JDK内存系统:最大可设置为物理内存的60%~80%。

3、设置Perm区大小

修改setDomainEnv.cmd文件 修改之前是

-XX:PermSize=128m -XX:MaxPermSize=256m 修改之后是

-XX:PermSize=800m

-XX:MaxPermSize=1024m

4、Weblogic数据库连接池连接数设置

受oracle数据库连接数的影响,可以参照同一时间连接数据库的用户数量进行设置,数据库的最大连接数不能小于高峰时期同一时间连接用户的数量。

点击数据源,进入后选择连接池: 初始容量:20 默认1 最大容量:50 默认15 容量增长:5 默认1

说明:设置前得设置数据库的最大并发线程数,见(Oracle优化4数据库线程设置)。因为weblogic节点的连接池最大连接数之和不能大于数据库的最大线程数。

5、weblogic线程池设置

Weblogic8.x之前线程都是通过手动设置,weblogic9.x之后系统线程由weblogic自动按需分配。但仍可以手动的修改weblogic配置来改变线程数。 第一种方式:

修改脚本\\Oracle\\Middleware\%user_projects\\domains\\base_domain\\bin下 的startWebLogic.sh 在脚本中增加如下参数:

echo \${JAVA_VM} ${MEM_ARGS} -Dweblogic.Name=${SERVER_NAME} -Djava.security.policy=${WL_HOME}/server/lib/weblogic.policy -Dweblogic.threadpool.MinPoolSize=100-Dweblogic.threadpool.MaxPoolSize=500 ${JAVA_OPTIONS} ${PROXY_SETTINGS} ${SERVER_CLASS}\ 第二种方式:

修改\\Oracle\\Middleware\%user_projects\\domains\\base_domain\\config下的config.xml文件 在config.xml中,增加如下参数: AdminServer 100 500 以上两种方法适合weblogic9,10,11g

6、属性文件weblogic.xml

所在目录:

\\Oracle\\Middleware\\wlserver_10.3\\server\\lib\\consoleapp\\webapp\\WEB-INF 如果是windows系统加上盘符。

Weblogic Server允许通过设置Weblogic应用程序扩展描述符(weblogic.xml)配置jsp容器,可配置的元素包含在根节点下。

7、Weblogic优化设置

数据库oracle10g硬件配置:8核CPU、8G内存,Weblogic11g平台

服务器类型 数据库服务器 应用服务器 系统软件 Oracle Weblogic 参数类型 最大连接数 数据库连接池 参数值 500 初始连接数:50 最大连接数:100 步长:5 积压数 登录超时时间 JDK内存设置 线程数 300 5000ms 最小内存:3072M 最大内存:4096M 最小线程:2500 最大线程:5000 默认没有参数 备注 默认值150 默认1 默认15 默认1 默认 默认 默认256~512M domain->server->配置->优化: 接受积压:300 登录超时:5000mS

线程粘滞(阻塞):

weblogic警告:threadPool has stuck threads(线程池阻塞线程) domain->server->配置->优化 粘滞(阻塞)线程最长时间:

在此服务器将线程诊断为阻塞线程之前,线程必须连续工作的时间长度(秒)。默认情况下,WebLogic Server 认为线程在连续工作 600 秒后成为阻塞线程。 粘滞(阻塞)线程计时器间隔:

WebLogic Server 定期扫描线程以查看它们是否已经连续工作了 \阻塞线程最长时间\字段中指定的时间长度的间隔时间(秒)。

默认情况下,WebLogic Server 将此时间间隔设置为 600 秒。 domain->server->配置->超载

最长线程粘滞时间:600 默认为600s 粘滞线程计数:20 默认为0

数据库连接池调整

优化之前使用的是默认连接池和参数,优化之后改为JNDI方式连接。 默认的连接方式: JNDI连接方式: 在weblogic控制台创建oracle连接池

password=\

同时调整weblogicdatasource的参数初始连接数40 、最大连接数 100、空闲数30、缓存180。

Ibatis调整

调整sqlmap-config.xml文件 调整前:

SQL性能优化建议 1、查看性能消耗多的SQL

可以使用下面的SQL查看消耗IO和CPU比较多的SQL,要看清楚是应用程序执行的SQL还是系统执行的SQL。也可能通过oracle控制台来查看要优化的SQL。

(1)、获取磁盘IO前100位的SQL,IO消耗多的一般都是执行比较慢的SQL,需要重点优化。大多为应用程序执行的SQL。

SELECT* FROM(SELECTparsing_user_id, executions, sorts, command_type, disk_reads, sql_text, S.HASH_VALUE FROMv$sqlarea s WHERE S.PARSING_USER_ID =uid ORDERBYdisk_readsDESC) WHERErownum<100; (2)、获取CPU消耗前100位的SQL。大多为系统执行的SQL。

SELECT* FROM(SELECTparsing_user_id, executions, sorts, disk_reads, s.BUFFER_GETS, s.CPU_TIME, s.ELAPSED_TIME, sql_text, command_type, S.HASH_VALUE FROMv$sqlarea s WHERE S.PARSING_USER_ID =uid

ORDERBY CPU_TIME DESC) WHERErownum<100; 2、提高SQL查询效率

(1)、where子句中的连接顺序

ORACLE采用自下而上的顺序解析WHERE子句。根据这个原理,表之间的连接必须写在其他WHERE条件之前,那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾。

(2)、select子句中避免使用“*”

ORACLE在解析的过程中,会将‘*’依次转换成所有的列名,这个工作是通过查询数据字典完成的。这意味着将耗费更多的时间。

(3)、减少访问数据库的次数

ORACLE在内部执行了许多工作:解析SQL语句,估算索引的利用率,绑定变量,读数据块等。

(4)、使用decode函数来减少处理时间

使用DECODE函数可以避免重复扫描相同记录或重复连接相同的表。

(5)、 用Where子句替换HAVING子句

避免使用HAVING子句, HAVING 只会在检索出所有记录之后才对结果集进行过滤.。这个处理需要排序,总计等操作。如果能通过WHERE子句限制记录的数目,那就能减少这方面的开销。where的作用时间是在计算之前就完成的,而having就是在计算后才起作用的,所以在这种情况下,两者的结果会不同。在多表联接查询时,on比where更早起作用。系统首先根据各个表之间的联接条件,把多个表合成一个临时表后,再由where进行过滤,然后再计算,计算完后再由having进行过滤。

(6)、 通过内部函数提高SQL效率

复杂的SQL往往牺牲了执行效率。能够运用函数解决问题的方法在实际工作中是非常有意义的。

(7)、使用表的别名(Alias)

当在SQL语句中连接多个表时,请使用表的别名并把别名前缀于每个Column上.这样一来,就可以减少解析的时间并减少那些由Column歧义引起的语法错误。

(8)、用EXISTS替代IN、用NOT EXISTS替代NOT IN

在许多基于基础表的查询中,为了满足一个条件,往往需要对另一个表进行联接。在这种情况下, 使用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 * FROM EMP WHERE EMPNO > 0 AND DEPTNO IN(SELECT DEPTNO FROM DEPT WHERE LOC = ‘MELB’)

(9)、sql语句用大写的

因为oracle总是先解析sql语句,把小写的字母转换成大写的再执行。

(10)、避免在索引列上使用IS NULL和IS NOT NULL

避免在索引中使用任何可以为空的列,ORACLE将无法使用该索引。

(11)、用索引提高效率

索引是表的一个概念部分,用来提高检索数据的效率,ORACLE使用了一个复杂的自平衡B-tree结构。通常,通过索引查询数据比全表扫描要快。当ORACLE找出执行查询和Update语句的最佳路径时,ORACLE优化器将使用索引。同样在联结多个表时使用索引也可以提高效率。

另一个使用索引的好处是,它提供了主键(primary key)的唯一性验证。那些LONG或LONG RAW数据类型,你可以索引几乎所有的列。通常,在大型表中使用索引特别有效。当然,你也会发现,在扫描小表时,使用索引同样能提高效率。

虽然使用索引能得到查询效率的提高,但是我们也必须注意到它的代价。索引需要空间来存储,也需要定期维护。每当有记录在表中增减或索引列被修改时,索引本身也会被修改。这意味着每条记录的INSERT,DELETE ,UPDATE将为此多付出4,5 次的磁盘I/O 。因为索引需要额外的存储空间和处理,那些不必要的索引反而会使查询反应时间变慢。

定期的重构索引是有必要的。

ALTER INDEX REBUILD FAQ

1、Caused by: java.net.SocketException: No buffer space available (maximum connections reached?): connect

调整setDomainEnv.sh内存大小,见<修改weblogic域环境的内存大小> 2、Too many open files

使用命令:lsof -p 进程号 | wc–l 查看当前weblogic节点的打开文件数量,默认的最大值为1024

本文来源:https://www.bwwdw.com/article/nadw.html

Top