Linux Journal发表了一篇优化Oracle数据库的文章,感觉很有用。简单介绍其摘要,分享Linux在企业数据库中的应用。
作者:伯特斯卡尔佐
目前惠普、康柏、戴尔、IBM、甲骨文都在拥抱开源操作系统Linux。根据eWeek的统计,去年Linux服务器的销量占康柏的30%左右,戴尔的13.7%,IBM的13.5%。而且IBM在Linux IBM 2001上投资了10亿。英特尔最新的64位安腾CPU仅支持四种操作系统:Windows、Linux、AIX和惠普-UX。我们不要忘记,Oracle的9i数据库的Linux版本比Windows版本早一个月。
虽然Linux可以在从IBM S/390到Sun SPARC的服务器上运行,但对大多数人来说,英特尔是Linux运行最多的平台。本文讲的是如何通过简单的性能调整,将Oracle的性能提升1000%。
本文中使用的测试环境是一个Compaq 4 CPU,512 MB,8台服务器,带有7200 rpm SCSI磁盘,然后在几乎相同的单CPU Athlon系统上进行测试,该系统具有相同的内存,但只有一个7200 rpm Ultra 100 IDE磁盘。尽管最终结果与获得的百分比不同,但观察到的性能改善是一致的。
为简单起见,我们的测试环境采用TPC基准测试,这种测试广泛用于OLTP负载测试。Quest公司有一个叫Benchmark Factory的工具,让测试工作变得像发邮件一样简单。
接下来我们就分别通过DB和OS的调整来看测试结果。
DB1的初始化参数通常是不常见的。为了说明这个问题,我们使用这些参数作为基准。
DB1: Initial Database
数据库块大小2K
SGA缓冲区缓存64M
SGA共享池64M
SGA重做缓存4M
重做日志文件4M
表空间字典
TPC结果加载时间(秒)49.41
交易/秒8.152
显然,SGA的尺寸需要增加。让我们看看DB2的结果:
DB2: Cache Pool
数据库块大小2K
SGA缓冲区缓存128M
SGA共享池1.28亿平方米
SGA重做缓存4M
重做日志文件4M
表空间字典
TPC结果加载时间(秒)48.57
交易/秒9.147
增加SGA缓冲区似乎不会显著提高性能,加载时间仅增加1.73%。下面让我们增加SGA重做日志的大小:
DB3: Log Buffer
数据库块大小2K
SGA缓冲区缓存128M
SGA共享池1.28亿平方米
SGA重做缓存16M
重做日志文件16M
表空间字典
TPC结果加载时间(秒)41.39
事务/秒10.088我们可以看到加载时间增加了17.35%,TPS也增加了9.33%。因为加载和插入、更新和删除同时进行需要的空间超过8M,但是增加内存性能似乎并没有明显的提升,所以我们增加了块的大小:
DB4: 4K Block
数据库块大小4K
SGA缓冲区缓存128M
SGA共享池1.28亿平方米
SGA重做缓存16M
重做日志文件16M
表空间字典
TPC结果加载时间(秒)17.35
交易/秒10.179
我们看到加载时间增加了138%!并且对TPS值没有大的影响。下面的简单想法是将表空间的管理从目录切换到本地:
DB5: Local Tablespaces
数据库块大小4K
SGA缓冲区缓存128M
SGA共享池1.28亿平方米
SGA重做缓存16M
重做日志文件16M
本地表空间
TPC结果加载时间(秒)15.07
交易/秒10.425
让我们将数据库块增加到8K来看看结果:
DB6: 8K Block
数据库块大小为8K
SGA缓冲区缓存128M
SGA共享池1.28亿平方米
SGA重做缓存16M
重做日志文件16M
本地表空间
TPC结果加载时间(秒)11.42
交易/秒10.683
看来结果还不错。我们没有理由继续增加块的大小。我们还没有根据CPU的数量调整相应的参数。这一次,我们设置I/O进程的数量来继续调整:
DB7: I/O Slaves
数据库块大小为8K
SGA缓冲区缓存128M
SGA共享池1.28亿平方米
SGA重做缓存16M
重做日志文件16M
本地表空间
dbwr_io_slaves 4
lgwr_io_slaves(派生)4
TPC结果
加载时间(秒)10.48
交易/秒10.717
我们的测试是基于红帽6.2,内核版本是2.2.14-5smp。对于Linux内核,可以调整的参数有近百个,包括CPU类型、SMP支持、APIC支持、DMA支持、磁盘配额支持的IDE DMA默认参数等。根据Oracle的文档,我们要做的主要调整是共享内存和信号量的大小。SHMMAX最低配置为0x13000000,SEMMNI、SEMMSL、SEMOPN最低设置分别为100、512、100。这些参数可以通过以下命令设置:
# echo0x 13000000/proc/sys/kernel/shmmax
# echo 512 32000 100 100/proc/sys/kernel/SEM
OS1: 单内核和 IPC
TPC结果
加载时间(秒)9.54
交易/秒11.511
我们有理由相信新内核版本(2.2.16-3smp)的性能也应该得到提高:
OS2: Newer minor version kernel TPC Results
加载时间(秒)9.40
交易/秒11.522
目前有2.4版本的内核。相比2.2,性能有了很大的提升。我们采用2.4.1smp:
OS3: Newer major version kernel TPC Results
加载时间(秒)8.32
交易/秒12.815
默认情况下,Linux在读取时会更新上次读取时间,但这对我们来说并不重要,所以我们关闭这个选项,设置noatime的file属性。(Win NT和2000也有类似的设置)
如果只是相对于Oracle的数据文件进行设置,我们的命令是
输入文件名
整个目录的实现方法:chattr -R A directory_name
最好的方法是修改/etc/fstab,并为每个文件系统条目添加noatime关键字。
OS4: noatime file attribute
TPC结果
加载时间(秒)5.58
交易/秒13.884
调整Linux I/O的另一种方法是调整虚拟内存子系统,修改/ect/sysctl.cong文件并添加以下行:
VM . BD flush=100 1200 128 512 15 5000 500 1884 2
根据/usr/src/Linux/documentation/sysctl/VM . txt:
第一个参数是100%:控制缓冲区中的最大脏缓冲区数据。增加这个值意味着Linux可以延迟磁盘写入。
第二个参数1200 ndirty:给出bdflush一次可以写入磁盘的最大脏缓冲区。
第三个参数,128 nrefill:调用refill_freelist()时,bdflush添加到空闲缓冲区的最大缓冲区数。
Refill_freelist() 512:当这个数超过nref_dirt dirty缓冲区时,bdflush就会被唤醒。
第五个15和最后两个参数,1884和2,系统不使用,我们不修改。
Age_buffer 50*HZ,age_super参数5*HZ:控制Linux将脏缓冲区写入磁盘的最大等待时间。它用时钟的滴答数(jiffies)来表示,即每秒100个jiffies。
OS5: bdflush设置TPC结果
加载时间(秒)4.43
交易/秒14.988
经过上述一系列调整后,最终加载时间减少了1015.35%,TPS增加了。
下面是其他网友的补充
浅谈Oracle 性能优化
基于大型Oracle数据库的应用开发已经有六年的历史,经历了从最初的零数据到目前上亿数据存储的演变。在这次体验中,我遇到了各种性能问题和各种性能优化。
在这里,我主要分享一些数据库性能优化的方法和观点。
1、服务器要求及配置
服务器的性能至关重要。CPU主频要高,内存要大,IO读写速度块。
如何验证一个服务器的IO读写效率,可以用IOPS来衡量。普及一下IOPS的定义:IOPS(每秒输入输出操作数),即每秒的读写(I/O)操作次数。它主要用于数据库等场合来衡量随机访问的性能。目前SSD硬盘的IOPS基本都是一万。但是相对成本也比较高。
在Oracle数据使用场景中,可以实现以下语句来查看当前服务器的IOPS:
声明
max _ iops _ out pls _ integer
max _ mbps _ out pls _ integer
actual _ latency _ out pls _整数;
开始
dbms _资源_管理器. calibrate_io(
max_iops=max_iops_out,
max_mbps=max_mbps_out,
实际_延迟=实际_延迟_输出);
DBMS _ output . put _ line( max _ IOPs= | | max _ IOPs _ out
|| ,max_mbps= || max_mbps_out
|| ,actual _ latency= | | actual _ latency _ out);
结束;
2、Oracle系统级的优化
这主要是针对ORACLE core的优化,包括ORACLE内存、文件大小、日志文件大小、回滚日志以及各种系统级参数的设置。
那么你如何发现当前的设置是否合理,
A.在Oracle中提供性能分析报告AWR和ASH报告。您可以通过命令获得此报告。涉及到各种指标值:内存设置是否合理,影响ORACLE慢的几个因素,数据文件读写速度等。
B.ORALCE-EM中的性能模块还可以用来检测ORALCE在各个时间节点的运行情况,从中捕获那些消耗资源的SQL语句,从而对其进行优化。
3、Oracle SQL语句的优化
在一百万的数据库级别,遇到的任何性能问题都可以通过SQL语句进行优化。有两个级别的优化:
1.通过索引,这种优化是最快的,效果也很明显。这里就不描述索引的合理使用了。网上有很多。
2.通过改变SQL语句的查询逻辑和算法。有一个有效的原则:先过滤小结果集,再通过这个小结果集与其他表关联。
在这里,希望大家提出一些其他的看法或者不同的看法。