CN120086257B 一种numa架构下的异步i-o实现方法、设备及介质 (瀚高基础软件股份有限公司)_第1页
CN120086257B 一种numa架构下的异步i-o实现方法、设备及介质 (瀚高基础软件股份有限公司)_第2页
CN120086257B 一种numa架构下的异步i-o实现方法、设备及介质 (瀚高基础软件股份有限公司)_第3页
CN120086257B 一种numa架构下的异步i-o实现方法、设备及介质 (瀚高基础软件股份有限公司)_第4页
CN120086257B 一种numa架构下的异步i-o实现方法、设备及介质 (瀚高基础软件股份有限公司)_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

(19)国家知识产权局(12)发明专利路789号山东信息通信技术创新产业所(普通合伙)11716专利代理师王彬GO6F16/2455(2019.01)权利要求书2页说明书9页附图4页及介质加到读写控制进程对应的I/O控制结构体中的I/0链表中;通过读写控制进程轮询I/0控制结构体,以对预设状态的I/0链表包含的链表元2基于PostgreSQL数据库的主进程,将针对不同前端查询请求生成的多个后端进程分配到不同的NUMA节点中;其中,所述后端进程用于对缓冲区进行读写申请;在所述后端进程产生对于缓冲区的读写请求时,将所述读写请求添加到所述缓冲区对调用所述目标NUMA节点的读写控制进程,轮询所述读写队列,以将所述读写队列中的待处理读写请求作为链表元素,添加到所述读写控制进程对应的I/0控制结构体中的I/0链表中;通过所述读写控制进程轮询所述I/0控制结构体,以对预设状态的所述I/0链表包含的链表元素进行批量化读写,实现对所述PostgreSQL数据库的异步I/0。2.根据权利要求1所述的一种NUMA架构下的异步I/0实现方法,其特征在于,将所述读写队列中的待处理读写请求作为链表元素,添加到所述读写控制进程对应的I/0控制结构获取所述读写控制进程对应的I/0控制结构体中的状态标志位;在所述状态标志位不处于指定状态时,将所述读写队列中的待处理读写请求作为链表元素,添加到所述读写控制进程对应的I/0控制结构体中的I/0链表中;其中,所述指定状态为正在处理I/0,所述链表元素为I/0结构体。3.根据权利要求2所述的一种NUMA架构下的异步I/0实现方法,其特征在于,对满足预设状态的所述I/0链表包含的链表元素进行批量化读写,具体包括:根据所述状态标志位,确定所述I/0控制结构体在满足预设状态时,从所述I/0控制结构体中获取I/0链表元素个数;其中,所述预设状态为处理完成收割完成;将所述状态标志位标记为所述指定状态,对所述I/O链表中满足所述I/O链表元素个数的链表元素进行批量读写;在完成对所述链表元素的批量读写后,将所述状态标志位标记为预设状态。4.根据权利要求1所述的一种NUMA架构下的异步I/0实现方法,其特征在于,将所述读写队列中的待处理读写请求作为链表元素,添加到所述读写控制进程对应的I/0控制结构体中的I/0链表之后,所述方法还包括:确定所述待处理读写请求与所述待处理读写请求的上一待处理读写请求所需请求的缓冲区的逻辑地址;根据所述逻辑地址,判断所述待处理读写请求是否需要进行合并请求。5.根据权利要求4所述的一种NUMA架构下的异步I/0实现方法,其特征在于,根据所述逻辑地址,判断所述待处理读写请求是否需要进行合并请求,具体包括:根据所述上一待处理读写请求对应的缓冲区的首地址,与所述上一待处理读写请求对应的上一读写长度之间的总和,是否与所述待处理读写请求对应的缓冲区的首地址相同,确定所述待处理读写请求和所述上一待处理读写请求的逻辑地址是否连续;若是,则将所述待处理读写请求与所述上一待处理读写请求进行合并请求,以将所述待处理读写请求对应的读写长度与所述上一读写长度进行累加。6.根据权利要求1所述的一种NUMA架构下的异步I/0实现方法,其特征在于,将所述读写请求添加到所述缓冲区对应的目标NUMA节点的读写队列中,具体包括:3尝试将所述读写请求添加到所述缓冲区对应的本地NUMA节点的本地读写队列中,以确定所述本地读写队列是否已满;小的NUMA节点,作为用于添加所述读写请求的目标NUMA节点,并将所述读写请求添加到所7.根据权利要求6所述的一种NUMA架构下的异步I/0实现方法,其特征在于,尝试将所述读写请求添加到所述缓冲区对应的本地NUMA节点的本地读写队列中,以确定所述本地读获取所述本地读写队列中的空闲元素指针和尾指针;将所述空闲元素指针和所述尾指针对应的位置进行比对,在所述空闲元素指针的下一位置为所述尾指针时,确定所述本地读写队列已满。8.根据权利要求1所述的一种NUMA架构下的异步I/0实现方法,其特征在于,对满足预设状态的所述I/O链表包含的链表元素进行批量化读写之后,所述方法还包括:在所述批量化读写存在异常时,确定对应的异常类型;若所述异常类型为系统调用中断,再次执行对所述链表元素的批量化读写;若所述异常类型不为系统调用中断,根据所述批量化读写对应的读写请求类型,保存所述批量化读写对应的异常状态。至少一个处理器;以及,与所述至少一个处理器通信连接的存储器;其中,所述存储器存储有可被所述至少一个处理器执行的指令,所述指令被所述至少一个处理器执行,以使所述至少一个处理器能够执行如权利要求1-8任一项所述的一种NUMA架构下的异步I/0实现方法。10.一种非易失性计算机存储介质,存储有计算机可执行指令,其特征在于,所述计算机可执行指令设置为:如权利要求1-8任一项所述的一种NUMA架构下的异步I/0实现方法。4一种NUMA架构下的异步I/0实现方法、设备及介质技术领域[0001]本发明涉及电数字数据处理技术领域,具体涉及一种NUMA架构下的异步I/0实现背景技术节点来提升多核处理器的扩展性和资源分配效率。每个NUMA节点本质上是一个自包含的计算单元,其内部集成了部分CPU核心及其直接关联的本地内存,这种架构的核心特征在于内存访问的非对称性,也就是说,当一个CPU核心访问其所属NUMA节点的本地内存时,可通过高速互连总线实现低延迟、高带宽的数据传输。[0003]PostgreSQL数据库进行文件的读写操作时,通常不会在访问物理存储介质的文件时每次都进行文件的读写操作,缓冲区缓存中保存着关系页面,以平衡对物理存储介质和内存的访问时间。当需要从物理存储介质中读取数据时,将数据存储到内存中的缓冲区内;当需要将内存中的缓冲区落盘时,将内存中缓冲区内的数据写到物理存储介质中。[0004]现有的PostgreSQL数据库对于缓冲区的读入写出方法采用调用操作系统的读写步执行的磁盘I/0场景时,对于I/O的处理可能会以位于非本地内存的一段连续的内存区域作为读写前使用的缓冲区,这种缓冲区的处理方式,增加了访问远端内存的次数,引起跨发明内容[0006]基于PostgreSQL数据库的主进程,将针对不同前端查询请求生成的多个后端进程分配到不同的NUMA节点中;其中,所述后端进程用于对缓冲区进行读写申请;[0007]在所述后端进程产生对于缓冲区的读写请求时,将所述读写请求添加到所述缓冲[0008]调用所述目标NUMA节点的读写控制进程,轮询所述读写队列,以将所述读写队列中的待处理读写请求作为链表元素,添加到所述读写控制进程对应的I/0控制结构体中的I/0链表中;[0009]通过所述读写控制进程轮询所述I/0控制结构体,以对预设状态的所述I/0链表包含的链表元素进行批量化读写,实现对所述PostgreSQL数据库的异步I/0。[0010]在本发明的一种实现方式中,将所述读写队列中的待处理读写请求作为链表元素,添加到所述读写控制进程对应的I/0控制结构体中的I/0链表中,具体包括:[0011]获取所述读写控制进程对应的I/0控制结构体中的状态标志位;[0012]在所述状态标志位不处于指定状态时,将所述读写队列中的待处理读写请求作为链表元素,添加到所述读写控制进程对应的I/0控制结构体中的I/O链表中;其中,所述指定5状态为正在处理I/0,所述链表元素为I/0结构体。[0013]在本发明的一种实现方式中,对满足预设状态的所述I/0链表包含的链表元素进[0014]根据所述状态标志位,确定所述I/0控制结构体在满足预设状态时,从所述I/0控制结构体中获取I/O链表元素个数;其中,所述预设状态为处理完成收割完成;[0015]将所述状态标志位标记为所述指定状态,对所述I/O链表中满足所述I/O链表元素个数的链表元素进行批量读写;[0016]在完成对所述链表元素的批量读写后,将所述状态标志位标记为预设状态。[0017]在本发明的一种实现方式中,将所述读写队列中的待处理读写请求作为链表元素,添加到所述读写控制进程对应的I/0控制结构体中的I/0链表之后,所述方法还包括:[0018]确定所述待处理读写请求与所述待处理读写请求的上一待处理读写请求所需请求的缓冲区的逻辑地址;[0019]根据所述逻辑地址,判断所述待处理读写请求是否需要进行合并请求。[0020]在本发明的一种实现方式中,根据所述逻辑地址,判断所述待处理读写请求是否[0021]根据所述上一待处理读写请求对应的缓冲区的首地址,与所述上一待处理读写请求对应的上一读写长度之间的总和,是否与所述待处理读写请求对应的缓冲区的首地址相同,确定所述待处理读写请求和所述上一待处理读写请求的逻辑地址是否连续;[0022]若是,则将所述待处理读写请求与所述上一待处理读写请求进行合并请求,以将所述待处理读写请求对应的读写长度与所述上一读写长度进行累加。[0023]在本发明的一种实现方式中,将所述读写请求添加到所述缓冲区对应的目标NUMA[0024]尝试将所述读写请求添加到所述缓冲区对应的本地NUMA节点的本地读写队列中,以确定所述本地读写队列是否已满;[0026]根据所述访问代价,从除所述本地NUMA节点的其他NUMA节点中,选取所述访问代价最小的NUMA节点,作为用于添加所述读写请求的目标NUMA节点,并将所述读写请求添加到所述目标NUMA节点的读写队列中。[0027]在本发明的一种实现方式中,尝试将所述读写请求添加到所述缓冲区对应的本地NUMA节点的本地读写队列中,以确定所述本地读写队列是否已满,具体包括:[0028]获取所述本地读写队列中的空闲元素指针和尾指针;[0029]将所述空闲元素指针和所述尾指针对应的位置进行比对,在所述空闲元素指针的下一位置为所述尾指针时,确定所述本地读写队列已满。[0030]在本发明的一种实现方式中,对满足预设状态的所述I/0链表包含的链表元素进行批量化读写之后,所述方法还包括:[0032]若所述异常类型为系统调用中断,再次执行对所述链表元素的批量化读写;[0033]若所述异常类型不为系统调用中断,根据所述批量化读写对应的读写请求类型,保存所述批量化读写对应的异常状态。6[0037]其中,所述存储器存储有可被所述至少一个处理器执行的指令,所述指令被所述至少一个处理器执行,以使所述至少一个处理器能够执行如上任一项所述的一种NUMA架构下的异步I/0实现方法。[0038]本发明实施例提供了一种非易失性计算机存储介质,存储有计算机可执行指令,所述计算机可执行指令设置为:[0039]如上任一项所述的一种NUMA架构下的异步I/0实现方法。[0040]通过本发明提出的一种NUMA架构下的异步I/0实现方法能够带来如下有益效果:[0041]后端进程不再负责进行缓冲区读写,而是只进行读写申请,将同NUMA节点内存中缓冲区的可以异步进行的读写请求,交由位于同NUMA节点上的CPU核心上所运行的读写控制进程代理处理,读写控制进程访问位于本地内存上的缓冲区时,相较访问远端内存,降低了访问代价,结合I/0的批量处理,可达到降低数据库性能损耗而达到数据库性能优化的结附图说明[0042]此处所说明的附图用来提供对本发明的进一步理解,构成本发明的一部分,本发明的示意性实施例及其说明用于解释本发明,并不构成对本发明的不当限定。在附图中:[0043]图1为本发明实施例提供的一种NUMA架构下的异步I/0实现方法的流程示意图;[0045]图3为本发明实施例提供的一种读写队列数据结构示意图;[0046]图4为本发明实施例提供的一种数据结构示意图;[0047]图5为本发明实施例提供的一种NUMA架构下的异步I/0实现设备的结构示意图。具体实施方式[0048]为使本发明的目的、技术方案和优点更加清楚,下面将结合本发明具体实施例及相应的附图对本发明技术方案进行清楚、完整地描述。显然,所描述的实施例仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。[0049]PostgreSQL(通常简称为Postgres)是一个开源的关系型数据库管理系统,以其强读写的进程也由操作系统根据系统内调度算法选择CPU核心进行调度,其调度的CPU核心与该缓冲区不一定位于同一个NUMA节点,这种缓冲区的处理方式,增加了访问远端内存的次[0050]以下结合附图,详细说明本发明各实施例提供的技术方案。[0051]如图1所示,本发明实施例提供的一种NUMA架构下的异步I/0实现方法,包括:7[0052]S101:基于PostgreSQL数据库的主进程,将针对不同前端查询请求生成的多个后端进程分配到不同的NUMA节点中;其中,后端进程用于对缓冲区进行读写申请。[0053]如图2所示的一种NUMA架构示意图,在PostgreSQL数据库启动时会创建一个主进些后端进程运行在不同的CPU核心上,即分布到不同的NUMA节点中。本发明实施例与传统NUMA的I/0实现方法的不同点在于,后端进程仅进行读写申请,并不不负责实际的读写处[0054]S102:在后端进程产生对于缓冲区的读写请求时,将读写请求添加到缓冲区对应的目标NUMA节点的读写队列中。[0055]在PostgreSQ中,缓冲区是内存中用于缓存数据库中的数据页,当后端进程发起读写申请后,NUMA节点会先检查缓冲区中是否有相应的数据页。若有,就直接进行读写;若没有,则从磁盘读取数据页并加载到缓冲区,缓冲区的作用是减少磁盘I/0操作,提升数据库性能。[0056]在NUMA架构下,不同NUMA节点的内存访问延迟不同。如果后端进程随意对缓冲区进行读写操作,可能会频繁跨NUMA节点访问内存,导致内存访问延迟增加,降低系统性能。为了减少这种跨节点的内存访问,提高内存访问效率,需要将后端进程对缓冲区的读写请求集中到对应的目标NUMA节点的读写队列中。读写队列按顺序存储对目标NUMA节点的读写请求。当有多个后端进程同时对同一个NUMA节点的缓冲区发起读写请求时,这些请求会被添加到读写队列中,然后按照一定的规则依次处理,以避免冲突和保证数据的一致性。[0057]在一个实施例中,在NUMA架构下,为了充分利用各节点的本地内存资源,提高内存访问效率,通常会优先让后端进程将读写请求发送到本地NUMA节点的读写队列。但本地读写队列的容量是有限的,当队列已满时,如果继续尝试向其添加请求,会导致请求积压,影响读写性能。因此,在将读写请求添加到目标NUMA节点的读写队列时,需要根据不同NUMA节点的访问代价,对读写请求进行合理地筛选,以实现分发读写请求的动态均衡。从而在本地读写队列已满的情况下,将部分读写请求转移到访问代价较低的其他节点,避免本地队列因过载而阻塞,减少关键请求的延迟,同时优化资源利用率。[0058]首先,分析写入的缓冲区所在内存的本地NUMA节点位置,然后,尝试将读写请求添加到缓冲区对应的本地NUMA节点的本地读写队列中,以确定本地读写队列是否已满。如果队列未满,读写请求会顺利加入本地读写队列,后续由本地NUMA节点按照队列顺序进行处理。如果本地队列已满,无法将会请求添加到本地队列,此时就需要寻找其他NUMA节点作为[0059]为了选择最优的节点,需计算该读写请求针对除本地NUMA节点之外的其他所有NUMA节点的访问代价。访问代价的计算通常会考虑多个因素,例如节点之间的物理距离、通信链路的带宽、节点的当前负载等。一般来说,距离越远、带宽越低、负载越高,访问代价就越大。根据计算得到的各NUMA节点的访问代价,从除本地NUMA节点之外的其他节点中,挑选出访问代价最小的NUMA节点,这个节点就是当前读写请求的目标NUMA节点。最后,将读写请8的读写队列中均未找到空闲空间,则需要进行自旋等待,不断按照自身NUAM节点、其节点内存访问代价从小到大的顺序进行读写请求队列的轮询,直到某一个读写队列有空闲之后再进行读写队列的插入。[0060]需要说明的是,在判断读写队列是否已满时,需通过空闲元素指针和尾指针来判断。如图3所示的一种读写队列数据结构示意图,读写队列由读写控制进程进行维护,读写队列为一个空闲队列,后端进程每次读写需要使用读写队列中的一个空闲空间,需要使用空闲空间时,根据空闲元素指针进行定位,将信息填入该空闲元素位置的队列成员结构体。指针等内容,确保读写请求有序处理。指向空闲元素节点的空闲元素指针,代表本地读写队列中当前可用于存放新读写请求的位置,它会随着请求的添加而移动,始终指示下一个可写入的空闲节点。指向请1的尾指针,标记本地读写队列中最后一个已被占用的请求节点,用于界定队列中已存储请求的边界。[0061]当后端进程尝试将读写请求加入本地读写队列时,首先获取队列的两个关键指针,即空闲元素指针和尾指针。将空闲元素指针和尾指针对应的位置进行逻辑比对。在如图3所示的队列结构中,每个节点通过指向下一个元素的指针连接,当有读写请求添加到读写队列中时,首先会按照队列顺序,添加到逻辑顺序中的第一个空闲位置,然后在该读写请求写入后,向后移动空闲元素指针。若空闲元素指针的下一位置是尾指针,意味着空闲元素指针当前指向最后一个空闲节点,且该节点的下一个位置已到达尾指针指向的已占用节点。此时队列中没有额外的空闲节点用于存放新请求,即队列已满。[0062]S103:调用目标NUMA节点的读写控制进程,轮询读写队列,以将读写队列中的待处理读写请求作为链表元素,添加到读写控制进程对应的I/0控制结构体中的I/O链表中。[0063]每个NUMA节点上均有一个读写控制进程,读写控制进程有两个职责,其中一个职责是负责维护读写队列,目标NUMA节点的读写控制进程会定期轮询读写队列,读写队列受到读写控制进程轮询而向读写控制进程返回当前首个需要处理的待处理读写请求。若队列上存在待处理读写请求,且I/0控制结构体未处于I/0正在处理中的状态,将该待处理请求作为链表元素加入到I/0控制结构体中的I/0链表中。I/0链表是I/0控制结构体中的一个链表结构,用于存储待处理的I/0请求,这些请求以I/0结构体的形式存在于链表中,方便进行管理和调度。[0064]如图4所示的一种数据结构示意图,I/0控制结构体负责协调和管理本地节点I/0请求处理的核心数据结构,I/0控制结构体存放未进行处理的I/0链表、状态标志位、I/0链表元素个数、处理完成的I/0链表元素个数、缓冲区指针。I/0链表中的链表元素为I/0结构作类型、指向下一个I/0结构体的指针。I/0控制结构体的状态标志位用于表示当前该I/0控制结构体的使用状态,共7种状态分别为:空闲(无任何请求)、正在处理I/0、I/0处理异常、正在合并请求、处理完成等待收割、处理完成收割进行中、处理完成收割完成。缓冲区指针用于I/0操作读取数据时指示缓冲区数据位置。[0065]PostgreSQL数据库会由大量读写请求产生,为了高效地处理这些读写请求,需要调用每个NUMA节点上的读写控制进程来进行管理。而I/0控制结构体则是对这些I/0操作进9行集中管理的关键数据结构。但是,I/0操作是需要顺序进行的,同一时间可能只能处理一个请求,所以需要通过状态标志位来控制请求的添加,避免多个请求同时处理导致冲突和[0066]在一个实施例中,当读写控制进程需要将读写队列中的待处理读写请求添加到I/0控制结构体的I/O链表中时,首先会去获取I/0控制结构体中的状态标志位。状态标志位可以反映当前I/0控制结构体的使用状态,从而决定是否可以添加新的请求。得到状态标志位后,会判断其是否处于指定状态,指定状态指的是正在处理I/0.如果处于指定状态,说明I/0控制结构体正在处理一个I/0请求,此时不能将新的请求添加到I/0链表中,需要等待该请求处理完成,状态标志位改变后再进行尝试。当状态标志位不处于指定状态时,说明I/0控制结构体当前没有正在处理I/0请求,可以接收新的请求,那么可以直接将新的读写请求作为一个链表元素添加到I/O链表中。[0067]需要说明的是,在I/0操作中,频繁的读写请求会增加系统开销,尤其是在磁盘等存储设备上,每次I/0操作都有一定的时间和资源成本。当多个读写请求所访问的数据在缓冲区中是连续或者相邻的,将这些请求合并为一个请求进行处理,可以减少不必要的I/0操以进行请求合并。[0068]具体地,在将待处理读写请求添加到I/0链表之后,确定该待处理读写请求所需请求的缓冲区的逻辑地址。同时,还会确定该待处理读写请求的上一待处理读写请求所需请求的缓冲区的逻辑地址。逻辑地址可以通过读取I/0结构体中记录的信息来获得,逻辑地址可以是缓冲区的起始地址和长度等信息,用于确定请求所涉及的数据在缓冲区中的具体位置。根据得到的两个逻辑地址,判断这两个请求是否可以进行合并。判断的依据通常是逻辑地址的连续性或相邻性。[0069]具体来说,获取上一待处理读写请求对应的缓冲区的首地址,以及该请求对应的上一读写长度。然后,将上一待处理读写请求对应的缓冲区的首地址与上一读写长度相加,得到上一请求所涉及数据在缓冲区中的结束地址。例如,上一待处理读写请求的缓冲区首地址为start_addr_prev,上一读写长度为length_prev,那么上一请求的结束地址为end_addr_prev=start_addr_prev+length_prev。然后,获取当前待处理读写请求对应的缓冲区的首地址start_addr_current,比较上一请求的结束地址end_addr_prev是否与当前待处理读写请求对应的缓冲区的首地址start_addr_current相同。如果相同,说明这两个请求所涉及的数据在缓冲区中是连续的,即它们的逻辑地址连续。当判断出待处理读写请求和上一待处理读写请求的逻辑地址连续时,操作系统会将这两个请求进行合并。[0070]合并的具体操作是将待处理读写请求对应的读写长度length_current与上一读写长度length_prev进行累加,得到新的读写长度new_length=length_prev+length_current。同时,更新相关的请求信息,将这两个请求视为一个整体进行后续的处理。[0071]另外,如果两个读写请求的逻辑地址虽然不连续,但非常接近,也可能根据具体策略进行合并。例如,两个读写请求之间的间隔小于预设的时间阈值,合并这两个请求可以减[0072]S104:通过读写控制进程轮询I/0控制结构体,以对预设状态的I/0链表包含的链表元素进行批量化读写,实现对PostgreSQL数据库的异步I/0。[0073]读写控制进程除了维护读写队列之外,还同时负责定期轮询I/0控制结构体,通过读取控制结构体中的信息进行读写操作的调度,对满足预设状态的I/0链表包含的链表元素进行批量化读写。传统的同步I/0模式下,前端在发起I/0请求后会阻塞等待操作完成,这会导致CPU资源的浪费,尤其是在高并发场景下,会严重影响数据库的性能和响应速度。本发明实施例将同NUMA节点内存中缓冲区的可以异步进行的I/0处理,交予位于同NUMA节点上的CPU核心上所运行的读写控制进程代理处理,通过读写控制进程轮询I/0控制结构体并进行批量化读写,可以更好地实现异步I/0,减少I/0操作的开销。[0074]在一个实施例中,读写控制进程会按照一定的时间间隔对I/0控制结构体进行轮询,在轮询过程中,根据状态标志位确定I/0控制结构体的状态是否满足预设状态。这里的预设状态指的是处理完成收割完成,当I/0控制结构体为处理完成收割完成且其他状态均不为真的状态时,表明I/0控制结构体已完成所有请求的处理和资源回收,处于可复用状态。此时,控制系统会从I/0控制结构体中获取I/0链表元素个数,I/0链表元素个数即为后续批量读写操作需要处理的读写请求的数量。[0075]为了避免在批量读写过程中出现并发问题,操作系统在进行批量读写前,会将状态标志位标记为指定状态。指定状态表示I/0控制结构体正在进行批量读写操作,其他进程或操作需要等待该操作完成。在完成对状态标志位的标记后,对I/0链表中满足I/0链表元素个数的链表元素进行批量读写操作,具体来说,就是将这些链表元素所代表的读写请求组合成一组,一次性发送给相应的缓冲区进行读写处理。当批量读写操作完成后,将状态标志位重新标记为预设状态,这表示I/0控制结构体已经完成了当前轮次的批量读写任务,并且对相关资源进行了清理和收割,可以再次接受新的读写任务。[0076]通过上述基于状态标志位的批量读写机制,可以有效地提高I/0操作的效率,减少系统开销。同时,状态标志位的使用确保了I/0操作的顺序性和正确性,避免了并发问题的发生,通过标记状态标志位,使得读写控制进程的整个调度流程形成了一个闭环,从而实现对于PostgreSQL数据库的高效查询。[0077]需要说明的是,当读写控制进程进行批量化读写后,由于硬件故障、系统资源不足、软件错误等原因,可能会出现异常情况。在批量化读写操作之后,需要对可能出现的异常进行检查和处理,以保证系统的可靠性和数据的完整性。[0078]具体地,当批量化读写操作完成后,首先检查是否存在异常,如果检测到批量化读写存在异常,需要进一步确定对应的异常类型。如果返回了错误码EINTR,即系统调用中断,无论此时处理的请求是不是合并后的请求,均需要再次执行对链表元素的批量化读写。而在非EINTR,即不是系统调用中断的异常情况下,需要根据批量化读写对应的读写请求类型,保存批量化读写对应的异常状态。合并后的读写请求首先拆开分别再次执行I/0,如果依然存在异常,则分别保存异常状态。I/0关联的事务在提交前会检测I/0的完成状态,若未完成则会阻塞等待,若异常则事务进行回滚。[0079]如图2所示的一种NUMA架构示意图,PostgreSQL数据库的主进程Postgres会fork理能够异步执行的多个I/0请求。当存在后端进程产生针对缓冲区的读写请求后,根据缓冲区对应的NUMA节点以及NUMA节点中的读写队列负载情况,将读写请求分发到对应的目标NUMA节点中。这里的目标NUMA节点可以为一个或多个,优先将读写请求分发至本地NUMA节11点,在本地读写队列已满的情况下,读写请求将按照访问代价由小到大的顺序,依次插入到相应NUMA节点的读写队列中。后端进程并不负责执行读写操作,当后端进程完成读写请求的分发后,读写控制进程通过轮询读写队列取得读写请求后,将读写请求写入到I/0控制结构体中。读写控制进程通过定期读取I/0控制结构体中的数据,以及对I/0控制结构体的状态变更,对满足预设状态的读写请求进行调度,实现对永久存储介质的批量读写,并获取相应的返回结果。[0080]PostgreSQL缓冲区的读写方式未针对NUMA架构设计做出优化,其后端进程缓冲区的读写时,若缓冲区是远端内存,则会相较访问本地内存,产生更多的访问代价,进而影响数据库整体性能。本发明实施例不再由后端进程进行缓冲区读写,而是将同NUMA节点内存中缓冲区的可以异步进行的读写请求,交予位于同NUMA节点上的CPU核心上所运行的读写控制进程代理处理,读写控制进程访问位于本地内存上的缓冲区时,相较访问远端内存,降低了访问代价,结合I/0的批量处理,可达到降低数据库性能损耗而达到数据库性能优化的结果。[0081]以上为本发明提出的方法实施例。基于同样的思路,本发明的一些实施例还提供了上述方法对应的设备和非易失性计算机存储介质。[0082]图5为本发明实施例提供的一种NUMA架构下的异步I/0实现设备的结构示意图。如[0085]存储器存储有可被至少一个处理器执行的指令,指令被至少一个处理器执行,以使至少一个处理器能够执行如上任一项所述的一种NUMA架构下的异步I/0实现方法。[0086]本发明实施例提供了一种非易失性计算机存储介质,存储有计算机可执行指令,计算机可执行指令设置为:[0087]如上任一项所述的一种NUMA架构下的异步I/0实现方法。[0088]本发明中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于设备和介质实施例而言,由于其基本相似于方法实施例,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。[0089]本发明实施例提供的设备和介质与方法是一一对应的,因此,设备和介质也具有与其对应的方法类似的有益技术效果,由于上面已经对方法的有益技术效果进行了详细说[0090]本领域内的技术人员应明白,本发明的实施例可提供为方法、系统、或计算机程序产品。因此,本发明可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本发明可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。[0091]本发明是参照根据本发明实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。[0092]这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。[0093]这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论