eygle.com   eygle.com
eygle.com eygle
eygle.com  
 

« 浙江移动完成国内最大规模的Oracle数据库升级 | Blog首页 | 祝贺ITPUB论坛12周年 - 2013 已是12年转瞬 »

如何提高Oracle进程的优先级 - 实现进程实时调度
modb.pro

在繁忙的系统中,我们总是会期望提高某些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,实时调度策略,时间片轮转;

其中 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)时,以下是一些细节上的说明:

  • 当实时进程准备就绪后,如果当前CPU正在运行非实时进程,则实时进程立即抢占非实时进程;
  • RR进程和FIFO进程都采用实时优先级做为调度的权值标准,RR实际上是FIFO的一个延伸;
  • FIFO时,如果两个进程的优先级一样,则这两个优先级一样的进程具体执行哪一个是由其在队列中的位置决定的,这样导致一些不公正性,如果将两个优先级一样的任务的调度策略都设为RR,则保证了这两个任务可以循环执行,保证了公平。

在MOS (My Oracle Support)的文档:602419.1 上,还描述了这样一种情况:LMS not running in RT (real time) mode in 10.2.0.3 RAC database (Doc ID 602419.1)。

该案例提示:当 $ORACLE_HOME/bin/oradism 权限不对时,可能会导致进程无法运行在实时模式。
在该案例中oradism的权限如下:
384 -r-sr-s--- 1 oracle oinstall 186568 Dec 20 2006 /n01/app/oracle/product/10.2.0/bin/oradism <<===
正常情况下,oradism 的属主应该为root,并且具有setuid位设置,以下是在我的系统中oradism的正确权限设置:

[eygle@enmoteam1 bin]$ ls -l oradism
-rwsr-x--- 1 root oinstall 71758 9月  17 2011 oradism

供参考。


历史上的今天...
    >> 2019-08-15文章:
    >> 2014-08-15文章:
    >> 2007-08-15文章:
    >> 2006-08-15文章:
           在北京 见到彩虹
    >> 2005-08-15文章:
           孟静其人

By eygle on 2013-08-15 09:52 | Comments (0) | FAQ | HowTo | 3122 |


CopyRight © 2004~2020 云和恩墨,成就未来!, All rights reserved.
数据恢复·紧急救援·性能优化 云和恩墨 24x7 热线电话:400-600-8755 业务咨询:010-59007017-7040 or 7037 业务合作: marketing@enmotech.com