掌桥专利:专业的专利平台
掌桥专利
首页

无锁环形队列dns日志落盘方法、装置、设备及存储介质

文献发布时间:2024-04-18 20:02:18


无锁环形队列dns日志落盘方法、装置、设备及存储介质

技术领域

本发明涉及互联网数据通信技术领域,尤其涉及一种无锁环形队列dns日志落盘方法、装置、设备及存储介质。

背景技术

当用户发起一个域名查询请求时,Local DNS系统从缓存或通过递归从权威DNS获取解析结果,并将最终结果响应给用户,同时把解析请求响应写入日志文件,用于后期统计分析或者问题排查。

但是随着用户请求量的增加,日志成了影响DNS系统性能的最大瓶颈。在多线程模式下不同线程写日志时需要使用全局锁,业务线程每次必须处理完日志落盘才能处理下一个请求包。线程越多锁竞争越大,无法充分利用多线程提供的服务能力。传统日志模式严重影响DNS系统性能,经测试日志开启后DNS系统处理性能下降5倍以上。

另外为提高网络吞吐量,在DPDK用户态模式运行DNS软件,多个进程同时往一个日志文件写日志,文件IO及进程间切换严重拉低dpdk性能。

本发明目的是提出一种高性能DNS日志方法,能同时服务于linux内核态和dpdk用户态。

发明内容

本发明的主要目的在于提供一种无锁环形队列dns日志落盘方法、装置、设备及计算机可读存储介质,旨在提供高性能DNS日志方法,能同时服务于linux内核态和dpdk用户态。

为实现上述目的,本发明提供一种无锁环形队列dns日志落盘方法,所述无锁环形队列dns日志落盘方法包括以下步骤:

根据配置的线程数创建对应数量的共享内存,在每块共享内存上初始化各数据结构,创建日志进程;

创建日志处理线程,间隔预定时间对日志处理线程的日志子线程进行检查,确定日志子线程为健康状态;

每个日志线程从指定的M个队列中消费日志数据,工作线程将从消息队列取出的日志数据一次写到当前线程对应的日志目录下的文件中;

每次日志写完文件后,对日志文件大小进行检查,确定文件大小>=由配置文件指定的参数logrotate,则对日志文件进行实时切割。

在本申请实施例提供的无锁环形队列dns日志落盘方法中,所述根据配置的线程数创建对应数量的共享内存,在每块共享内存上初始化各数据结构,创建日志进程,包括:

DNS系统启动时管理进程根据配置的线程数创建对应数量的共享内存,在每块共享内存上初始化无锁环形队列、内存池管理,最后创建一个日志进程。

在本申请实施例提供的无锁环形队列dns日志落盘方法中,所述创建日志处理线程,间隔预定时间对日志处理线程的日志子线程进行检查,确定日志子线程为健康状态,包括:

日志进程根据配置的硬盘数创建对应数量的日志处理线程,间隔300ms对其所有日志子线程进行健康检查。

在本申请实施例提供的无锁环形队列dns日志落盘方法中,还包括,如果日志线程超过预定时间不更新自己的状态为健康状态,那么日志进程确定认为子线程已经不能正常提供服务,随之将子线程强制终止并重新启动一个子线程来继续工作。

在本申请实施例提供的无锁环形队列dns日志落盘方法中,还包括,如果DNS系统运行在DPDK模式,则日志线程绑CPU。

在本申请实施例提供的无锁环形队列dns日志落盘方法中,

日志线程与硬盘的对应关系为1:1。

在本申请实施例提供的无锁环形队列dns日志落盘方法中,所述如果日志线程超过预定时间不更新自己的状态为健康状态,那么日志进程确定认为子线程已经不能正常提供服务,随之将子线程强制终止并重新启动一个子线程来继续工作,包括:

如果日志线程超过3s不更新自己的状态为健康状态,那么日志进程确定认为子线程已经不能正常提供服务,随之将子线程强制终止并重新启动一个子线程来继续工作。

一种无锁环形队列dns日志落盘装置,所述无锁环形队列dns日志落盘装置包括:

日志创建模块,用于根据配置的线程数创建对应数量的共享内存,在每块共享内存上初始化各数据结构,创建日志进程;

线程创建模块,用于创建日志处理线程,间隔预定时间对日志处理线程的日志子线程进行检查,确定日志子线程为健康状态;

录入模块,用于对每个日志线程从指定的M个队列中消费日志数据,工作线程将从消息队列取出的日志数据一次写到当前线程对应的日志目录下的文件中;

切割模块,用于在每次日志写完文件后,对日志文件大小进行检查,确定文件大小>=由配置文件指定的参数logrotate,则对日志文件进行实时切割。

此外,为实现上述目的,本发明还提供一种无锁环形队列dns日志落盘设备,所述无锁环形队列dns日志落盘设备包括处理器、存储器、以及存储在所述存储器上并可被所述处理器执行的无锁环形队列dns日志落盘程序,其中所述无锁环形队列dns日志落盘程序被所述处理器执行时,实现如上述的无锁环形队列dns日志落盘方法的步骤。

此外,为实现上述目的,本发明还提供一种计算机可读存储介质,所述计算机可读存储介质上存储有无锁环形队列dns日志落盘程序,其中所述无锁环形队列dns日志落盘程序被处理器执行时,实现如上述的无锁环形队列dns日志落盘方法的步骤。

本发明提供一种无锁环形队列dns日志落盘方法,所述方法根据配置的线程数创建对应数量的共享内存,在每块共享内存上初始化各数据结构,创建日志进程;创建日志处理线程,间隔预定时间对日志处理线程的日志子线程进行检查,确定日志子线程为健康状态;每个日志线程从指定的M个队列中消费日志数据,工作线程将从消息队列取出的日志数据一次写到当前线程对应的日志目录下的文件中;每次日志写完文件后,对日志文件大小进行检查,确定文件大小>=由配置文件指定的参数logrotate,则对日志文件进行实时切割。本发明系统资源消耗较少,没有线程锁的竞争。在内核模式,日志开启后,DNS系统处理性能比未开启日志下降小于10%。

业务和日志任务独立,独立的日志线程负责日志落盘,减少多任务并发写文件的锁等待时间。

使用共享内存作为业务线程和日志线程的数据共享载体,每个业务线程持有一块共享内存,共享内存起始部分由无锁环形队列使用,剩余空间由内存池管理组件使用。

业务线程从共享内存池中申请一块小内存,将日志数据格式化后存储至此内存中,并将内存首地址入队到无锁环形队列中,然后继续处理下一个业务请求。

日志线程依次从多个(1~n)无锁环形队列中出队日志数据的地址,将其在共享内存上的日志数据写入自己当前对应的日志文件中,然后将日志数据占用的空间归还给内存池管理组件给其他日志数据再次使用,最后对日志文件进行切割。本申请相对现有技术而言,所具有的优点和效果。

相对于现有技术,此方案有以下几点:

解耦:DNS系统业务线程只需将日志数据入队即可返回处理下一次的请求,由日志线程负责从队列中消费日志数据并写入日志文件。

无锁:每个日志线程对应一个日志文件,解决多个线程为了同步日志写入顺序而加锁的问题。

并发写日志:多个线程日志将日志写到各自对应的硬盘日志文件中。

自动文件切割:无需使用第三方工具对日志文件进行切割,给个日志线程各自维护日志文件大小,满足切割条件时自动进行切割。

支持DPDK:DNS系统在DPDK模式运行时,该方法能够完成日志落盘。

通过此方案,开启日志后性能下降小于10%。极大的提高了设备资源利用率从而降低硬件资源的投入。

附图说明

图1为本发明实施例方案中涉及的无锁环形队列dns日志落盘流程示意图;

图2为传统日志落盘方法;

图3为本发明无锁环形队列dns日志落盘方法流程示意图;

图4为本发明无锁环形队列dns日志落盘方法的基于无锁环形队列的共享内存空间布局;

图5为基于无锁环形队列日志落盘流程图。

本发明目的的实现、功能特点及优点将结合实施例,参照附图做进一步说明。

具体实施方式

应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。

当用户发起一个域名查询请求时,Local DNS系统从缓存或通过递归从权威DNS获取解析结果,并将最终结果响应给用户,同时把解析请求响应写入日志文件,用于后期统计分析或者问题排查。

但是随着用户请求量的增加,日志成了影响DNS系统性能的最大瓶颈。在多线程模式下不同线程写日志时需要使用全局锁,业务线程每次必须处理完日志落盘才能处理下一个请求包。线程越多锁竞争越大,无法充分利用多线程提供的服务能力。传统日志模式严重影响DNS系统性能,经测试日志开启后DNS系统处理性能下降5倍以上。

另外为提高网络吞吐量,在DPDK用户态模式运行DNS软件,多个进程同时往一个日志文件写日志,文件IO及进程间切换严重拉低dpdk性能。

本发明目的是提出一种高性能DNS日志方法,能同时服务于linux内核态和dpdk用户态。

本发明提供一种无锁环形队列dns日志落盘方法,所述方法根据配置的线程数创建对应数量的共享内存,在每块共享内存上初始化各数据结构,创建日志进程;创建日志处理线程,间隔预定时间对日志处理线程的日志子线程进行检查,确定日志子线程为健康状态;每个日志线程从指定的M个队列中消费日志数据,工作线程将从消息队列取出的日志数据一次写到当前线程对应的日志目录下的文件中;每次日志写完文件后,对日志文件大小进行检查,确定文件大小>=由配置文件指定的参数logrotate,则对日志文件进行实时切割。本发明系统资源消耗较少,没有线程锁的竞争。在内核模式,日志开启后,DNS系统处理性能比未开启日志下降小于10%。

业务和日志任务独立,独立的日志线程负责日志落盘,减少多任务并发写文件的锁等待时间。

使用共享内存作为业务线程和日志线程的数据共享载体,每个业务线程持有一块共享内存,共享内存起始部分由无锁环形队列使用,剩余空间由内存池管理组件使用。

业务线程从共享内存池中申请一块小内存,将日志数据格式化后存储至此内存中,并将内存首地址入队到无锁环形队列中,然后继续处理下一个业务请求。

日志线程依次从多个(1~n)无锁环形队列中出队日志数据的地址,将其在共享内存上的日志数据写入自己当前对应的日志文件中,然后将日志数据占用的空间归还给内存池管理组件给其他日志数据再次使用,最后对日志文件进行切割。本申请相对现有技术而言,所具有的优点和效果。

相对于现有技术,此方案有以下几点:

解耦:DNS系统业务线程只需将日志数据入队即可返回处理下一次的请求,由日志线程负责从队列中消费日志数据并写入日志文件。

无锁:每个日志线程对应一个日志文件,解决多个线程为了同步日志写入顺序而加锁的问题。

并发写日志:多个线程日志将日志写到各自对应的硬盘日志文件中。

自动文件切割:无需使用第三方工具对日志文件进行切割,给个日志线程各自维护日志文件大小,满足切割条件时自动进行切割。

支持DPDK:DNS系统在DPDK模式运行时,该方法能够完成日志落盘。

通过此方案,开启日志后性能下降小于10%。极大的提高了设备资源利用率从而降低硬件资源的投入。

本发明实施例涉及的无锁环形队列dns日志落盘方法主要应用于无锁环形队列dns日志落盘设备,该无锁环形队列dns日志落盘设备可以是PC、便携计算机、移动终端等具有显示和处理功能的设备。

本发明实施例方案中涉及的无锁环形队列dns日志落盘设备的硬件结构示意图。本发明实施例中,无锁环形队列dns日志落盘设备可以包括处理器(例如CPU),通信总线,用户接口,网络接口,存储器。其中,通信总线1002用于实现这些组件之间的连接通信;用户接口可以包括显示屏(Display)、输入单元比如键盘(Keyboard);网络接口可选的可以包括标准的有线接口、无线接口(如WI-FI接口);存储器可以是高速RAM存储器,也可以是稳定的存储器(non-volatile memory),例如磁盘存储器,存储器可选的还可以是独立于前述处理器的存储装置。

本领域技术人员可以理解,硬件结构并不构成对无锁环形队列dns日志落盘设备的限定,可以包括比图示更多或更少的部件,或者组合某些部件,或者不同的部件布置。

作为一种计算机可读存储介质的存储器可以包括操作系统、网络通信模块以及无锁环形队列dns日志落盘程序。

网络通信模块主要用于连接服务器,与服务器进行数据通信;而处理器可以调用存储器中存储的无锁环形队列dns日志落盘程序,并执行本发明实施例提供的无锁环形队列dns日志落盘方法。

本发明实施例提供了一种无锁环形队列dns日志落盘方法。

参照图1-图5,图1为本发明无锁环形队列dns日志落盘方法第一实施例的流程示意图。

本实施例中,所述无锁环形队列dns日志落盘方法包括以下步骤:

根据配置的线程数创建对应数量的共享内存,在每块共享内存上初始化各数据结构,创建日志进程;

创建日志处理线程,间隔预定时间对日志处理线程的日志子线程进行检查,确定日志子线程为健康状态;

每个日志线程从指定的M个队列中消费日志数据,工作线程将从消息队列取出的日志数据一次写到当前线程对应的日志目录下的文件中;

每次日志写完文件后,对日志文件大小进行检查,确定文件大小>=由配置文件指定的参数logrotate,则对日志文件进行实时切割。

1.在本实施例中,DNS系统启动时管理进程根据配置的线程数创建对应数量的共享内存(大小由配置文件指定),在每块共享内存上初始化无锁环形队列(单生产者和单消费者模式)、内存池管理等数据结构,最后创建一个日志进程(只做日志线程的管理)。

2.日志进程根据配置的硬盘数创建对应数量的日志处理线程,间隔300ms对其所有日志子线程进行健康检查,如果日志线程超过3s(重试10次)不更新自己的状态为健康状态,那么日志进程将认为子线程已经不能正常提供服务,随之将子线程强制终止并重新启动一个子线程来继续工作。

3.如果DNS系统运行在DPDK模式那么日志线程需要绑CPU,保证日志线程在处理日志数据过程中CPU不被抢占。

4.每个日志线程从指定的M个队列中消费日志数据,这样可以保证队列模式为单生产者,单消费者模式,入队出队无需锁竞争。

M=num-threads/num-logpath

R=num-threads%num-logpath

注意:第一个日志线程需要消费的队列数为M+R

例如:有9个队列(index从0~8),2个日志线程

1号日志线程需要消费的队列数为:

9/2+9%2

=4+1

=5

1号日志线程需要消费的队列列表index范围:[0~5)

2号日志线程需要消费的队列数为:9/2=4

2号日志线程需要消费的队列列表index范围:[5~9)

5.工作线程将从消息队列取出的日志数据一次写到当前线程对应的日志目录下的文件中,日志线程与硬盘的对应关系为1:1(无锁竞争)。

6.每次日志写完文件后,对日志文件大小进行检查,如果文件大小>=由配置文件指定的参数logrotate那么对日志文件进行实时切割。

相对于现有技术,此方案有以下几点:

a)解耦:DNS系统业务线程只需将日志数据入队即可返回处理下一次的请求,由日志线程负责从队列中消费日志数据并写入日志文件。

b)无锁:每个日志线程对应一个日志文件,解决多个线程为了同步日志写入顺序而加锁的问题。

c)并发写日志:多个线程日志将日志写到各自对应的硬盘日志文件中。

d)自动文件切割:无需使用第三方工具对日志文件进行切割,给个日志线程各自维护日志文件大小,满足切割条件时自动进行切割。

e)支持DPDK:DNS系统在DPDK模式运行时,该方法能够完成日志落盘。

通过此方案,开启日志后性能下降小于10%。极大的提高了设备资源利用率从而降低硬件资源的投入。

在本实施例中,本发明提供一种无锁环形队列dns日志落盘方法,所述方法根据配置的线程数创建对应数量的共享内存,在每块共享内存上初始化各数据结构,创建日志进程;创建日志处理线程,间隔预定时间对日志处理线程的日志子线程进行检查,确定日志子线程为健康状态;每个日志线程从指定的M个队列中消费日志数据,工作线程将从消息队列取出的日志数据一次写到当前线程对应的日志目录下的文件中;每次日志写完文件后,对日志文件大小进行检查,确定文件大小>=由配置文件指定的参数logrotate,则对日志文件进行实时切割。本发明系统资源消耗较少,没有线程锁的竞争。在内核模式,日志开启后,DNS系统处理性能比未开启日志下降小于10%。

业务和日志任务独立,独立的日志线程负责日志落盘,减少多任务并发写文件的锁等待时间。

使用共享内存作为业务线程和日志线程的数据共享载体,每个业务线程持有一块共享内存,共享内存起始部分由无锁环形队列使用,剩余空间由内存池管理组件使用。

业务线程从共享内存池中申请一块小内存,将日志数据格式化后存储至此内存中,并将内存首地址入队到无锁环形队列中,然后继续处理下一个业务请求。

日志线程依次从多个(1~n)无锁环形队列中出队日志数据的地址,将其在共享内存上的日志数据写入自己当前对应的日志文件中,然后将日志数据占用的空间归还给内存池管理组件给其他日志数据再次使用,最后对日志文件进行切割。本申请相对现有技术而言,所具有的优点和效果。

相对于现有技术,此方案有以下几点:

解耦:DNS系统业务线程只需将日志数据入队即可返回处理下一次的请求,由日志线程负责从队列中消费日志数据并写入日志文件。

无锁:每个日志线程对应一个日志文件,解决多个线程为了同步日志写入顺序而加锁的问题。

并发写日志:多个线程日志将日志写到各自对应的硬盘日志文件中。

自动文件切割:无需使用第三方工具对日志文件进行切割,给个日志线程各自维护日志文件大小,满足切割条件时自动进行切割。

支持DPDK:DNS系统在DPDK模式运行时,该方法能够完成日志落盘。

通过此方案,开启日志后性能下降小于10%。极大的提高了设备资源利用率从而降低硬件资源的投入。

在一些实施例中,所述根据配置的线程数创建对应数量的共享内存,在每块共享内存上初始化各数据结构,创建日志进程,包括:

DNS系统启动时管理进程根据配置的线程数创建对应数量的共享内存,在每块共享内存上初始化无锁环形队列、内存池管理,最后创建一个日志进程。

在一些实施例中,所述创建日志处理线程,间隔预定时间对日志处理线程的日志子线程进行检查,确定日志子线程为健康状态,包括:

日志进程根据配置的硬盘数创建对应数量的日志处理线程,间隔300ms对其所有日志子线程进行健康检查。

在一些实施例中,还包括,如果日志线程超过预定时间不更新自己的状态为健康状态,那么日志进程确定认为子线程已经不能正常提供服务,随之将子线程强制终止并重新启动一个子线程来继续工作。

在一些实施例中,还包括,如果DNS系统运行在DPDK模式,则日志线程绑CPU。

在一些实施例中,日志线程与硬盘的对应关系为1:1。

在一些实施例中,所述如果日志线程超过预定时间不更新自己的状态为健康状态,那么日志进程确定认为子线程已经不能正常提供服务,随之将子线程强制终止并重新启动一个子线程来继续工作,包括:

如果日志线程超过3s不更新自己的状态为健康状态,那么日志进程确定认为子线程已经不能正常提供服务,随之将子线程强制终止并重新启动一个子线程来继续工作。

该日志解决方案可以应用到CDNLocalDNS,公共DNS,运行商DNS等系统需要日志落盘的场景。

业务和日志任务独立:独立的日志线程负责日志落盘,减少多任务并发写文件的锁等待时间。

DNS日志通过多日志线程均衡的写到不同的磁盘上来提高整体io性能,日志文件自动切割。

DNS系统在DPDK模式下运行时,该方法也能完成日志的落盘,使DNS系统以很高的性能提供域名解析服务

一种无锁环形队列dns日志落盘装置,所述无锁环形队列dns日志落盘装置包括:

日志创建模块,用于根据配置的线程数创建对应数量的共享内存,在每块共享内存上初始化各数据结构,创建日志进程;

线程创建模块,用于创建日志处理线程,间隔预定时间对日志处理线程的日志子线程进行检查,确定日志子线程为健康状态;

录入模块,用于对每个日志线程从指定的M个队列中消费日志数据,工作线程将从消息队列取出的日志数据一次写到当前线程对应的日志目录下的文件中;

切割模块,用于在每次日志写完文件后,对日志文件大小进行检查,确定文件大小>=由配置文件指定的参数logrotate,则对日志文件进行实时切割。

其中,上述无锁环形队列dns日志落盘装置中各个模块与上述无锁环形队列dns日志落盘方法实施例中各步骤相对应,其功能和实现过程在此处不再一一赘述。

此外,本发明实施例还提供一种计算机可读存储介质。

本发明计算机可读存储介质上存储有无锁环形队列dns日志落盘程序,其中所述无锁环形队列dns日志落盘程序被处理器执行时,实现如上述的无锁环形队列dns日志落盘方法的步骤。

其中,无锁环形队列dns日志落盘程序被执行时所实现的方法可参照本发明无锁环形队列dns日志落盘的各个实施例,此处不再赘述。

需要说明的是,在本文中,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者系统不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者系统所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括该要素的过程、方法、物品或者系统中还存在另外的相同要素。

上述本发明实施例序号仅仅为了描述,不代表实施例的优劣。

本申请可用于众多通用或专用的计算机系统环境或配置中。例如:个人计算机、服务器计算机、手持设备或便携式设备、平板型设备、多处理器系统、基于微处理器的系统、置顶盒、可编程的消费电子设备、网络PC、小型计算机、大型计算机、包括以上任何系统或设备的分布式计算环境等等。本申请可以在由计算机执行的计算机可执行指令的一般上下文中描述,例如程序模块。一般地,程序模块包括执行特定任务或实现特定抽象数据类型的例程、程序、对象、组件、数据结构等等。也可以在分布式计算环境中实践本申请,在这些分布式计算环境中,由通过通信网络而被连接的远程处理设备来执行任务。在分布式计算环境中,程序模块可以位于包括存储设备在内的本地和远程计算机存储介质中。

通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到上述实施例方法可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件,但很多情况下前者是更佳的实施方式。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在如上所述的一个存储介质(如ROM/RAM、磁碟、光盘)中,包括若干指令用以使得一台终端设备(可以是手机,计算机,服务器,空调器,或者网络设备等)执行本发明各个实施例所述的方法。

以上仅为本发明的优选实施例,并非因此限制本发明的专利范围,凡是利用本发明说明书及附图内容所作的等效结构或等效流程变换,或直接或间接运用在其他相关的技术领域,均同理包括在本发明的专利保护范围内。

技术分类

06120116580927