在繁忙的系统中,我们总是会期望提高某些Oracle进程的优先级,使其能够更容易的获得CPU资源,执行重要的任务。在Oracle 10g之前,这样的工作要通过操作系统上的设置来实现,在Oracle 10gR2中,一个新的隐含参数被引入到数据库中,用于配置提升Oracle后台进程的优先级。
这个核心参数是: _high_priority_processes
在 10.2 版本中,Oracle 缺省的对 LMS* 设置高优先级,在11g开始,对 LMS*||VKTM 设置高优先级。
在Linux平台上,进程的内核调用分为三类:
-
TS - SCHED_OTHER (SCHED_NORMAL) ,这是分时调度策略,缺省的正常级别;
-
FF - SCHED_FIFO,这是实时调度策略,先到先服务,先进先出;
-
RR - SCHED_RR,实时调度策略,时间片轮转;
-
当实时进程准备就绪后,如果当前CPU正在运行非实时进程,则实时进程立即抢占非实时进程;
-
RR进程和FIFO进程都采用实时优先级做为调度的权值标准,RR实际上是FIFO的一个延伸;
-
FIFO时,如果两个进程的优先级一样,则这两个优先级一样的进程具体执行哪一个是由其在队列中的位置决定的,这样导致一些不公正性,如果将两个优先级一样的任务的调度策略都设为RR,则保证了这两个任务可以循环执行,保证了公平。
其中 FF,RR 都是实时调度队列的,实时进程调度队列,是从优先级最高的进程运行,如果当前运行的是FIFO进程,如果进程不主动让出CPU,其他进程都不能运行,如果是RR(时间片轮转)的,则不会一直独占CPU,运行一段时间会被切换出来。
以下是在Linux中设置PMON进程提高优先级的测试。
[eygle@enmoteam2 ~]$ sqlplus / as sysdba
SQL*Plus: Release 11.2.0.3.0 Production on Fri Aug 9 10:43:50 2013
Copyright (c) 1982, 2011, Oracle. All rights reserved.
Connected to an idle instance.
SQL> startup
ORACLE instance started.
Total System Global Area 1670221824 bytes
Fixed Size 2228944 bytes
Variable Size 402656560 bytes
Database Buffers 1258291200 bytes
Redo Buffers 7045120 bytes
Database mounted.
Database opened.
检查此时PMON进程的优先级为:TS 。
[eygle@enmoteam2 ~]$ ps -eo pid,class,pri,nice,time,args |grep pmon |grep -v grep
25424 TS 19 0 00:00:00 ora_pmon_enmot2
设置PMON进程,重新启动数据库:
SQL> alter system set "_high_priority_processes"="PMON" scope=spfile;
System altered.
SQL> shutdown abort;
ORACLE instance shut down.
SQL> startup
ORACLE instance started.
Total System Global Area 1670221824 bytes
Fixed Size 2228944 bytes
Variable Size 402656560 bytes
Database Buffers 1258291200 bytes
Redo Buffers 7045120 bytes
Database mounted.
Database opened.
此时检查,可以发现PMON进程运行在RR模式:
SQL> ! ps -eo pid,class,pri,nice,time,args |grep pmon |grep -v grep
26222 RR 41 - 00:00:00 ora_pmon_enmot2
在Solaris下有所不同,高优先级进程运行在RT模式 - Real Time,实时模式:
SQL> show parameter pri
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
_high_priority_processes string LMS*|LGWR|PMON
oracle@solaris:$ ps -eo pid,class,pri,nice,time,args |egrep 'lgwr|pmon' |grep -v grep
27674 RT 101 RT 00:00 ora_pmon_orcl
27694 RT 101 RT 00:00 ora_lgwr_orcl
注意,在RAC系统中,LMS*可能会导致一系列的LMS进程都获得高优先级,这可能是不必要的,也会抢占其他进程的资源,所以可以根据具体情况进行设置。
当系统中既有分时调度 - TS,又有时间片轮转调度(RR)和先进先出调度(FF)时,以下是一些细节上的说明:
供参考。