本文主要介绍以下内容:
- 线程及多线程结构
- 描述UNIX 下的虚拟处理器是如何实现的
- 列出和解释虚拟处理器类别
- 描述服务器如何处理网络连接
- 设置与 VP 和线程相关的服务器配置参数
- 动态添加和移除虚拟处理器
1. 线程
线程是程序中正在执行的一段指令序列。 当多个线程在一个实体(在这里,实体就是进程的意思)中同时运行时,被称为多线程 。
线程在某些文献中有时被称为轻量级进程,因为它对操作系统的要求较少。
接下来我们来对比线程和进程的关系以及进程和操作系统的关系,以便解释什么是多线程。
1.1 单线程和多线程
1694414728366726×239 17.6 KB
可以将一个常规的不执行线程的 UNIX 进程想象成一个单线程的进程,虽然我们平时并不这么叫。该进程执行一条指令序列,操作系统负责调度和运行进程。
多线程处理 是为不同用户执行一个进程多次迭代的一种方式,而不必在操作系统级别形成该进程的多个实例。
一个多线程的进程可以有多个线程在 UNIX 进程内运行,每个线程按顺序运行并在特定时间点把控制权限让给其他线程。该过程的实现方式使多线程处理不同于简单地接收和执行从单个用户进程中得到的请求。
多线程处理是一个系统级的概念,通过多线程处理,程序执行机器级的指令来操纵进程,这样,程序就可以为多个用户而不是单个用户执行了。程序完全是在用户级别上执行这些指令,而不是 UNIX 内核级别。对 UNIX 来说,这种多线程的进程就是单个进程,和其他任何进程没有区别。
1.2 单线程进程
1694416637418846×378 12.1 KB
UNIX 是如何实现多重处理的:
每个 UNIX 进程有一个地址空间,由三个部分组成︰ 文本、 堆栈和数据。Text 段中包含机器指令,这些机器指令形成了程序的可执行代码。Stack 中包含程序功能正在使用的本地变量。最后, data 段包含程序的全局变量和静态变量、字符串、数组和其他数据。
在运行 1000 个进程的单处理器计算机上,在任何一个时间,只有一个进程被 UNIX 执行。每个进程运行一段特定的时长,之后进程被内核抢占(干扰),这样,下一个被调度的进程就可以运行了。当抢占一个正在运行的进程时,必须保存足够多的信息,以便一段时间后进程可以重新启动。这里的信息被称作进程上下文。上下文基本上由以下组件构成:
- 程序计数器指定下一个执行指令的地址。
- 堆栈指针包含堆栈中下一条目的当前地址。
- 通用寄存器包含进程执行过程中产生的数据。
1.3上下文切换
1694417326474875×384 21.6 KB
在 UNIX 系统中,当运行中的进程因操作系统原因而中断时,会发生上下文切换。要做到这一点,操作系统将当前运行的进程的上下文保存在内存中的预先分配好的数据结构中并加载按计划下一个要执行的进程的上下文。
加载上下文时将会把程序计数器、堆栈指针和所有通用寄存器恢复成最后一次等待进程被抢占时,操作系统所保存的值。加载上下文完成后,进程会在程序计数器指定的代码行开始位置继续执行。
1.4 多线程进程
1694417886864857×431 18 KB
在一个多线程进程中,每个线程有自己的上下文;也就是说,每个线程都有自己在代码(程序计数器)中的位置和自己的数据变量。多线程进程将上下文从一个线程切换到另一个线程的工作方式,类似于操作系统。
进程本身执行机器指令来将当前执行的线程复制出去,并将下一个计划执行的线程复制进来。这基本和操作系统的上下文切换实现了相同的效果。结果是,程序计数器指向文本段内的新指令,堆栈指针指向内存中一个不同的区域,通用寄存器恢复到此前保存的上下文的值。对于星瑞格数据库多线程处理来说,线程的堆栈保存在共享内存中,使它能够在服务器进程(虚拟处理器)之间移动。缺省堆栈大小为每个用户线程 32 KB。服务器检查堆栈溢出,并会自动扩展堆栈。
因此多线程进程就像一个迷你操作系统,负责处理如下的事务:
-
调度:当前运行的线程决定何时放弃对进程的控制并将其转移给另一个线程。当前运行的线程还通过内部优先级机制决定接下来来(该)运行哪个线程。
-
上下文切换:当前运行的线程决定是时候运行另一个线程时,它必须执行机器指令来完成线程之间的上下文切换。
和平常一样,UNIX 仍管理进程的调度和上下文切换。多线程进程管理线程的调度和上下文切换。
2. 虚拟处理器
1694419250330845×237 16 KB
组成数据库服务器的进程被称为虚拟处理器。每个虚拟处理器(VP)都属于一个虚拟处理器类。VP 类负责一组特定的任务(以线程的形式),如向逻辑日志写入或从磁盘中读取数据。这意味着某个类的一个 VP 只能运行同一类的线程。一个 VP 只能属于一个VP类。一个 VP 类可以有一个或多个 VP,在多数情况下,由系统管理员配置。VP 可执行文件的名称是 oninit 。所有类型的所有 VP 都是同一个 oninit 程序的实例。
3. 运行线程
线程可以在任何同类的虚拟处理器上运行。
1694420678180789×227 20.2 KB
线程或者运行在特定的处理器上,或者在一系列队列中的某个队列里。就绪队列 中包含了等待在处理器上运行的线程的上下文。当处理器空闲时,将从就绪队列中取得线程的上下文。内部优先级机制决定了处理器从队列中取用哪个线程。处理器用新线程上下文替代当前上下文,并继续代表新线程进行处理。
就绪队列在同类的处理器之间共享,以便线程可以在其生存期内在多个处理器之间迁移(尽管服务器倾向于使线程在同一进程上运行)。这一机制平衡了各个进程之间的工作,并确保线程在任何处理器可用时运行。
3.1 将控制权转移给另一个线程
1694422418706948×287 31.2 KB
在特定执行点,线程产生对虚拟处理器的控制。线程上下文放在等待队列或睡眠队列 (1) 上。另一个线程的上下文取自就绪队列并运行 (2)。
在某个特定的执行点,线程将虚拟处理器的控制权转移给另一个线程。可能会导致线程转移控制权的一些常见的操作有︰
- 等待磁盘读写入操作。
- 等待来自应用进程的请求。
- 等待锁或其他资源。
- 没有其他工作需要完成了。
一个线程也可能会在没有任何理由的情况下,将控制转移给另一个线程,只是为了给另一个线程运行的机会。
当线程转移控制时,它负责将自己的上下文置于一个队列中进行等待或睡眠。等待队列 基本上用于等待操作。睡眠队列 用于需要在一段时间后被唤醒的线程。
进程从就绪队列中获取另一个线程的上下文并用新线程内容替换原进程的上下文。处理器接着用新的上下文继续执行。
4. 服务器线程的优势
多线程架构具备以下优势:
-
完成相同工作所需的数据库服务器进程数目减少。在有大量用户的 OLTP 环境下尤其高效。您可以将其视为fan-in ,其中有大量的应用程序进程和少量服务器进程处理请求。另一个优势是因为由操作系统处理的进程数减少,因而系统可以支持更多的用户。
-
除了fan-in功能外,服务器还提供了一个fan-out 功能。多个数据库服务器进程可以为一个应用程序工作。
-
多线程架构将大部分由操作系统完成的上下文切换替换成由数据库服务器内的进程完成的上下文切换。在进程内完成上下文切换速度更快,因为涉及较少的信息交换。
-
数据库服务器可以进行自己的线程调度。这意味着由 DBMS 而不是操作系统来决定任务优先级。
-
多处理器系统本身提供的一些功能可以使这类架构更加高效。例如,我们可能会给重要的数据库服务器进程一些专属权限,来使用特定的处理器。
Fan-Out举例:
1694425972698920×440 31.3 KB
服务器的优势之一是它的fan-out功能。这意味用户可以利用多个数据库服务器处理器(如果有多个可用的CPU)同时工作来完成任务。服务器通常会为单个用户完成以下操作时创建多个线程:
- 排序Sorting
- 创建索引Indexing
- 恢复Recovery
6. 虚拟处理器类
类别 | 说明 | 配置 |
---|---|---|
CPU | 所有用户线程和一些系统线程运行在该VP类中。不允许阻塞 OS 调用。 | 可配置 |
PIO | 运行写入物理日志的内部线程。 | 1或2 个 VP |
LIO | 运行写入逻辑日志的内部线程。 | 1或2 个 VP |
AIO | 运行执行磁盘I/O 到cooked chunk的内部线程,或者当kernel I/O 没打开时所运行的内部线程。 | 可配置 |
ADT | 运行安全审计线程。 | 0或1 个 VP P |
classname | 以线程安全方式运行 UDR 的用户自定义的 VP。 | 可配置 |
MSC | 运行杂项任务线程。 | 1 个 VP |
SHM | 运行共享内存通信的内部线程 | 可配置的 |
STR | 运行流管道通信的内部线程 | 可配置的 |
TLI | 运行 TLI 网络通信的内部线程。 | 可配置的 |
SOC | 运行套接口网络通信的内部线程。 | 可配置的 |
ADM | 运行计时器。 | 1 VP |
OPT | 处理 BLOB 如何转移到光学子系统。 | 0 或者1 VP |
JVP | 执行 Java UDRs。包含 Java 虚拟机 | 可配置的 |
以上表格列出了服务器系统中可用的不同类型的 VP 类。每个 VP 类下的 VP 数目有些可以由系统管理员配置,其余则由服务器自动配置。
CPU – CPU VP 是大多数处理发生的地方。所有用户线程和一些系统线程在该类中的 VP 上运行。设置CPU类的目的是要把所有 CPU 密集的活动都放在这些进程中,使得这些进程始终保持忙碌状态不会过多睡眠(否则导致昂贵的操作系统上下文切换)。会造成阻塞系统的调用是不允许在该类VP上运行,例如从磁盘中读写或者等待应用程序消息的活动。服务器开启的时候,管理员可以按需增加或减少 CPU VP 的数目。
PIO – PIO VP 运行服务器写入磁盘物理日志的内部线程。服务器启动时,PIO VP 会被自动配置。通常分配一个 PIO VP。如果包含物理日志的 dbspace 被镜像,那么会有两个 PIO VP 被分配。
LIO – LIO VP 运行服务器写入磁盘逻辑日志的内部线程。服务器启动时,LIO VP 会被自动配置。通常分配一个 LIO VP。如果包含逻辑日志的 dbspace 被镜像,那么会有两个 PIO VP 被分配。
AIO – AIO(异步 I/O)VP 执行磁盘 到cooked chunk的I/O操作以及当kernel I/O 没开启时,磁盘到raw device(裸设备)的I/O操作,包括执行 SQL 语句所需的磁盘读写、检查点和其他 I/O 活动。AIO VP 的数目可以由系统管理员配置。服务器运行时可以添加更多的 AIO VP。
ADT- 这种虚拟处理器执行安全审计。如果 ADTMODE 配置参数非零,服务器启动时,审计VP也会同时启动。在服务器已启动的状态下,也可以使用 onaudit 实用程序启动审计VP。
classname - 此类虚拟处理器以线程安全方式运行用户自定义的例程,所以,如果例程失败,数据库服务器则不受影响。要设置用户自定义VP只需在数据库服务器初始化时把 VPCLASS 配置参数设置为 VP 名和 VPs 的数目。下面例子是配置文件中的某行,该配置文件定义了一个名为 myvp 的单用户定义 VP:
VPCLASS myvp,num=1
MSC – The MSC VP 执行各种繁杂的任务,比如用户许可和 UNIX 用户身份验证。只有一个 VP 会被启动。
SHM — 共享内存类VP负责完成对使用共享内存方式通讯的新连接的轮询任务。它也可以处理来自应用程序的传入消息。在启动服务器之前,可以配置共享的内存的 VPs 的数量。如果共享内存通讯方式没有被使用,任何 SHM VP 都不会启动。
STR — 流管类VP通过操作系统流机制收发消息来处理通信。在启动服务器之前,可以配置流管 VPs 的数量。如果流管通讯方式没有被使用,任何 STR VP 都不会启动。
TLI — TLI 类VP负责为采用TCP/IP 或 IPX/SPX 通信方式的TLI编程界面的应用进行轮询任务。在启动服务器之前,可以配置 TLI VPs 的数量。如果TLI TCP/IP通讯方式未被使用,任何 TLI VP 都不会启动。
SOC — SOC类VP负责对采用通信的 TCP/IP 伯克利套接口方法的应用程序的轮询。在启动服务器之前,可以配置 SOC VPs 的数量。如果带套接口的 TCP/IP方式不被使用,任何 SOC VP 都不会启动。
ADM — ADM 类VP处理计时器。计时器用于测定应该在某段时期内发生的任何活动的时间。例如,某些线程休息几秒钟。计时器责任标记这些线程的时间。服务器只启动一个 ADM VP。
JVP — 执行 Java UDRs。包含 Java 虚拟机(JVM)。JVP 和 CPU VP有相同的功能,因为它可以处理完整的 SQL 查询。多个 JVPs 可以同时在同一个数据库服务器中存在以完成 Java Udr 的并行调用。
7. VPCLASS配置参数
VPCLASS 配置参数允许用户自定义虚拟处理器类的属性。通过指定以下信息来配置此参数︰
- 虚拟处理器类名
- 要启动的 VPs 的数量
- VPs 允许的最大数
- 相关的处理器数目
- 禁用优先级老化
- 不要让 VP 让位于其他例程 (仅限于用户自定义 VP)
使用 VPCLASS 配置参数来指定某个VP类的 VP的数量,以确保在用户的服务器从脱机模式转变到联机模式时,该VP类相应个数的VP 被启动。CPU、AIO、SHM、STR、TLI、SOC、JVP和用户自定义 VPs 的数量都可以通过这个参数才配置。此配置参数的格式如下所示:
VPCLASS vp-class [,options ]
可用于 VPCLASS 的选项如下所示︰
num=numvps
max=maxvps
aff=processor# or aff=first_processor# ,last_processor# noage
noyield
numvps 是启动指定 vp-class 的 VPs 数量。因为可以动态地分配虚拟处理器,maxvps 为分配给此类的 VPs 的总数设置了限制。注意配置参数选项以逗号分开,选项之间没有空格。以下例子是当服务器启动时有3 CPU VPs 且该服务器启动有 5 VPs 的最大限度的配置参数︰
VPCLASS cpu,num=3,max=5
Processor affinity 又称为处理器关联,用于某些操作系统,这些操作系统允许用户为一个或多个物理 CPU 分配进程。将aff选项设置成为 CPU 序号或者范围中的第一个和最后一个 CPU 序号。 CPU VPs 的上下文会以轮循机制方式在 CPU 上运行。aff 的值不应该超过用户计算机上 的CPU 数量减1。这允许某个 CPU 可以处理系统上的其他进程。请参阅发行说明以确定数据库所在平台是否支持处理器关联。
在某些操作系统上,进程的优先级随其运行随时间的推移会下降。这项功能也称为优先级老化,可以在某些系统上禁用。优先级老化可以避免进程总是能以较高的优先级长时间的运行。使用 VPCLASS 的 noage 选项可禁用指定类的优先(级)老化。请参阅发行说明以确定平台上禁用优先(级)老化是否可能。
如果在数据库服务器上创建一个用户自定义例程,缺省情况下,该例程是由 CPU VP 上运行的线程处理。为了避免CPU VP被锁定的问题,建议创建一个用户自定义的 VP 类,并且在此VP 上执行用户自定义例程。更进一步,还可在 VPCLASS 参数中包括noyield 选项,意味着非让位,以允许用户自定义例程独自在用户定义 VP 上运行。非让位的虚拟处理器中不会发生线程上下文切换。分配给这些 VPs 的例程将被串行执行。
8. MULTIPROCESSOR配置参数
MULTIPROCESSOR
处理器配置参数决定着用户是否要打开服务器系统中特定的多处理器功能,例如更改 VPs 的缺省参数,缺省预读参数read-ahead等。参数值为 1 将激活这些功能。
Spin locks
此参数决定服务器是否可以使用自旋锁 spin locks。如果用户将 MULTIPROCESSOR 设置为 1,正在等待锁 (SinoDB数据库中称为 mutexes )的服务器线程在某些情况下 spin (短间隔下继续尝试)而不是被放在一个等待队列。
SINGLE_CPU_VP
将 SINGLE_CPU_VP 配置参数设置为 1 ,表明用户想要在服务器上只使用一个 CPU VP。这可阻止服务器启动多个 CPU VP,并禁止用户动态添加 CPU 或用户自定义 VPs。如果该服务器只有一个 CPU VP,因为没有其他进程正在使用这些结构,它可以跳过一些内部数据结构 (带有互斥对象调用)的锁定。
多处理器配置指南
对于单处理器的机器,把 MULTIPROCESSOR 参数设置为 0,SINGLE_CPU_VP 设置为 1。对于有多个处理器的机器,MULTIPROCESSOR 参数设置为 1,SINGLE_CPU_VP 参数设置为 0。双处理器系统如果将SINGLE_CPU_VP 设置为 1会因为避免了额外的内部锁定而带来性能增强并受益。
配置 CPU VP 数目的指南
如果您在一个单处理器的机器或只有两个处理器的多处理器机器上工作,将 VPCLASS 的 num 选项设置为 1。在多处理器的机器上,您可以启动几个 CPU VPs (与您系统上的 CPU 总数相关),在平均负载期间监视服务器之后添加更多的 VPs。总是比系统实际的 CPUs 数量配置更少的 CPU VPs。
9. 客户端/服务器连接
1694488175172897×341 11.4 KB
在SinoDB数据库服务器中,客户端应用程序可以通过共享内存、流管道或使用 TLI 或套接口的网络连接方式连接到服务器。您可以在同一服务器内使用共享内存通讯方式和网络通讯方式的组合。
当应用程序使用共享内存连接方式与服务器通信时,将使用共享内存中某个地址来存放和检索信息。
网络连接的通讯方式是通过应用程序将消息发送到特定端口号来实现的。服务器监听该端口以获悉应用程序的消息。
在星瑞格数据库的 12.10 版本或更高版本中,在每个检查点发生时会有一条消息写入消息日志,该消息显示出自服务器上次联机后连接的最大数目。
9.1 客户端如何连接
1694488430881891×453 36 KB
轮询 线程负责接收来自客户端应用程序的消息。如果客户端通过 TCP/IP(套接口或 TLI) 连接,轮询 线程接收某个端口号的消息。如果客户端通过共享内存连接,轮询 线程接收被存储在共享内存的消息部分的消息。
轮询 线程负责接收来自客户端应用程序的所有传入消息。收到一条消息时,轮询线程唤醒能处理消息的线程(睡觉或等待)来进行信息处理。如果消息是请求连接到服务器,轮询线程唤醒侦听 线程,并传递连接请求。
侦听 线程负责处理所有连接请求。侦听 线程为用户建立一个称为会话控制块 (SCB)的结构。这种结构包括应用程序的唯一标识符,称作session-id 。此外,还有另外一个结构也会为线程建立,叫做线程控制块 (TCB)。线程控制块用来保存线程的文本。最后,侦听线程为该会话启动sqlexec线程。
一旦设置了会话控制块,sqlexec 线程(客户端的会话线程)则负责将信息发送回应用程序。轮询 线程负责接收来自应用程序的所有传入消息。
9.2 客户端-服务器配置:NETTYPE
NETTYPE 配置参数允许您配置︰
- 网络连接协议
- 运行在 VP 上的轮询线程数目
- 每个轮询线程连接的最大数目
- 本协议用在哪个 VP 类
示例:
NETTYPE ipcshm,1,50,CPU
NETTYPE tlitcp,2,100,NET
在早期模块中,您配置数据库服务器通过使用共享内存、流管和 TCP/IP 协议等方式来接受连接。缺省情况下,系统分配单个轮询线程,并且每个服务器可以最多有 50 个用户。如果服务器的名称配置为 DBSERVERNAME,那么轮询线程将由 CPU VP 启动。如果服务器名称配置为 DBSERVERALIAS,那么会有一个网络 VP (SHM、STR、TLI 或 SOC) 被启动,该网络协议的轮询线程运行在该 VP 上。
您可以通过向配置文件添加一个或多个 NETTYPE 参数来进一步配置网络连接。使用以下格式来设置 NETTYPE 参数:
NETTYPE protocol ,#poll_threads ,max_connections ,vp_class
下面是对 NETTYPE 字段的描述:
参数 | 说明 |
---|---|
protocol | 将该字段内容设置为您在 sqlhosts 文件中为 servername 使用的网络协议。协议中的 on 部分在 NETTYPE 配置中经常被消除。 |
#poll_threads | 想要启动的轮询线程数目。 |
max_connections | 每个轮询线程可连接到服务器的最大用户数。 |
vp_class | 将该项设置为 CPU 或 NET。如果设置为 CPU 的话,轮询线程在 VPCLASS 所配置的 CPU VP 上启动。如果设置为 NET 的话,当服务器启动时,会有一个SHM、STR、TLI 或 SOC VP 且以指定数目的轮询线程会被启动。 |
这里是一个配置文件中某一项的配置示例,会为套接口连接配置2个轮询线程,每个轮询线程运行在一个网络 VP 上,且最多允许 100 个用户。
NETTYPE soctcp,2,100,NET
NETTYPE字段只由逗号间隔开;字段之间无空格。NETTYPE配置参数不能直接联系到 DBSERVERNAME 或 DBSERVERALIAS 参数。Sqlhosts 项提供了 NETTYPE 协议和数据库名称之间的链接。
9.3 侦听线程
-
多线程的多个侦听线程
-
帮助限制拒绝服务攻击
-
配置参数:
— LISTEN_TIMEOUT
— MAX_INCOMPLETE_CONNECTIONS -
可以通过 onmode -wf /-wm 动态更改
侦听器线程的工作是接受为特定连接类型建立的新连接的请求。SinoDB动态服务器使用多线程多侦听器线程环境来确保线程得到有效利用。当新的连接请求到达数据库时,主侦听器线程派生出另一个线程以接管新连接。此新线程等待通过连接发送数据,而主侦听器线程被释放以接受另一个新连接。
两个新的配置参数被增加用来限制派生侦听线程在关闭连接 (LISTEN_TIMEOUT)之前等待数据的时间,以及向 DBA (MAX_INCOMPLETE_CONNECTIONS) 发出警告之前应该派生的侦听线程数目。
10. I/O 的类型
服务器允许使用以下两种方式之一来执行 I/O:
-
Kernel AIO — 核心异步 I/O (KAIO)是通过操作系统进行非阻塞磁盘读写的一种方法。
— 它替代了传统的读写操作,传统的读写操作在数据写入磁盘或从磁盘中读取数据时,进程需要等待。而现在,服务器提交读写请求,之后继续处理其它事项。当 I/O 完成时,将会通知服务器。
— KAIO 仅在某些操作系统和硬件平台上可用。
— 只有当chunk是raw device时,KAIO 才会被调用
— KAIO 线程运行在 CPU VP 上,更快的 I/O 方法 -
通过 AIO VP 执行 AIO——服务器也可以通过 AIO VP 执行 I/O。
— 在不支持Kernel AIO 的平台上执行 I/O
— 在所有cooked file上执行 I/O
10.1 使用 AIO VP 的 I/O
16945015289941008×446 43.6 KB
为了解释不同 VP 的线程如何一起工作,上面这个关系图显示了一个 SELECT 语句可能被数据库服务器处理的方式(简单起见,这里忽略了通信线程)。
①CPU VP 中的 sqlexec 线程(客户端的会话线程) 解析和优化 SELECT 语句。
②Sqlexec 线程从内存缓冲池中读取满足查询条件的数据页。
③如果 sqlexec 线程无法在缓冲池中找到页面,它将在 AIO 请求队列中向 AIO VP 请求访问磁盘信息。
④Sqlexec 线程给就绪队列的另一个线程出让控制权,将自己放到等待队列中,等待 AIO VP 进行读取。
⑤AIO VP 从磁盘 (5a ) 中读取数据并将数据放到缓冲池中 (5b )。
⑥读取操作完毕后,sqlexec 线程将被放置回就绪队列中,这样它随后就可以继续执行 SELECT 语句了。
⑦之后,sqlexec 线程从缓冲池中提取数据并将行返回给客户端。
服务器系统的每个chunk都有一个 AIO 请求队列。
10.2 核心异步I/O
1694501892093950×438 48.9 KB
Kernel Asynchronous I/O-核心异步 I/O(KAIO)是一种由操作系统内核协调的 I/O 方法。KAIO 调用由一个 kio 线程处理。当第一个raw device被打开时,该线程启动。除了使用 AIO VP 执行的步骤之外,下列情况在使用Kernel I/O 的时候也会发生:
①当某个会话请求读写操作时,请求会被放入 AIO 队列。
②kio 线程读取请求并向操作系统提交消息来执行 I/O。在该时刻,kio 线程完成了自己的工作。
③操作系统负责完成缓冲区和磁盘之间的 I/O。
④CPU VP 通过轮询操作系统发现I/O完成。该情况发生在线程切换之间或者在没有其他工作的时候。
⑤当 I/O 完成时,CPU VP 将 sqlexec 线程放入就绪队列。
每个 CPU VP 都有一个 AIO 队列和一个 kio 线程。由于 sqlexec 线程也在 CPU VP 上,执行kernel AIO 时操作系统上下文切换将减少。
10.3 配置AIP VP
1694502569929987×497 79 KB
如果您的服务器上所有chunk均使用raw device,并且您的系统支持kernel I/O,那么 AIO VP 的工作并不多;大多数 I/O 由操作系统管理。如果您的平台支持kernel IO 但您仅使用一个raw device时,配置一个或两个 AIO VP。
如果您正在使用的服务器上 dbspace 有cooked file,请为每个含有cooked file的活动磁盘配置一个 AIO VP 来进行启动。这允许 AIO VP 并行管理 I/O 操作。
自动 AIO VP 调整
您可能希望启用自动 AIO VP 调整功能,而不是手动配置 AIO VP 的数量。启用此功能后,服务器会检测在对cooker files 执行 I/O 操作时哪里可以提高性能,并在需要时自动增加 AIO VP 和刷新程序线程的数量。要启用 AIO VP 的自动调整,请设置AUTO_AIOVPS配置参数为 1。默认情况下启用此功能。
10.4 动态添加和删除VP
在服务器活动的高峰期,您可能想要增加特定类别的虚拟处理器的数目,以帮助缓解增加的工作负载。可以使用 onmode 命令动态添加 VP (当服务器处于联机模式时)。此配置参数的格式如下所示:
onmode -p [-]num-vps vp-class
上述格式中,num-vps 指的是待添加的 VP 数目,vp-class 指的是待添加的 VP 类。如果 NUM_CPU_VP 配置参数设为 1 的话,您无法添加 CPU VP,也不能增加用户自定义VP。如果您在配置 VPCLASS 的时候指定了 VP 的最大数目,那么在添加 VP 时不能超过最大数目的限制。
如果服务器上的活动减少,您还可以动态地可以删除 CPU 或用户自定义的 VP。删除 VP 的命令和上述的格式相同;num-vps 值以负数的形式表示。删除 CPU Vp(Ps)的时候需要注意,必须要至少保留一个 CPU VP。
您可以删除同一个用户自定义类别下所有当前运行的 VP(s)。但是,VP 上所有当前活跃的线程必须在完成处理之后该VP 才会被删除。