11G Concepts(翻译第十五章) Process Architecture(进程体系结构)

第十五章Process Architecture(进程体系结构)

本章讨论了Oracle数据库的进程。

这一章包含下面小节:

·Introduction to Processes

·Overview of Client Processes

·Overview of Server Processes

·Overview of Background Processes

Introduction to Processes(进程介绍)

一个进程就是一个操作系统的机制,它可以运行连续的步骤。这个机制是依赖于操作系统的。举个例子,在Linux上Oracle的一个后台进程就是一个linux进程。在windows上,一个Oracle后台进程就是oracle.exe进程中的一个线程而已。

通过进程去运行代码模块。所有连接Oracle数据库的用户,必须运行以下模块来访问数据库实例:

·应用程序或Oracle数据库实用工具

  一个数据库用户运行数据库应用,如预编译的程序或数据库工具如SQL*Plus,它们发出SQL语句到数据库。

·Oracle数据库代码

  每个用户有为其运行的Oracle数据库代码,以解释和处理应用程序的SQL语句。

一个进程正常在其私有的内存区域中运行。绝大多数进程会周期性写一个相关的trace file。

 

Multiple-Process Oracle Database Systems(多进程Oracle数据库系统)

Multiple-process Oracle(同样被成为multiuser(多用户)数据库)使用一些进程去运行Oracle数据库代码的不同部分,以及额外附加一些进程提供给用户(要么是一个进程服务一个用户,要么是一个或个多个进程共享处理多个用户)。绝大多数数据库就的多用户的,因为一个数据库主要的优点就是管理多个用户同时对某数据发出请求。

每个数据库instance的进程执行一个特别的工作。通过将数据库的工作拆分,然后放到一些进程,多个用户和应用程序就可以同时连接到一个Instance,而系统还会提供很好的性能。

 

Types of Processes(进程的类型)

一个数据库instance(实例)包含这些类型的进程,或者说与这些进程类型进行交互。

·Client processes(客户端进程)运行引用或者Oracle工具代码

·Oracle processes(Oracle进程)运行Oacle数据库代码,Oracle processes包括下面两个子类型:

  OBackground processes(后台进程)和实例一起启动,执行一些维护任务比如执行instance recovery,清理进程,写redo buffers 到磁盘等等。

  OServer processes(服务进程)执行基于client请求的工作

举个例子,这些进程解析SQL查询,将它们放到sharedpool,为每个查询创建和执行一个查询计划,以及将buffer 从 buffercache 读出  或者从磁盘中读出。

注意:server process,以及这些进程分配的内存,都是运行在instance中的。Instance在server processes停止后,依然是运行的。

  OSlave processes(从属进程)为一个background或server 进程执行额外的任务。

 

进程结构的变化依赖与操作系统以及 对数据库可选项的选择。举个例子,连接用户的代码,可以被设置为 dedicated server或shared server连接模式。在shared server体系结构,每个server 进程上运行的数据库代码可以服务于多个client 进程

下午显示了一个SGA和后台进程使用dedicated(专用)服务连接模式。应用是通过client process运行的,它和dedicated server进程不同,server进程是运行着数据库的代码。每个client进程都有它自己的server 进程(server进程有自己的PGA)。

11G Concepts(翻译第十五章) Process Architecture(进程体系结构)

 

Overview of Client Processes(客户端进程概述)

当一个用户运行一个应用程序类似 Pro*C程序或SQL*Plus,操作系统会创建一个client进程(有些时候也叫user 进程)来运行用户的应用。该Client应用程序有已经链接的Oracle数据库类库,这个类库提供与数据库进行通讯所需的APIs

 

Client and Server Processes(客户进程以及服务进程)

Client进程和Oracle 进程有很重要的不同,Oracle进程直接与实例进行交互的。服务于client进程的Oracle进程可以在SGA中读和写,而client 进程却不行。一个client进程可以运行在数据库主机以外的主机上,而Oracle进程不行。

举个栗子,假设一个用户在client主机上运行了SQL*Plus 以及通过网络连接到在不同主机上的数据库sample(数据库实例还没有启动):

SQL> CONNECT SYS@inst1 AS SYSDBA

Enter password: *********

Connected to an idle instance.

在client主机上,查找进程为sqlplus或sample 将只显示sqlplus进程:

% ps -ef | grep -e sample -e sqlplus | grep -v grep
clientuser 29437 29436  0 15:40 pts/1    00:00:00 sqlplus           as sysdba

在服务器主机上,查询进程为sqlplus或sample将显示一个非本地连接的服务进程:

% ps -ef | grep -e sample -e sqlplus | grep -v grep
serveruser 29441     1  0 15:40 ?        00:00:00 oraclesample (LOCAL=NO)

 

Connections and Sessions(连接和会话)

一个Connection(连接)是在client 进程以及database instance之间的物理连接。一个连接路径是通过使用进程间的连接机制或网络软件 建立起来的。基本上,一个连接发生在 一个client进程 和一个server process之间,或一个client进程 和一个 dispatcher(调度器)之间,但它通常可以在client 进程和Oracle Connection Manager(CMAN)之间建立。

一个session(会话)是一个数据库实例中的一个逻辑的存在,它代表一个当前用户登录到数据库的状态。举个栗子,当一个用户/密码被数据库验证通过时,会建立一个session。一个session存在时间为从验证通过一直到用户disconnect或者退出数据库应用程序。

一个单独的连接,可以有0,1,乃至多个session建立其上。这些session之间是独立的:一个session 提交操作,不会影响其他session中的事务。

 注意:如果OracleNET connection pooling(连接池,共享模式的东西)配置了,那么也有可能出现连接断开,但是session不受影响

可以有多个session同时存在,且都是一个数据库用户。如下图显示,用户hr可以有多个连接。在专有连接模式中,数据库会为每个connection(连接) 创建一个dedicated server 进程.只有导致它创建的client 进程才可以使用它。在共享连接模式,很多client进程可以访问一个shared server 进程。

11G Concepts(翻译第十五章) Process Architecture(进程体系结构)

下图显示了一个案例,hr有一个连接,但是这个连接有两个session


11G Concepts(翻译第十五章) Process Architecture(进程体系结构)

产生一个 SQL的 autotrace报告可以重现上图这种情况。

 

例子:一个连接拥有两个session

SQL> SELECTSID, SERIAL#, PADDR FROM V$SESSION WHERE USERNAME = USER;

 

SID SERIAL# PADDR

--- ---------------

 90     91 3BE2E41C



SQL> SETAUTOTRACE ON STATISTICS;

SQL> SELECTSID, SERIAL#, PADDR FROM V$SESSION WHERE USERNAME = USER;

 

SID SERIAL# PADDR

--- ---------------

 88     93 3BE2E41C

 90     91 3BE2E41C

SQL> DISCONNECT

这个DISCONNECT命令,实际上只是中断了session,而不是连接(connection),打开一个新的中断,然后通过不同用户连接到这个实例,然后通过如下的查询,可以看到上面的connect(连接)依然是active的

SQL> CONNECTdba1@inst1

Password: ********

Connected.

SQL> SELECTPROGRAM FROM V$PROCESS WHERE ADDR = HEXTORAW(‘3BE2E41C‘);

 

PROGRAM

------------------------------------------------

oracle@stbcs09-1(TNS V1-V3)

 

Overview of Server Processes(服务进程的概述)

Oracle数据库创建一个server进程去处理client进程的请求。一个client进程总是通过一个单独的serverprocess来访问数据库。

一个数据库应用对应的服务进程可以执行下面一或多个任务:

·解析和执行通过应用发布的SQL,包括创建和执行query plan(执行计划的一种)

·执行PL/SQL代码

·从数据库文件中读取数据块到buffer cache(DBWn后台进程是将脏快写入磁盘)

·对应用程序返回结果,应用可以处理这些信息

 

Dedicated Server Processes(专有服务进程)

在专有连接模式,client连接关联且只关联一个服务进程。在LINUX,20个client进程连接到instance,那么就有20个服务进程伺候它们。

每个client进程和服务进程直接通信。这个服务进程在客户端进程里session的整个周期中,都是专有的。server 进程存储该进程特有的信息以及UGA到它自己的PGA中。

 

Shared Server Processes(共享服务进程)

在共享服务连接模式中,客户端应用通过网络连接到一个dispatcher process(调度进程),而不是一个server进程。举个例子,20个client进程可以连接到一个单独的 dispatcher进程。

Dispatch进程将接受连接到它的client发出的请求,然后把请求发布到large pool的请求队列。第一个可用的shared server进程从队列中获取这个请求,然后处理它。处理完后,shared server进程把结果放到dispatcher response(响应)队列。Dispatcher 进程监听着这个队列,而且将结果传送回client(客户端)

 

和专有连接模式一样,shared server进程也有它自己的PGA。然而,一个session的UGA则是在SGA中,这样任何一个shared server进程都可以访问这个session数据。

 

Overview of Background Processes(后台进程概述)

一个多进程数据库会使用一些额外的进程,这些进程叫background 进程(后台进程),后台进程执行数据库操作需要的维护工作以及提供给多用户最大化的性能。

每个后台进程都有自己单独的任务,不过会和其他进程配合工作。举个例子,LGWR进程把redo log buffer中的数据写到 online redo log文件中。当文件写满后可以归档了,LGWR会发信号给别的进程来归档这个文件。

Oracle数据库在实例启动时会自动创建后台进程。一个实例可以有很多后台进程,在不同的数据库配置中,并不是所有的后台进程都会存在的。

下面查询将列出有哪些后台进程在你的数据库中运行:

SELECT PNAME

FROM   V$PROCESS

WHERE  PNAME IS NOT NULL

ORDER BY PNAME;

本节包含一下几个主题:

·Mandatory Background Processes

·Optional Background Processes

·Slave Processes

 

Mandatory Background Processes(强制后台进程)

Mandatory background processes是在标准数据库配置中,都会存在的。当实例使用最低限度的参数配置来启动实例时,它们都会默认运行。

这个小节描述了下面这些强制后台进程:

·Process Monitor Process (PMON)

·System Monitor Process (SMON)

·Database Writer Process (DBWn)

·Log Writer Process (LGWR)

·Checkpoint Process (CKPT)

·Manageability Monitor Processes (MMON and MMNL)

·Recoverer Process (RECO)

 

Process Monitor Process (PMON)(进程监控器)

Process monitor(PMON)这个监控器会监控其他进程,以及在server或dispatcher进程非正常结束时,回收它们。PMON的职责是清理client 进程曾经使用的buffer cache和将资源释放。举个例子,PMON会重新设置 transaction table 中相关事务的状态(如置为非action),释放不再需要的锁,以及从active process列表中移除process ID。

 

PMON同样要将instance(实例)和dispatcherprocess的信息注册到Oracle Net listener(监听)。当一个实例启动,PMON轮询监听,来判断监听是否运行。如果监听运行,那么PMON将有关参数传送给它。如果监听没有运行,那么PMON会周期性的去尝试联系它

 

System Monitor Process (SMON)(系统监控进程)

System monitor process(SMON)负责各种系统级的清理工作。分配给SMON的工作包括:

·执行instance recovery,如果需要的话,在实例启动的阶段。在Oracle RAC中,一个实例的SMON可以为一个故障实例执行 instance recovery。

·在instance recovery期间因为文件或表空间offline而没有recovery的事务,会在表空间和文件恢复online的时候进行recover。

·清理不使用临时段,举个栗子,在创建一个索引时,数据库会分配一些extent给它,如果操作发生了错误,那么SMON会把这些临时的空间给清理屌。

·在dictionary-managed(字典管理)的表空间中,会合并相连的空闲extents。

SMON会周期性的检查时候有东西需要它。其他进程可以在检测到有需要SMON的地方时通知SMON来处理。

 

Database Writer Process (DBWn)(数据库写进程)

DBWn把buffers中的内容写到数据文件。DBWn进程把buffercache中修改过的buffer 写到磁盘中。虽然大多数系统中,一个write 进程(DBW0)已经足够了,但是你依然可以配置额外的进程DBW1到DBW9以及DBWa到DBWj,来增加写的性能(如果你系统修改数据非常多)

这些附加的DBWn进程在唯一进程系统中是无用的。

DBWn进程在下面条件时会将脏的buffer写入到磁盘:

·当一个server进程在扫描了一大堆buffers后(超过了一个阀值)还没有找到clean 可重用的buffer,那么server进程会给DBWn发信号,让它去写。DBWn尽可能的异步写入脏的buffer以便同时执行其他处理。

·DBWn周期性的将脏buffer写出,用来推进checkpoint(检查点),检查点指的是实例恢复时在redo log 上面的开始点。在log上的checkpoint 取决于buffer cache里最老的dirty buffer。

 

在大多数情况下,DBWn写入的块都是离散分布在磁盘删哪个,因此,往往比LGWR所执行的顺序写入速度要慢。DBWn尽可能的执行多块写来提高效率。多块写时块的数量 根据操作系统的不同而不同。

 

Log Writer Process (LGWR)(log写程序)

LGWR管理着redo log buffer。LGWR会把log buffer中的一个连续的部分写入到onlineredo log文件。通过与  离散写入脏buffer到磁盘的任务  分离(LGWR是顺序写)这样提升了整个数据库的性能。

在下面情况,LGWR把buffer中从上次写入之后的所有redo 条目都写入磁盘:

·用户提交一个事务

·一个在线日志的log switch 发生。

·离上次LGWR写入三秒后

·redo log buffer 三分之一满或者 1M大小的内容时

·DBWn写入修改buffers 到磁盘

  在DBWn写脏buffer之前,与这些脏buffer相关的redorecords必须已经写到磁盘里了(write-ahead protocol)。如果DBWn发现一些相关的redo records还没写入,那么它会发信号给LGWR去写这些records到磁盘,等LGWR写入完成后,它才把脏的buffer写到磁盘中。

LGWR and Commits(LGWR和提交)

Oracle 数据库使用fast commit机制来提高事务提交的性能。当一个用户发布COMMIT语句,事务被分配一个system change number(SCN)。LGWR写一个commit 记录到redo log buffer然后把这条记录以及这个事务相关的记录立即写入到磁盘。

Redo log buffer是循环使用的。当LGWR把redo logbuffer中的redo条目写入到redo log文件时,server进程新复制进来的条目可以覆盖掉被写入的条目。LGWR正常来说写的足够快,保证buffer中的空间总是够用的,哪怕redo log很多。

事务提交的记录作为一个单独的redo条目,用来确定事务是提交的,事务记录写入磁盘后,哪怕相关的data buffers还没被写入到磁盘,但是Oracle数据库也会返回提交已成功。而数据块相关的改变会延迟,直到DBWn能够更有效的写入它们到数据文件时。

 注意:LGWR可以在事务提交之前就写入到redolog 文件中。只有之后事务提交了,这些条目才会成为永久的。

当事务提交量密集时,LGWR可以使用group commits。举个栗子,一个用户提交,导致LGWR写和事务相关的redo 条目到磁盘,在这次写入过程中,其他用户也提交了,LGWR只有在之前提交写入完成之后,才能写这些提交。在之前的写入完成以后,LGWR可以把等待写入的事务们的这些条目,在一个操作中全部写入。通过这种方式,数据库减少了磁盘I/O和增加了性能。如果提交请求一直很高频率,那么LGWR的每个写,都可能包含多个提交的记录。

 

LGWR and Inaccessible Files(LGWR和不可访问的文件)

LGWR同对redo log active组中的所有文件写入。如果组中的一个文件不可访问,那么LGWR依然会继续写组中的其他文件,然后写一个错误到 LGWR trace文件和alert log文件。如果组中的所有文件都损坏了,或组暂时不可用(因为还没归档完毕)那么LGWR将停止工作。

 

Checkpoint Process (CKPT)(检查点进程)

CKPT会把 检查点信息 更新到控制文件中,以及数据文件的头部,以及发信号给DBWn去写块到磁盘。检查点信息 包括 检查点的位置,SCN,位于哪个online redo log上,等等。如下图所示,CKPT并不会写数据块到数据文件或redo条目到online redo log文件。

11G Concepts(翻译第十五章) Process Architecture(进程体系结构)

Manageability Monitor Processes (MMON and MMNL)(可管理性监控进程)

MMON执行和Automatic WorkloadRepository(AWR)相关的很多任务。举个例子,当某个度量值超过了阀值, 制作一个快照,以及捕获SQL最近修改的对象的统计信息 时 会发生写入操作。

Manageability monitor lite process(MMNL),从SGA中ActiveSession History(ASH) buffer中把统计的资料写到磁盘。到ASH buffer满的时候 MMNL会把它写到磁盘上。

 

Recoverer Process (RECO)

在distributed database(通过DBLINK连着的库)中,recover process(RECO)会自动处理错误的distributed transactions 。在一个两阶段提交事务中,一个节点的RECO进程会自动连接其他涉及的数据库。当RECO重建数据库之间的连接时,它将自动回滚所有的两阶段事务,把所有数据库中pending transaction table中与被回滚的事务像关联的行都移除。

 

Optional Background Processes(可选的后台进程)

可选进程就是任何后台进程(除了强制启动的)。绝大多数可选后台进程,都是针对一些任务或特性。举个例子,比如Oracle Streams Advanced Queuing(QA)或 OracleAutomatic Storage Management(Oracle ASM)的相关进程只有在这些特性启用时,进程才会启动

这一节描述了一些通用的可选进程:

·Archiver Processes (ARCn)

·Job Queue Processes (CJQ0 and Jnnn)

·Flashback Data Archiver Process (FBDA)

·Space Management Coordinator Process (SMCO)

Archiver Processes (ARCn)(归档器进程)

在发生redo log 切换时ARCn进程负责将online redo log文件复制到 归档位置。这些进程同样可以收集事务redo数据然后把它们传输到standby database(DG)位置。只有在数据库为ARCHIVELOG mode(归档模式),且自动归档开启时,这些进程会存在。

 

Job Queue Processes (CJQ0 and Jnnn)(job队列进程)

Oracle数据库使用job queue 进程来运行用户的jobs。一个job,是一个用户自定义的有计划的任务(运行一次或多次)。举个例子,你可以使用job queue(job队列)来预设一个长时间运行的更新,在后台运行。给一个开始的日期和时间间隔,job queue进程会在下个时间间隔过后尝试运行这个job

Oracle数据库动态管理job queue进程,因此,当有需要的时候,可以启用更多的job queue 进程。当进程空闲后,数据库会释放它们所使用的资源。

动态job queue进程可以在一个给定的间隔并发运行大量的job,事件发生的顺序如下:

1、  job coordinator process(CJQ0 job协调进程)会根据OracleScheduler的需要自动启动或者关闭。这个协调进程周期性的select  JOB$表中需要运行的jobs。

2、  协调进程动态产生jobqueue slave processes(Jnnn)来运行jobs

3、  Job queue 进程运行由CJQ0进程选择的jobs中的一个。每个job queue进程在一个时间只能运行一个job,直到完成。

4、  在进程完成一个job的执行后,它轮询其他job。如果没有job需要运行,那么它进入睡眠状态,会周期性的醒来去轮询。如果进程没找到任何新的job,那么它会在预设的时间间隔后终止。

初始化参数JOB_QUEUE_PROCESSES设置是实例中可以并发运行job queue进程的最大数量。

注意:如果JOB_QUEUE_PROCESSES设为0,那么job协调进程就不会启动了。

 

Flashback Data Archiver Process (FBDA)(闪回数据归档进程)

FBDA进程将 被追踪表 的历史行数归档到 FlashbackData Archives.当一个事务在被追踪表DML,且事务提交时,这个进程会把这些被操作过的行的前镜像存储到Flashback Data Archive。它还保存了当前行的元数据。

FBDA自动管理flash back dataarchive的空间,结构,保存时间。另外,process会保存一个痕迹,来说明这个被归档的行的事务 发生的时间离现在多长时间了。

 

Space Management Coordinator Process (SMCO)(空间管理协调进程)

SMCO进程协调 和任务相关的多种空间管理的执行,比如预先空间划分,以及空间回收。SMCO动态产生小弟进程(Wnnn)来执行任务。

Slave Processes(奴隶进程,或小弟进程)

小弟进程,是为其他进程工作的小弟进程。这小节描述了Oracle数据库使用的一些小弟进程。

 

I/O Slave Processes(I/O奴隶进程)

I/O奴隶进程(Innn),在不支持异步I/O的系统和硬件上模拟一步I/O。异步I/O,没有对传输没有时间要求,使其他进程在传输完成之前就可以开始

举个例子,假设一个应用 在一个不支持异步I/O的操作系统上 写入了1000个块,每次写都是顺序发生,等待上一个写完成后才继续写。在异步I/O的磁盘,应用可以把块批量写入,然后在等待完成通知的同时去干其他工作。

为了模拟异步I/O,一个进程管理着几个努力进程。Invoker process(调用进程)给每个奴隶进程分配工作,这些奴隶进程会等待每个写完成,并在完成后报告调用进程。

在真正的异步I/O,操作系统会等待I/O结束,然后报告给进程。而模拟异步I/O,奴隶进程会等待并报告给调用者。

数据库支持下列不同类型的I/O奴隶进程:

·Recovery Manaer(RMAN)使用的I/O奴隶进程

  当使用RMAN备份或者恢复数据,你可以在disk,tape两种类型的硬件上使用I/O奴隶进程。

·Database writer slaves(数据库写入其奴隶进程)

  如果服务器只有一个CPU,则使用多个DBWn并不现实。此时数据库可以把I/O分布给多个奴隶进程。DBWR是扫描buffercache LRU列表找寻需要写入磁盘的块的唯一进程,那么I/O奴隶进程为这些块执行I/O操作。

 

Parallel Query Slaves(并行查询奴隶)

在parallel execution(并行执行),server 进程作为 parallel execution coordinator(并行执行协调器) 有责任去解析查询,分配和控制 奴隶进程,以及把结果 推送给用户。给出了一个SQL 查询的查询计划,协调器会把执行计划中的每个(operators)操作分解为并行片,按照查询中指定的顺序运行它们,然后奴隶进程执行这些(operators)产生的结果再整合起来。

下图显示了对employees表的并行扫描。表动态分割(或动态分区)为加载单元,称之为(granules)。一个granule是表中的一些块,由一个奴隶进程读取处理,这个过程称之为 parallel execution server ,它用Pnnn作为名字格式

11G Concepts(翻译第十五章) Process Architecture(进程体系结构)

数据库在execution server 执行时会把granules映射给它们。当一个execution server完成从对应的granule中读取行。以及还有granules剩余,它将会从协调器中获取另外的一个granule。这个操作过程将持续到表被读完。Execution servers将结果推送回协调器,它将这些片组装成所需的full table scan。

单个操作的Parallel executin server 数量,就是一个操作的degree ofparallelism(并行度)。一个SQL语句中的多个操作,都拥有一样的并行度.

 


11G Concepts(翻译第十五章) Process Architecture(进程体系结构)

上一篇:算法之旅,直奔pair


下一篇:EasyHook库系列使用教程之二插入钩子接口