本发明总的来说涉及线程池。具体而言,本发明涉及一种基于神经网络的动态维护线程池的方法及线程池。
背景技术:
1、随着养老业务的不断发展,养老业务整体的业务逻辑变得越来越负责,很多业务处理需要聚合多个服务的数据再返回给用户,调用服务的过程十分耗时。如果进行串行调用,那么系统的响应时间将会非常长,同时也会占用服务器的工作线程,进而影响整个系统的吞吐量。
2、为了优化系统的响应时间,通常会将串行调用改为并行调用,通过多线程来执行聚合操作,但是在操作系统中线程是一种相对比较昂贵的资源,因此不能无限制地创建线程、销毁线程,这对系统性能产生了极大的影响。
3、针对上述问题,通常需要通过线程池来复用线程,进而避免频繁地创建和销毁线程所带来的开销,同时还可以限制系统中的线程数量,避免资源的浪费和竞争。
4、在养老业务系统中有许多典型场景都用到了线程池。图2示出了一个用户请求进行服务的场景中的线程示意图。如图2所示,在该场景中用户提交订单时需要查询并且将多个维度的信息(例如价格、优惠、积分等信息)聚合起来创建订单,创建订单后还需要通过许多下游系统进行处理。如果将上述线程串行化则会造成响应时间过长,极大影响用户体验。由于面向用户的功能聚合通常非常复杂,并且还会伴随调用与调用之间的级联、多级级联等情况,因此可以通过线程池将调用封装成任务并行的执行进程,进而缩短整体的响应时间。在该场景中,使用线程池最重要的目的是获取最快的响应速度来满足用户,因此不会设置队列去缓冲并发任务,而是调高核心线程数和最大线程数进而能够尽可能的创造更多的线程快速执行任务。
5、图3示出了一个产生工单的场景中的线程示意图。如图3所示,在该场景中同样也希望任务执行地越快越好,因此也需要使用多线程并行计算的策略。但与响应速度优先的场景相比,该场景虽然任务栏巨大,但并不需要瞬时完成,而是更倾向于在有限的资源下尽可能在单位时间内处理更多的任务。也就是说这是一个吞吐量优先的场景,应该设置队列缓冲并发任务,并且调整合适的核心线程数以设置处理任务的线程数。该场景中设置的线程数过度反而会引发线程上下文切换频繁的问题,也会降低任务的处理速度,降低吞吐量。
6、在传统的养老业务系统中,线程池通常是手动创建的,线程池的核心线程数等参数是硬编码。然而随着养老业务的不断发展,用户数量不断增加,对养老业务系统的服务性能的要求也越来越高,发明人在对服务进行全链路压测的过程中发现,传统的线程池仍存在下列问题:线程池大小不足,导致请求无法得到处理,进而影响系统性能;线程池大小过大,导致系统资源消耗过度,影响系统的稳定性和性能;队列出于满载的状态,使得新的请求将被拒绝,导致请求失败;任务执行时间过长,影响线程池中其他任务的执行,进而影响系统性能;以及当多个线程池的其中一个占用过多资源时,将造成其它线程池性能下降。
技术实现思路
1、为至少部分解决现有技术中的上述问题,本发明提出一种基于神经网络的动态维护线程池的方法,包括下列步骤:
2、当线程池中没有空闲线程时,使用负值数分布预测线程池出现空闲线程的概率;
3、确定线程池的当前负载情况,根据线程池的当前负载情况增大线程池的核心线程数或者将线程池扩容;以及
4、基于神经网络预测线程池的未来负载情况,根据线程池的未来负载情况增大线程池的核心线程数或者将线程池扩容。
5、在本发明一个实施例中规定,使用负值数分布预测线程池出现空闲线程的概率包括下列步骤:
6、收集线程池的时间数据,其中所述时间数据包括线程池的核心线程执行任务完成的时间;
7、根据所述时间数据进行负指数分布拟合以确定负指数分布参数λ,其中负指数分布的概率密度函数表示为下式:
8、f(x|λ)=λ×e-λx,x≥0,λ>0;
9、根据所述负指数分布参数入,使用累积分布函数预测线程池在t时间之前出现空闲线程的概率,表示为下式:
10、f(t)=1-e-λx;以及
11、以1-f(t)表示线程池在t时间之后出现空闲线程的概率,并且根据预设的置信水平确定线程池出现空闲线程的时间。
12、在本发明一个实施例中规定,确定线程池的当前负载情况包括通过计算线程池的负载分数score以确定线程池的当前负载情况,表示为下式:
13、score=wcpu×cpuutilization+wmemory×memoryutilization+wdisk_io×disk_ioutilization+wnetwork×network_bandwidthutilization
14、其中,cpuutilization表示cpu使用率、wcpu表示cpu使用率的权重、memoryutilization表示内存使用率、wmemory表示内存使用率的权重、disk_ioutilization表示硬盘i/0使用率、wdisk_io表示硬盘i/o使用率的权重、network_bandwidthutilization表示网络带宽使用率、wnetwork表示网络带宽使用率的权重。
15、在本发明一个实施例中规定,根据线程池的当前负载情况增大线程池的核心线程数或者将线程池扩容包括:
16、将负载分数score与扩容的触发阈值thresholdexpand以及调大核心线程的触发阈值thresholdincrease_core_threads进行比较,thresholdexpand>thresholdincrease_core_threads,其中当score≥thresholdexpana时将线程池扩容,当score≥thresholdincrease_core_threads时调大线程池的核心线程数。
17、在本发明一个实施例中规定,所述基于神经网络的动态维护线程池的方法还包括:
18、当score<thresholdincrease_core_threads时发出告警通知进行人工干预。
19、在本发明一个实施例中规定,基于神经网络预测线程池的未来负载情况包括下列步骤:
20、收集线程池的历史负载指标数据,并且对所述历史负载指标数据进行预处理;
21、对预处理后的数据进行特征提取;
22、将特征提取后的数据划分为训练集以及测试集,其中训练集用于训练神经网络模型,测试集用于评估神经网络模型的性能;
23、提供神经网络模型,其中使用循环神经网络捕捉时间序列的动态变化;
24、使用训练集数据对神经网络模型进行训练并且优化均方差损失函数;
25、使用测试集数据对训练好的神经网络模型进行验证,并且根据验证结果对神经网络的超参数进行调优;以及
26、通过滚动窗口的方式使用训练后的神经网络模型预测线程池的未来负载情况。
27、在本发明一个实施例中规定,所述基于神经网络的动态维护线程池的方法还包括:
28、当线程池的未来负载情况出现增长时增大线程池的核心线程数,并且当线程池的未来负载情况超过扩容的触发阈值时对线程池进行弹性扩容。
29、本发明还提出一种基于神经网络进行动态维护的线程池,其包括:
30、空闲线程预测模块,其被配置为在线程池中没有空闲线程时,使用负值数分布预测线程池出现空闲线程的概率;
31、当前负载情况计算模块,其被配置为确定线程池的当前负载情况,根据线程池的当前负载情况增大线程池的核心线程数或者将线程池扩容;以及
32、未来负载情况预测模块,其被配置为基于神经网络预测线程池的未来负载情况,根据线程池的未来负载情况增大线程池的核心线程数或者将线程池扩容。
33、本发明还提出一种计算机可读存储介质,其上存储有计算机程序,所述计算机程序在被处理器执行时执行根据所述方法的步骤。
34、本发明还提出一种计算机系统,其包括:
35、处理器,其被配置为执行机器可执行指令;以及
36、存储器,其上存储有机器可执行指令,所述机器可执行指令在被处理器执行时执行根据所述方法的步骤。
37、本发明至少具有如下有益效果:本发明提供一种基于神经网络的动态维护线程池的方法,其可以提升线程池的灵活性以及整体的系统反应速度,避免在大量任务涌入线程池时任务无法被及时处理,同时可以避免线程池过大导致系统资源消耗过度影响系统的稳定性和性能,此外还可以避免在任务队列满载时拒绝任务导致请求失败。