Comments embedded.
1.分配足够的交换空间
内存交换(swapping)可以造成很大的内存开销,应该将它最小化。在Solaris上使用sar -w或vmstat -S命令来检查交换。若系统在交换,且需要节省内存,则应采用以下措施:
[snipped]
在Solaris上用swap -l命令决定当前正在使用多少交换空间。使用swap -a命令向系统中增加交换区。用系统RAM两到四倍的交换空间启动数据库。若准备使用Oracle Developer、Oracle Applications或Oracle InterOffice,则使用更高的值。监控交换空间的使用,在必要时增加它。
Yong: Has anybody ever seen swapping? If you do, you're dangerously short of physical memory and should've done something much earlier. The suggestion that swap space should be 2 to 4 times of RAM is old, outdated and may only be applicable to systems with probably 100 MB memory or less. When do you use such a small machine as your production server?
2.控制分页
内存分页(paging)可能没有交换那样问题严重,因为为了运行,整个应用程序不必全部放在内存中。少量的分页不可能显著地影响系统的性能。为了检测过多的分页,在快速响应或空闲期间运行测量,并与响应迟缓时的测量进行比较。使用vmstat或sar -p监控分页。
Yong: Why not tell us how much is too much and what column to look for? For your information, you need to look at vmstat sr column (for page daemon scan rate) as well as po (pageout). How much is too much? I'd say consistently over 1000 scan rate is.
若系统有过多的页面活动,则需考虑以下解决办法:
安装更多的内存;
将一些工作移到另一系统中;
配置系统核心使用更少的内存;
Yong: "配置系统核心" is probably something the author has no experience with. What kernel parameter do you modify to reduce paging? Sun doesn't recommend you mess with lotsfree, minfree etc.. You may reduce ncsize, play with maxpgio. But that's not the way to get more memory back. Instead if you're using Solaris 2.6, you need to set priority_paging = 1. Other than that, reduce load and buy more memory.
保持SGA在单个共享内存段中。
Yong: This simply means you set shmsys:shminfo_shmmax=4294967295 for 32-bit OS, regardless your memory size. For old Oracle versions, Oracle probably had more conservative recommendation. But I'd set it to 4 billion and see if you can boot anyway. (If you can't, boot with boot -as)
没有足够的共享内存,将不能够启动数据库。这时,我们可以重新配置UNIX核心,以增加共享内存。
Yong: Again, the fact that the author doesn't go further probably means he knows nothing beyond.
调整磁盘I/O
I/O瓶颈是最容易识别的性能问题。跨所有可用的磁盘均匀地平衡I/O,可以减少磁盘存取的时间。对于较小的数据库和不使用并行查询选项的那些数据库,要确保不同的数据文件和表空间跨可用的磁盘分布。
Yong: If you think "对于较小的数据库和不使用并行查询选项的那些数据库", you don't need to consider spreading disk I/O, you're wrong.
1.调整DBWR,增加写带宽
Oracle提供以下方法以防止DBWR(数据库写进程)活动成为瓶颈:
使用异步I/O 异步I/O允许进程继续处理下一个操作,而不必等待在发出写后,最小化了空闲时间,因而改善了系统性能。Solaris支持原始设备和文件系统数据文件的异步I/O。
Yong: Just a note. This is on by default in Solaris. But there's some controversy about kaio(), undocumented yet exposed by truss(1).
使用I/O从属 I/O从属(slave)是专用的进程,其惟一功能是执行I/O。它们代替Oracle 7的多个DBWR特性(实际上它们是多个DRWR的概括,可以由其它进程分布)。不管异步I/O是否可用,它们都可以操作。若设置的话,它们被从LARGE_POOL_SIZE分配,否则从共享内存缓冲区分配。
初始化参数控制了I/O从属的行为,其中DISK_ASYNCH_IO和TAPE_ASYNCH_IO允许分别为磁盘和磁带设备关闭异步I/O(因为每个进程类型的I/O从属缺省为0,除非明确设置,否则没有I/O从属被发布)。
若DISK_ASYNCH_IO或TAPE_ASYNCH_IO无效,则DBWR_IO_SLAVES应该设置大于0,否则DBWR将成为一个瓶颈。在这种情况下,Solaris上DBWR_IO_SLAVES的最佳值为4,而在LGWR_IO_SLAVES的情况下,发布的从属不应该超过9个。
DB_WRITER_PROCESSES代替Oracle 7的参数DB_WRITERS,指定某实例的数据库写进程的初始数量。若使用DBWR_IO_SLAVES,则只有一个数据库写进程被使用,而不管DB_WRITER_PROCESSES的设置。
Yong: Advice here should be "Whenever you can, use db_writer_processes in favor of I/O slaves".
2.使用IOSTAT查找大磁盘请求队列
请求队列显示特定磁盘设备上等待服务的I/O请求有多长。由大量的磁盘I/O或由平均查找时间I/O引起请求队列。磁盘请求队列应该为0或接近于0。
Yong: Addition: With RAID, iostat is of limited use.
3.选择合适的文件系统类型
Sun SPARC Solaris允许选择文件系统。文件系统有不同特性,它们用于存取数据的技术对数据库性能有实质性的影响。文件系统通常包括:
.s5:UNIX系统V文件系统;
.ufs:UNIX文件系统(由BSD UNIX派生);
.vxfs:Veritas文件系统;
.原始设备:没有文件系统。
通常没有事实证明文件系统与文件系统是相配的,甚至不同的ufs文件系统也难以比较(因为执行不同),尽管ufs通常是高性能的选择,但根据选择文件系统的不同,性能差别变化也很大。
Yong: I'm surprised the author doesn't have any recommendation here. Nowadays s5 is almost complete history. UFS is the standard on Solaris. VXFS is great if you can afford it. Raw is also good and commonly used for redo log files. But with development of all third-party file systems, performance advantage of raw is less obvious than before.
监控磁盘性能
使用sar -b和sar -u可以监控磁盘性能。
sar -b对磁盘性能的重要性如下:
(1)bread/s、bwrit/s:块读和块写,它们对文件系统而言是非常重要的。
(2)pread/s、pwrit/s:分区读和分区写,它们对原始分区数据库系统是非常重要的。
Oracle块大小应该匹配磁盘块大小或是磁盘块大小的倍数。
Yong: Not quite right. According to Steve Adams, when Oracle says match with OS block size, they don't mean disk allocation block size, which is 512 bytes. They really mean disk I/O size, almost always 8192 bytes on UFS. Check with df -g.
若可能的话,在数据库文件使用文件系统前在分区上做文件系统检查;然后制作一个新的文件系统,确保它是清洁的和不破碎的。尽可能地均匀分布磁盘I/O,将数据库文件与日志文件分开。
[snipped]
Yong Huang