太阳城集团

  • / 30
  • 下载费用:30 金币  

用于支持分布式数据网格中的动态线程池大小确定的系统和方法.pdf

摘要
申请专利号:

太阳城集团CN201580051317.0

申请日:

2015.09.18

公开号:

CN106716367A

公开日:

2017.05.24

当前法律状态:

实审

有效性:

审中

法律详情: 实质审查的生效IPC(主分类):G06F 9/50申请日:20150918|||公开
IPC分类号: G06F9/50 主分类号: G06F9/50
申请人: 甲骨文国际公司
发明人: G·格莱泽; J·J·豪斯
地址: 美国加利福尼亚
优先权: 2014.09.25 US 62/055,476; 2014.09.25 US 62/055,477; 2015.09.17 US 14/857,452; 2015.09.17 US 14/857,458
专利代理机构: 中国国际贸易促进委员会专利商标事务所 11038 代理人: 李玲
PDF完整版下载: PDF下载
法律状态
申请(专利)号:

太阳城集团CN201580051317.0

授权太阳城集团号:

|||

法律状态太阳城集团日:

2017.06.16|||2017.05.24

法律状态类型:

太阳城集团实质审查的生效|||公开

摘要

一种系统和方法支持适合在多线程处理环境(诸如,分布式数据网格)中使用的动态线程池大小确定。动态线程池大小调整利用线程池吞吐量和工作者线程利用率的测量结合对先前线程池大小调整动作的功效的分析,以确定是否在当前大小调整动作中向线程池添加工作者线程或从中去除工作者线程。此外,动态线程池大小调整系统和方法可以取决于系统的需要加快或减慢迭代的大小调整分析和工作者线程添加和去除的速率。引入了优化以防止停滞在局部最大吞吐量上。动态线程池大小确定/大小调整系统和方法由此响应于工作负荷和处理器可用性的改变而提供对线程池大小的快速和响应式的调整。

权利要求书

1.一种用于支持多线程处理系统中的包括多个工作者线程的线程池的动态大小调整
的方法,所述方法包括通过以下步骤来执行大小调整作业:
测量当前时段中线程池的吞吐量(T.now);
通过将T.now与在先前时段中测量的线程池的吞吐量(T.last)进行比较来确定线程池
的吞吐量的改变(T.delta);
执行大小调整动作,所述大小调整动作包括以下之一:使得向线程池添加一个或多个
工作者线程、使得从线程池去除一个或多个工作者线程、以及使得线程池不发生改变;
基于如由T.delta所指示的在先前时段之后执行的先前大小调整动作的功效来计算用
于下一个时段的持续太阳城集团;以及
调度在下一个时段期满之后要执行的下一个大小调整作业。
2.如权利要求1所述的方法,其中所述大小调整动作包括以下之一:使得向线程池添加
随机数量的工作者线程,以及如果用于随机大小调整的太阳城集团段已经期满,那么使得从线程
池中去除随机数量的工作者线程。
3.如权利要求1或2所述的方法,其中所述大小调整动作包括:如果先前大小调整动作
使得向线程池添加一个或多个工作者线程并且T.delta指示吞吐量在当前时段中相对于先
前时段已经显著增加,那么也使得向线程池添加一个或多个工作者线程。
4.如前述权利要求中任何一项所述的方法,其中所述大小调整动作包括:如果先前大
小调整动作使得向线程池添加一个或多个工作者线程并且T.delta指示吞吐量在当前时段
中相对于先前时段已经显著减少,那么使得从线程池中去除一个或多个工作者线程。
5.如前述权利要求中任何一项所述的方法,其中所述大小调整动作包括:如果先前大
小调整动作使得从线程池中去除一个或多个工作者线程并且T.delta指示吞吐量在当前时
段中相对于先前时段已经显著增加,那么也使得从线程池去除一个或多个工作者线程。
6.如前述权利要求中任何一项所述的方法,其中所述大小调整动作包括:如果先前大
小调整动作使得从线程池去除一个或多个工作者线程并且T.delta指示吞吐量在当前时段
中相对于先前时段已经显著减少,那么使得向线程池添加一个或多个工作者线程。
7.如前述权利要求中任何一项所述的方法,其中所述大小调整动作包括:如果先前大
小调整动作使得线程池不发生改变,线程池中的所述多个工作者线程被过度利用,并且
T.delta指示吞吐量在当前时段相对于先前时段已经显著增加,那么使得向线程池添加一
个或多个工作者线程。
8.如前述权利要求中任何一项所述的方法,其中所述大小调整动作包括:如果先前大
小调整动作使得线程池不发生改变,线程池中的所述多个工作者线程未被充分利用,并且
T.delta指示吞吐量在当前时段中相对于先前时段已经显著减少,那么使得从线程池去除
一个或多个工作者线程。
9.如前述权利要求中任何一项所述的方法,其中所述大小调整动作包括:如果T.delta
指示吞吐量在当前时段中相对于先前时段没有显著改变,并且线程池中的所述多个工作者
线程被过度利用,那么使得向线程池添加一个或多个工作者线程。
10.如前述权利要求中任何一项所述的方法,其中所述大小调整动作包括:如果
T.delta指示吞吐量在当前时段中相对于先前时段没有显著改变,并且线程池中的所述多
个工作者线程未被充分利用,那么使得从线程池中去除一个或多个工作者线程。
11.一种用于支持动态线程池大小调整的系统,所述系统包括:
具有存储器和处理器的计算机系统,其中处理器具有多个核并且能够进行多线程操
作;
在所述计算机系统上操作的线程池,其中所述线程池包括多个工作者线程;
其中所述多个工作者线程中的工作者线程被配置成执行大小调整作业,所述大小调整
作业包括:
测量当前时段中线程池的吞吐量(T.now),
通过将T.now与在先前时段中测量的线程池的吞吐量(T.last)进行比较来确定线程池
的吞吐量的改变(T.delta),
执行大小调整动作,其中大小调整动作包括以下之一:使得向线程池添加一个或多个
工作者线程、使得从线程池去除一个或多个工作者线程、以及使得线程池不发生改变,
基于如由T.delta所指示的在先前时段之后执行的先前大小调整动作的功效来计算用
于下一个时段的持续太阳城集团,以及
调度在下一个时段期满之后要由所述多个工作者线程中的工作者线程执行的下一个
大小调整作业。
12.如权利要求11所述的系统,其中所述大小调整动作包括以下之一:使得向线程池添
加随机数量的工作者线程,以及如果用于随机大小调整的太阳城集团段已经期满,那么使得从线
程池中去除随机数量的工作者线程。
13.如权利要求11或12所述的系统,其中所述大小调整动作包括:如果先前大小调整动
作使得向线程池添加一个或多个工作者线程并且T.delta指示吞吐量在当前时段中相对于
先前时段已经显著增加,那么也使得向线程池添加一个或多个工作者线程。
14.如权利要求11至13中任何一项所述的系统,其中所述大小调整动作包括:如果先前
大小调整动作使得向线程池添加一个或多个工作者线程并且T.delta指示吞吐量在当前时
段中相对于先前时段已经显著减少,那么使得从线程池去除一个或多个工作者线程。
15.如权利要求11至14中任何一项所述的系统,其中所述大小调整动作包括:如果先前
大小调整动作使得从线程池去除一个或多个工作者线程并且T.delta指示吞吐量在当前时
段中相对于先前时段已经显著增加,那么也使得从线程池去除一个或多个工作者线程。
16.如权利要求11至15中任何一项所述的系统,其中所述大小调整动作包括:如果先前
大小调整动作使得从线程池去除一个或多个工作者线程并且T.delta指示吞吐量在当前时
段中相对于先前时段已经显著减少,那么使得向线程池添加一个或多个工作者线程。
17.如权利要求11至16中任何一项所述的系统,其中所述大小调整动作包括:如果先前
大小调整动作使得线程池不发生改变,线程池中的所述多个工作者线程被过度利用,并且
T.delta指示吞吐量在当前时段相对于先前时段已经显著增加,那么使得向线程池添加一
个或多个工作者线程。
18.如权利要求11至17中任何一项所述的系统,其中所述大小调整动作包括如果先前
大小调整动作使得线程池不发生改变,线程池中的所述多个工作者线程未被充分利用,并
且T.delta指示吞吐量在当前时段中相对于先前时段已经显著减少,那么使得从线程池去
除一个或多个工作者线程。
19.如权利要求1所述的系统,其中所述大小调整动作包括:
如果T.delta指示吞吐量在当前时段中相对于先前时段没有显著改变,并且线程池中
的所述多个工作者线程被过度利用,那么使得向线程池添加一个或多个工作者线程;以及
如果T.delta指示吞吐量在当前时段中相对于先前时段没有显著改变,并且线程池中
的所述多个工作者线程未被充分利用,那么使得从线程池中去除一个或多个工作者线程。
20.一种非瞬态计算机可读介质,所述介质包括存储在其上用于支持多线程处理系统
中包括多个工作者线程的线程池的动态线程池大小调整的指令,当所述指令由所述线程池
中的工作者线程执行时使得工作者线程执行包括以下的步骤:
执行大小调整作业;
其中大小调整作业包括测量当前时段中线程池的吞吐量(T.now);
其中大小调整作业还包括通过将T.now与在先前时段中测量的线程池的吞吐量
(T.last)进行比较来确定线程池的吞吐量的改变(T.delta);
其中大小调整作业还包括执行大小调整动作,所述大小调整动作包括以下之一:使得
向线程池添加一个或多个工作者线程、使得从线程池去除一个或多个工作者线程、以及使
得线程池不发生改变;
其中大小调整作业还包括基于如由T.delta所指示的在先前时段之后执行的先前大小
调整动作的功效来计算用于下一个时段的持续太阳城集团;以及
其中大小调整作业还包括调度在下一个时段期满之后要执行的下一个大小调整作业。
21.如权利要求1至10中任何一项所述的方法,其中执行一系列大小调整作业,每一个
大小调整作业在相应的时段中执行。
22.一种包括指令的计算机程序,当所述指令在多线程计算机系统中执行时执行如权
利要求1至10或21中任何一项所述的方法,所述方法用于多线程计算机系统中包括多个工
作者线程的线程池的动态大小调整。

说明书

用于支持分布式数据网格中的动态线程池大小确定的系统和方法

版权声明:

本专利文档的公开内容的一部分包含受版权保护的素材。版权拥有者不反对任何
人对专利文档或专利公开内容按照它在专利商标局的专利文件或记录中出现的那样进行
传真复制,但是除此之外在任何情况下都保留所有版权。

技术领域

本发明一般而言涉及计算机系统,并且具体而言涉及分布式数据网格。

发明内容

本文描述的是可以支持分布式数据网格中的线程池大小确定(sizing)和大小调
整(resizing)的系统和方法。如在随后的分布式数据网格的描述中所描述的,由分布式数
据网格的节点提供的服务通常使用一个服务线程来提供服务的特定功能。一些服务可选地
支持可以被配置成向服务线程提供附加的处理资源的工作者线程的线程池。本公开描述了
一种可以被配置成向服务线程提供附加的处理资源的工作者线程的可伸缩线程池以及一
种用于可伸缩线程池的动态大小调整的系统和方法。本文描述的动态线程池大小确定和大
小调整的系统和方法也可适用于各种各样的其它多线程处理环境。

在实施例中,本公开描述了支持适合在多线程处理环境(诸如,分布式数据网格)
中使用的动态线程池大小确定的系统和方法。可以例如在与分布式数据网格中的服务线程
相关联的可伸缩线程池中执行动态线程池大小调整。动态线程池大小调整利用线程池吞吐
量和工作者线程利用率的测量结合对先前线程池大小调整动作的功效的分析,以确定是否
在当前大小调整动作中向线程池添加工作者线程或从线程池中去除工作者线程。此外,动
态线程池大小调整系统和方法可以取决于系统的需要加快或减慢大小调整的分析,并且因
此加快或减慢工作者线程添加和去除的速率。结合了优化以防止停滞在局部最大吞吐量
上。动态线程池大小调整系统和方法从而响应于工作负载和处理器可用性的改变而提供对
线程池大小的快速和响应式的调整。

在实施例中,本公开描述了可以支持分布式数据网格中的动态线程池大小确定的
系统和方法。该系统可以测量在一段太阳城集团内的线程池的总吞吐量。然后,该系统可以确定线
程池的总吞吐量自上一个时段的改变,并且如果满足一个或多个标准,那么可以将线程池
的大小调整随机的量。此外,系统可以基于在上一个时段中线程池的大小调整的有效程度
来确定下一个时段的长度。

在特定实施例中,本公开描述了用于支持包括多线程处理系统中的多个工作者线
程的线程池的动态线程池大小调整的方法、系统或非瞬态介质。该方法、系统和非瞬态介质
中的每一个通过执行大小调整作业来支持线程池的动态线程池大小调整。大小调整作业包
括测量当前时段中的线程池的吞吐量(T.now),并且根据T.now和在先前时段中测得的线程
池的吞吐量(T.last)计算线程池的吞吐量的改变(T.delta)。大小调整作业还包括执行大
小调整动作,该动作包括以下之一:使得向线程池添加一个或多个工作者线程、使得从线程
池中去除一个或多个工作者线程、以及使得线程池不发生改变。大小调整作业还包括基于
在上一个时段之后执行的先前大小调整动作的功效(如由T.delta所指示的那样)计算下一
个时段的持续太阳城集团,然后调度要在下一个时段期满之后执行的下一个大小调整作业。

当在附图的启发下阅读时,根据各种实施例的以下描述,本发明的这些和其它目
的和优点对于本领域技术人员将变得显而易见。

附图说明

图1图示根据本发明的实施例的分布式数据网格。

图2图示根据本发明的实施例的可伸缩线程池系统。

图3A和3B图示根据本发明的实施例的可伸缩线程池系统和方法。

图4A图示根据本发明的实施例的用于将工作者线程添加到图2、3A和3B的可伸缩
线程池系统的方法。

图4B图示根据本发明的实施例的用于从图2、3A和3B的可伸缩线程池系统中去除
工作者线程的方法。

图5图示根据本发明的实施例的用于可伸缩线程池的动态大小确定的方法。

图6图示根据本发明的实施例的用于可伸缩线程池的动态大小确定的方法。

图7图示根据本发明的实施例的分布式数据网格中的可伸缩线程池和用于可伸缩
线程池的动态大小调整的系统的实现。

具体实施方式

本文描述的是可以支持分布式数据网格中的动态线程池大小确定的系统和方法。
如在随后的分布式数据网格的描述中所描述的,由分布式数据网格的节点提供的服务通常
使用一个服务线程来提供服务的特定功能。一些服务可选地支持可以被配置成向服务线程
提供附加的处理资源的工作者线程的线程池。本公开描述了一种可以被配置成向服务线程
提供附加的处理资源的工作者线程的可伸缩线程池以及一种用于可伸缩线程池的动态大
小调整的系统和方法。本文描述的用于动态线程池大小确定的系统和方法在下面太阳城集团图1
描述的分布式数据网格和下面太阳城集团图2、3A、3B、4A和4B描述的可伸缩线程池中具有特定的
效用。如本文公开的动态线程池大小确定/大小调整还可以应用于各种各样的替代的线程
池系统和其它多线程处理环境和应用中。

在以下描述中,将在附图的图中通过示例的方式而非限制的方式图示本发明。对
本公开中的各种实施例的引用不一定是对相同的实施例的引用,并且这样的引用意味着至
少一个。虽然讨论了具体实现,但是应当理解的是,这只是为了说明性的目的而提供。相关
领域的技术人员将认识到的是,在不脱离本发明的范围和精神的情况下,可以使用其它组
件和配置。

此外,在某些情况下,将阐述许多具体细节以提供对本发明的详尽描述。但是,对
于本领域技术人员将显而易见的是,可以在没有这些具体细节的情况下实践本发明。在其
它情况下,没有详细描述众所周知的特征,以免模糊本发明。

借助于图示特定功能的性能及特定功能的关系的功能构建块描述本发明。为了方
便描述,这些功能构建块的边界在本文往往被任意地定义。因此,示出为由相同元件执行的
功能在替代实施例中可由不同元件执行。并且示出为在单独元件中执行的功能可以替代地
合并到一个元件中。只要适当地执行特定功能及其关系,就可以定义替代边界。任何这样的
替代边界因此在本发明的范围和精神之内。

贯穿附图和详细描述,使用了共同的标号来指示相同的元件;因此,如果在其它地
方描述元件,那么可以或可以不在特定于该图的详细描述中引用在图中使用的标号。三位
数字标号中的第一个数字指示该元件首次出现的图系列。

分布式数据网格

分布式数据网格是其中计算机服务器的集合在一个或多个集群中一起工作以管
理分布式或集群环境内的太阳城集团和相关操作(诸如,计算)的系统。分布式数据网格可以用于
管理跨服务器共享的应用对象和数据。分布式数据网格提供低响应太阳城集团、高吞吐量、可预测
的可伸缩性、连续可用性和太阳城集团可靠性。作为这些能力的结果,分布式数据网格非常适合在
计算密集型、有状态的中间层应用中使用。在特定示例中,分布式数据网格(诸如例如,
Coherence数据网格)在内存中(in-memory)存储太阳城集团以实现更高的性能,并且
在保持该太阳城集团的拷贝跨若干服务器同步中采用冗余,从而在服务器故障的情况下确保系统
的回弹以及数据持续的可用性。

在以下描述中,描述了具有分区的高速缓存的 Coherence数据网格。
但是,本领域的普通技术人员将理解的是,在不脱离本发明的范围的情况下,例如在以上发
明内容中描述的本发明可以应用于本领域已知的任何分布式数据网格。此外,虽然描述了
Coherence分布式数据网格的许多具体细节以提供对本发明的详尽描述,但是
对于本领域技术人员来说将显而易见的是,可以在没有这些具体细节的分布式数据网格中
实践本发明。因此,在一些实施例中,在不脱离本发明的范围的情况下,体现本发明的分布
式数据网格的特定实现可以排除某些特征、和/或包括与下面描述的分布式数据网格不同
的或经修改的特征。

图1图示存储数据并且向客户端150提供数据访问的分布式数据网格100的示例。
“数据网格集群”或“分布式数据网格”是包括多个计算机服务器(例如,120a、120b、120c和
120d)的系统,这些计算机服务器在一个或多个集群(例如,100a、100b、100c)中一起工作以
在分布式或集群环境中存储和管理太阳城集团以及相关操作(诸如,计算)。虽然分布式数据网格
100被图示为包括四个服务器120a、120b、120c、120d,在集群100a中具有五个数据节点
130a、130b、130c、130d和130e,但是分布式数据网格100可以包括任何数量的集群和每一个
集群中任何数量的服务器和/或节点。分布式数据网格可以在内存中存储太阳城集团以实现更高
的性能,并且在保持该太阳城集团的拷贝跨若干服务器同步中采用冗余,从而在服务器故障的情
况下确保系统的回弹以及数据持续的可用性。在实施例中,分布式数据网格100实现例如在
以上发明内容和下面的详细描述中所描述的本发明。

如图1所图示的,分布式数据网格通过在在一起工作的数个服务器(例如,120a、
120b、120c和120d)上分布数据来提供数据存储和管理能力。数据网格集群的每一个服务器
可以是常规的计算机系统,诸如例如,具有一个到两个处理器插座并且每处理器插座有两
个到四个CPU核的“商品x86”服务器硬件平台。每一个服务器(例如,120a、120b、120c和
120d)被配置有一个或多个CPU、网络接口卡(NIC)和存储器,包括例如最小4GB的RAM,多至
64GB或更大的RAM。服务器120a被图示为具有CPU 122a、存储器124a和NIC 126a(这些元件
在其它服务器120b、120c、120d中也存在但没有示出)。可选地,每一个服务器也可以提供有
闪存—例如SSD 128a—以提供溢出存储容量。当被提供时,SSD容量优选地是RAM的大小的
十倍。数据网格集群100a中的服务器(例如120a、120b、120c、120d)使用高带宽NIC(例如,
PCI-X或PCIe)连接到高性能网络交换机120(例如,千兆以太网或更高)。

集群100a优选地包含最少四个物理服务器以避免在故障期间数据丢失的可能性,
但是典型的安装具有更多的服务器。每一个集群中存在的服务器越多,故障转移和故障恢
复越高效,并且服务器故障对集群的影响减少。为了最小化服务器之间的通信太阳城集团,每一个
数据网格集群理想地被限制于在服务器之间提供单跳通信的单个交换机102。集群因此会
受到交换机102上的端口数量限制。典型的集群因此将包括4个到96个之间的物理服务器。

在分布式数据网格100的大多数广域网(WAN)配置中,WAN中的每一个数据中心具
有独立但互连的数据网格集群(例如,100a、100b和100c)。WAN可以例如包括比图1中所示的
更多的集群。另外,通过使用互连但独立的集群(例如,100a、100b、100c)和/或在彼此远离
的数据中心中定位互连但独立的集群,分布式数据网格可以为客户端150保护数据和服务,
防止由自然灾害、火灾、洪水、长太阳城集团的电力瘫痪等引起的一个集群中的所有服务器的同时
丢失。贯穿企业和跨地域维护的集群构成用于企业数据的自动“备份存储”和高可用性服
务。

一个或多个节点(例如,130a、130b、130c、130d和130e)在集群100a的每一个服务
器(例如,120a、120b、120c、120d)上操作。在分布式数据网格中,节点可以是例如软件应用、
虚拟机等,并且服务器可以包括节点在其上操作的操作系统、管理程序等(未示出)。在
Coherence数据网格中,每一个节点是Java虚拟机(JVM)。取决于CPU处理能力
和服务器上可用的存储器,可以在每一个服务器上提供数个JVM/节点。JVM/节点可以如分
布式数据网格所要求的那样进行添加、启动、停止和删除。运行 Coherence的
JVM在启动时自动加入和聚集。加入集群的JVM/节点被称为集群成员或集群节点。

在 Coherence数据网格中,集群成员使用Tangosol集群管理协议
(TCMP)进行通信。TCMP是用于发现集群成员、管理集群、供给服务以及在集群成员之间传输
数据的基于IP的协议。TCMP协议提供所有消息的完全可靠的、有序的递送。由于底层UDP/IP
协议不提供可靠的或有序的递送,因此TCMP使用排队的、完全异步的、基于ACK和NACK的机
制用于消息的可靠递送,用唯一整体身份(unique integral identity)保证与在服务器上
操作的JVM相关联的队列中的消息的排序。不论集群大小,TCMP协议只需要每一个JVM/节点
三个UDP/IP套接字(一个多播,两个单播)和六个线程。

数据网格集群的功能基于由集群节点提供的服务。集群节点提供的每一个服务都
有特定的功能。每一个集群节点在提供和消费集群服务两者方面可以参与数个集群服务
(作为其成员)。一些集群服务由集群中的所有节点提供,而其它服务由集群中的仅一个或
仅一些节点提供。每一个服务具有在数据网格集群内唯一识别服务的服务名称以及具有定
义服务可以做什么的服务类型。可以存在由数据网格集群中的节点提供的每种服务类型的
若干命名实例(除了根集群服务之外)。所有服务优选地在没有任何数据丢失的情况下提供
故障转移和故障恢复。

由集群节点提供的每一个服务实例通常使用一个服务线程来提供服务的特定功
能。例如,由节点提供的分布式高速缓存服务由节点的单个服务线程提供。当在JVM/节点中
解析用于分布式高速缓存的模式定义时,用模式中指定的名称来实例化服务线程。这个服
务线程管理使用模式定义创建的高速缓存中的数据。一些服务可选地支持可以被配置成向
服务线程提供附加的处理资源的工作者线程的线程池。服务线程与线程池中的工作者线程
协作以提供服务的特定功能。

在 Coherence数据网格中,集群服务(例如,136a、136b、136c、136d、
136e)跟踪集群中的成员资格和服务。每一个集群节点总是具有恰好一个这种类型的服务
正在运行。集群服务自动启动以使得集群节点能够加入集群。集群服务负责检测其它集群
节点、检测集群节点的故障(死亡)、以及注册集群中其它服务的可用性。代理服务(例如,
138c)允许来自在集群外部运行的客户端的连接(例如,使用TCP)。调用服务(例如,134d)允
许应用代码调用代理以在集群中的任何节点上、或在节点的任何组上、或跨整个集群执行
操作。虽然每一个仅在一个节点上示出,但是可以在多至分布式数据网格的所有节点的任
意数量的节点上配置调用服务和代理服务。

在 Coherence数据网格中,分布式高速缓存服务(例如,132a、132b、
132c、132d、132e)是提供分布式数据网格中的数据存储并且在读/写/存储高速缓存数据的
集群的所有节点上操作的服务,即使该节点没有启用存储。分布式高速缓存服务允许集群
节点在集群100a上分布(分区)数据,使得高速缓存中的每条数据仅由一个集群节点主要管
理(保持)。分布式高速缓存服务处置存储操作请求,诸如put、get等。分布式高速缓存服务
管理在分布式模式定义中定义的并且在集群的节点当中分区的分布式高速缓存(例如,
140a、140b、140c、140d、140e)。

分区是分布式数据网格中受管理数据的基本单元,并且存储在分布式高速缓存
(例如,140a、140b、140c、140d和140e)中。数据被逻辑地划分成跨若干集群节点分布的主分
区(例如,142a、142b、142c、142d和142e),使得集群中恰好一个节点负责高速缓存中的每条
数据。每一个高速缓存(例如,140a、140b、140c、140d和140e)可以保持数个分区。每一个分
区(例如,142a、142b、142c、142d、142e)可以保持一个数据,或者它可以保存许多数据。当需
要或期望时,可以将分区从一个节点的高速缓存迁移到另一节点的高速缓存。例如,当节点
被添加到集群时分区被迁移,使得它们分布在包括新添加的节点的可用的节点当中。在非
复制分布式数据网格中,每一个分区(主分区)只有一个活动的拷贝。但是,通常还存在用于
故障转移的每一个分区的一个或多个副本/备份拷贝(存储在不同的服务器上)。因为数据
分散在分布在集群的服务器当中的分区中,因此管理和提供对数据的访问的责任自动地在
集群上进行负载平衡。

分布式高速缓存服务可以被配置,使得每条数据由一个或多个其它集群节点备份
以支持没有任何数据丢失的故障转移。例如,如图1所示,每一个分区存储在主分区(例如,
深色阴影正方形142a、142b、142c、142d和142e)以及分区的一个或多个同步备份拷贝(例
如,浅阴影正方形144a、144b、144c、144d和144e)中。每一个分区的备份拷贝存储在与主分
区不同的单独的服务器/节点上,该单独的服务器/节点与该主分区同步。节点上的分布式
高速缓存服务的故障转移涉及将分区的备份拷贝提升为主分区。当服务器/节点发生故障
时,所有剩余的集群节点确定它们为故障节点上的主分区保持了哪些备份分区。集群节点
然后将备份分区提升为主分区,无论它们被保持在哪个集群节点上(然后新的备份分区被
创建)。

分布式高速缓存是数据对象的集合。每一个数据对象/数据可以是例如数据库表
的行的等同物。每一个数据与识别该数据的唯一键相关联。每一个分区(例如,142a、142b、
142c、142d、142e)可以保持一个数据,或者它可以保持许多数据,并且分区分布在集群的所
有节点当中。在 Coherence数据网格中,每一个键和每一个数据被存储为数据
对象,该对象由称为可移植对象格式(Portable Object Format,POF)的高效未压缩二进制
编码序列化。

为了找到特定的数据,每一个节点具有将键映射到分区的映射,例如散列映射。映
射对集群中的所有节点是已知的,并且跨集群的所有节点同步和更新。每一个分区具有将
与该分区相关联的每一个键映射到存储在该分区中的对应数据的后备映射。可以从分布式
数据网格中的任何节点处的客户端接收与特定键/数据相关联的操作。当节点接收到操作
时,如果键与接收节点上的主分区相关联,那么节点可以提供对与该键相关联的值/对象的
直接访问。如果键不与接收节点上的主分区相关联,那么节点可以将操作直接定向到保持
与该键相关联的主分区的节点(在一跳中)。因此,使用散列映射和分区映射,每一个节点可
以提供对与分布式高速缓存中的每一个键相对应的每一个数据的直接访问或一跳访问。

在一些应用中,初始地从包括数据112的数据库110填充分布式高速缓存中的数
据。数据库110中的数据112是序列化的、分区的并且分布在分布式数据网格的节点当中。分
布式数据网格100将根据来自数据库110的数据112创建的数据对象存储在服务器120a、
120b、120c、120d的存储器中的分区中,使得客户端150和/或数据网格100中的应用可以直
接从存储器访问那些数据对象。相比于可以直接使用数据库110所实现的,从分布式数据网
格100中的数据对象读取和向数据对象写入快得多,并且允许更多的同时连接。数据的内存
中复制和保证的数据一致性使得分布式数据网格适合用于管理存储器中的事务,直到它们
被持久存储到外部数据源(诸如,数据库110)用于存档和报告。如果对存储器中的数据对象
做出改变,那么在主分区和备份分区之间同步该改变,并且随后可以使用异步写(后写)将
其写回数据库110以避免瓶颈。

虽然数据跨集群节点分散,但是客户端150可以连接到任何集群节点并检索任何
数据。这被称为位置透明,其意味着开发人员不必基于高速缓存的拓扑结构进行编码。在一
些实施例中,客户端可以连接到特定服务,例如,特定节点上的代理服务。在其它实施例中,
连接池或负载平衡器可以用于将客户端定向到特定节点并且确保客户端连接分布在一些
或所有数据节点上。无论如何连接,分布式数据网格中的接收节点从客户端150接收任务,
并且每一个任务与特定数据相关联,并且因此必须由特定节点处置。无论哪个节点接收到
对于特定数据的任务,其识别其中存储该数据的分区和负责该分区的节点(例如,定向到高
速缓存服务的调用),接收节点然后例如通过进行远程高速缓存调用将任务定向到保持所
请求的分区的节点。由于每条数据仅由一个集群节点管理,因此通过网络的访问只是“单
跳”操作。这种类型的访问是极其可伸缩的,因为它可以使用点对点通信,并且因此最优地
利用交换结构网络,诸如InfiniBand。

类似地,高速缓存更新操作可以使用相同的单跳点到点方法,其中数据被发送到
具有主分区的节点和具有该分区的备份拷贝的节点两者。直到所有备份都已确认接收时,
对高速缓存的修改才被认为是完整的,这保证维护了数据的一致性,并且保证如果集群节
点在写入操作期间意外地发生故障那么不会丢失任何数据。分布式高速缓存服务还允许某
些集群节点被配置成存储数据,并且其它集群节点被配置成不存储数据。

在一些实施例中,分布式数据网格可选地被配置成具有弹性数据特征,该弹性数
据特征使用用固态设备(例如SSD 128a)(最典型的是闪存驱动器)为高速缓存提供溢出能
力。使用弹性数据特征,高速缓存被指定使用基于RAM或DISK日志的后备映射。日志提供用
于存储对象状态改变的机制。参考特定键记录每一个数据/值,并且内存中的树用于存储定
向到数据的指针(微小数据/值可以直接存储在树中)。这允许一些值(数据)存储在固态设
备(例如SSD 128a)中,同时具有索引/存储器树存储在存储器(例如RAM 124a)中。相比于完
全基于RAM的解决方案,弹性数据特征允许分布式数据网格在性能损失很小的情况下支持
每节点更大量的数据。

分布式数据网格(诸如,上述 Coherence数据网格)可以通过解决数据
操作延迟问题和通过实时高速缓存和处理数据来提高系统性能。应用在数据网格中高速缓
存数据,从而避免对后端数据源的昂贵请求。共享数据高速缓存提供高速缓存数据的单一、
一致的视图。从高速缓存读取比查询后端数据源更快,并且随着应用层自然地伸缩。内存中
执行减轻了瓶颈并且减少了数据竞争,从而提高应用响应性。并行查询和计算被支持以提
高基于数据的计算的性能。分布式数据网格是容错的,从而提供数据可靠性、准确性、一致
性、高可用性和灾难恢复。分布式数据网格使得应用能够线性地和动态地伸缩,用于实现可
预测的成本和改进的资源利用。对于许多应用,分布式数据网格提供了有价值的共享数据
源解决方案。

在实施例中,分布式数据网格100实现例如如下描述并且在图2、3A、3B、4A和4B中
图示的一个或多个可伸缩线程池系统和方法。在本发明的实施例中,分布式数据网格100实
现如下描述并且在图5和图6中图示的用于可伸缩线程池的动态大小调整的一个或多个系
统和方法。在特定实施例中,可以相对于在分布式数据网格100的节点上操作的一个或多个
服务线程(包括例如,高速缓存服务线程和代理服务线程)来实现可伸缩线程池系统和方法
和/或用于可伸缩线程池的动态大小调整的系统和方法。

线程池

本文描述的是可以支持分布式数据网格中的动态线程池大小确定的系统和方法。
如在以上提供的分布式数据网格的描述中所描述的,由分布式数据网格的节点提供的服务
通常使用一个服务线程来提供服务的特定功能。一些服务可选地支持可以被配置成向服务
线程提供附加的处理资源的工作者线程的线程池。本公开描述了一种可以被配置成向服务
线程提供附加的处理资源的工作者线程的可伸缩线程池以及一种用于可伸缩线程池的动
态大小确定/大小调整的系统和方法。

如上所述,分布式数据网格被配置成处理从客户端接收到的非常大量的短任务。
例如,分布式高速缓存服务的服务线程被配置成处理从应用或网络的其它节点接收到的非
常大量的存储操作请求,诸如put、get等。每一个存储操作的处理是短暂的,但是存储操作
的数量非常大。为了高效地处理非常大量的短暂操作,服务线程(诸如用于高速缓存服务的
服务线程)可以利用工作者线程的线程池。

如果任务的数量非常大(诸如在分布式数据网格中),那么为每一个任务创建线程
是不切实际的。此外,如果任务的大小小,那么与创建和销毁线程相关的开销相对于执行的
实际工作更为显著。在线程池中,工作者线程被回收而不是在接收到任务时按需创建。与为
每一个任务创建新工作者线程相比,使用工作者线程的线程池是有利的,因为线程池允许
为若干操作重用线程,因此与线程创建和销毁相关联的开销分散在许多操作上。减少用于
线程创建和销毁的开销可以导致更好的性能和更好的系统稳定性。作为附加的优点,任务
的处理不被创建处理任务的新线程的需求延迟。通常,存在比线程更多的任务。一旦线程完
成其任务,该线程将从队列中请求下一个任务,直到所有任务已完成。线程然后可以终止或
睡眠,直到新的任务可用。

一般而言,线程池的最佳大小取决于进程可用的处理器核的数量以及工作的性质
和量。创建和销毁线程及其相关联的资源在太阳城集团方面是昂贵的过程。但是,让过多数量的线
程保持存活也将浪费存储器,并且可运行线程之间的上下文切换也损害性能。在线程池中
有太多线程会浪费系统资源,因为许多线程将是空闲的。在线程池中有太少线程会引起延
迟,因为任务需要一直等待到有线程可用。期望选择这样一种线程池大小,其最小化由于空
闲线程而引起的资源浪费和由太少线程引起的延迟。选择最佳线程池大小因此取决于系统
性能和工作负载。因此,线程池中使用的线程的数量是可调节以提供最佳性能的参数。

线程池中的线程的数量可以基于工作负载动态地改变。用于确定何时创建或销毁
线程的方法将对总体性能产生影响。如果创建了太多的线程,那么浪费资源,并且创建未使
用的线程浪费太阳城集团。如果销毁太多的线程,那么在需要时创建新的线程将浪费太阳城集团/资源。
创建线程太慢可能会导致长的延迟。销毁空闲线程太慢会使资源的其它进程饥饿。因此,线
程池中的线程的数量和用于确定何时以及多快地向线程池添加线程的机制可以显著地影
响线程池、使用线程池的服务线程、以及共享计算机系统资源的其它线程的性能。

在分布式数据网格中,工作负载会在服务线程之间以及随着太阳城集团相对于每一个服
务线程显著地改变。增加复杂性的是以下事实:在分布式数据网格中,用于不同的命名的高
速缓存的数个高速缓存服务可以同时在相同节点中操作。此外,具有若干个不同服务线程
的若干个节点可以在相同服务器上操作,因此共享处理器资源。这些各种服务线程的利用
率也可以随着太阳城集团而改变。因此,在分布式数据网格中,线程池的最佳大小可以明显地变
化,不仅基于呈现给与线程池相关联的服务线程的工作,而且还基于什么工作正在并发地
呈现给相同服务器上的其它服务线程。

当实现线程池时,必须考虑线程安全性。与相同资源相关的任务必须按顺序执行。
如果若干个线程拾取与相同资源相关的任务,那么将只能够在某个太阳城集团进行这些线程中的
一个。这是不利的,因为它否定了多线程的目的–即,使若干线程并行操作。因此,需要技术
来确保任务的先进先出FIFO排序并且防止线程阻塞/串行化–一个常见的解决方案是单个
生产者若干消费者队列–但是,使用这种队列导致如下面描述的其自己的竞争源。使用常规
的队列数据结构,若干消费者工作者线程为了访问队列彼此竞争。只有一个工作者线程可
以在某个太阳城集团从队列中读取。增加工作者线程的数量会增加对队列的竞争。因此,单个生产
者若干消费者队列不能容易地扩展到大量的工作者线程。因此,使用简单队列与服务线程
通信的线程池是不可伸缩的。因此,期望提供一种用于向工作者线程提供工作的数据结构,
该数据结构减少和/或消除竞争,同时在维护线程安全性的同时允许线程池的伸缩。

鉴于常规线程池和线程池大小调整方法的问题,本发明描述了可以被配置成向服
务线程提供附加的处理资源的工作者线程的可伸缩线程池,以及用于可伸缩线程池的动态
大小调整的系统和方法。具体地,本公开描述了单个生产者若干消费者动态可伸缩线程池,
该线程池在多核系统上展现出高性能并且适合用于在需要时向分布式数据网格的服务线
程提供附加的工作者线程,从而提高分布式数据网格的性能。此外,本公开描述了用于向工
作者线程提供工作的数据结构,其在允许线程池的伸缩的同时减少和/或消除竞争。此外,
本发明公开了用于改变线程池中的线程的数量、动态地选择优化性能的线程池大小并且允
许线程池大小响应于吞吐量改变而快速改变的机制。

可伸缩线程池系统

图2示出了适合在分布式数据网格中使用的可伸缩线程池系统的概述。如图2所
示,分布式数据网格200中的服务线程201可以接收一个或多个消息,例如,消息211-213。此
外,服务线程201可以或者处理消息211-213,或者将消息211-213提供给可伸缩线程池202,
该可伸缩线程池202包含一个或多个工作者线程221-223。系统可以使用关联堆(pile)210
来保持一个或多个元素(例如,消息211-213)。此外,系统允许若干线程(例如,工作者线程
221-223)并行地从关联堆210轮询元素。另外,系统可以防止保持在关联堆210中并且具有
与先前轮询的元素的关联的元素被轮询,直到先前轮询的相关联元素已经被释放。

关联堆(诸如关联堆210)是以具有类队列(queue-like)格式的松散有序的方式保
持元素的数据结构。关联堆遵守一些元素可以通过相关联的键彼此相关联的可能性。与相
同键相关联的元素应当维护先进先出(FIFO)排序,但是相对于与不同键相关联的元素可以
被重新排序。键可以是例如如上所述识别分布式数据网格中的数据的唯一键。在某个太阳城集团
只有一个线程可以在特定数据上操作,并且对特定数据执行的操作应当按照它们被接收到
的顺序执行。相应地,关联堆可以例如维护在与相同唯一键相关联的相同数据上执行的操
作的先进先出(FIFO)排序。

元素可以被添加到关联堆和从关联堆中去除。元素通过调用线程被添加到关联
堆。元素通过工作者线程从关联堆中去除。去除元素以两个步骤执行:首先,可用元素由“轮
询”关联堆的工作者线程去除;第二,当工作者线程完成使用该元素时,该元素从关联堆中
被“释放”。关联堆假设被轮询但尚未释放的元素正在若干线程上被并行处理,并且因此防
止对与和被轮询但尚未释放的元素相同的键相关联的任何元素的轮询。

图3A和3B示出可伸缩线程池的示例。如图3A和3B所示,服务线程300与可伸缩线程
池300相关联。线程池300具有固定数量(CPU计数)的工作时隙310。示出了四个工作时隙
310a、310b、310c和310d。每一个工作时隙具有可以或者打开或者关闭的线程门。当线程门
打开时,线程可以进入和离开该门。当线程已进入门时,门不能被关闭。当线程门被关闭时,
线程不能进入该门。

当工作通过服务线程被添加到线程池时,工作跨工作时隙分布。服务线程带有一
些随机性地将工作添加到具有最小待办事项(backlog)(即,具有最小关联堆的时隙)的时
隙310a、310b、310c或310d。但是,与相同键相关联的所有工作被添加到相同时隙以便保持
相关联的工作的顺序。当工作被添加到线程池的工作时隙时,调用线程如下所述进入工作
时隙的线程门并且将工作添加到关联堆。

线程池的固定数量(CPU计数)的工作时隙通过一个或多个关联堆链接到一个或多
个工作者线程。线程池具有动态数量的关联堆320。每一个工作时隙与恰好一个关联堆相关
联。但是,若干工作时隙可以共享相同的关联堆。当工作被添加到线程池的工作时隙时,调
用线程进入工作时隙的线程门并将工作添加到关联堆中的一个。通过特定工作时隙添加的
所有工作被定向到与该工作时隙相关联的特定关联堆。与特定键相关的所有工作通过相同
的工作时隙被添加,并且因此被定向到相同的关联堆。

线程池还具有动态数量的工作者线程330。每一个工作者线程与恰好一个关联堆
相关联。工作者线程从关联堆轮询工作。但是,每一个工作者线程仅从与工作者线程相关联
的一个关联堆轮询工作。若干个工作者线程可以与相同的关联堆相关联并从它轮询工作。
如图3A和3B所示,当工作者线程根据太阳城集团图4A、4B、5和6描述的方法被添加或去除时,可伸
缩线程池中的工作者线程的数量和关联堆的数目可以随太阳城集团改变。

图3A示出其中工作者线程330的数量大于工作时隙312的数量的配置。当存在比工
作时隙更多的工作者线程时,关联堆的数量等于工作时隙的数量。在图3A的配置中,存在七
个活动的工作者线程330a、330b、330c、330d、330e、330f和330g。因此,如图3A所示,因为存
在四个工作时隙310a、310b、310c和310d,因此也存在四个关联堆320a、320b、320c和320d。
如图3A所示,每一个工作时隙具有进入该时隙的调用线程将工作放入在其中的专用关联
堆。与特定键相关的所有工作通过相同的工作时隙添加,并且因此被定向到相同的专用关
联堆。存在比堆更多的工作者线程,因此工作者线程330a、330b、330c、330d、330e、330f和
330g中的至少一些需要共享一些关联堆。也就是说,多于一个工作者线程可以从每一个关
联堆中去除工作。例如,工作者线程330a和330b都从关联堆320a轮询工作。

图3B示出其中工作者线程330的数量小于工作时隙312的数量的配置。在其中存在
比工作时隙更少的工作者线程的情况下,关联堆的数量等于工作者线程的数量。因此,图3B
示出了三个工作者线程330a、330b、330c和三个关联堆320a、320b和320c。存在比关联堆320
更多的工作时隙310,因此一些工作时隙必须共享堆。例如,进入工作时隙310c和310d的调
用线程都可以将工作放置在关联堆320c中。但是,与特定键相关的所有工作通过相同的工
作时隙添加,并且因此仍然被定向到相同(共享)的关联堆。但是,如图3B所示,每一个工作
者线程具有它从中去除工作的专用关联堆。但是,如果工作者线程没有任何事情可做,那么
它在去睡眠之前尝试从另一个线程的堆中提取工作。

添加和去除线程

当向图3A和3B的可伸缩线程池添加工作者线程和/或去除工作者线程时,工作者
线程、关联堆和工作者线程之间的关系被加以考虑。维护工作者线程、时隙和关联堆的平衡
分布是重要的。此外,需要确保线程池的属性被维护,使得在其中存在比工作时隙更多的工
作者线程的情况下,关联堆的数量等于工作时隙的数量,并且在其中存在比工作时隙少的
工作者线程的情况下,关联堆的数量等于工作者线程的数量。此外,在改变工作者线程计数
和/或关联堆计数期间,必须保持线程安全性和与相同键相关的元素的FIFO顺序。图4A和4B
图示用于根据这些目标向图3A和3B的可伸缩线程池添加和去除工作者线程的方法。

图4A示出将工作者线程添加到图3A和3B的可伸缩线程池的方法。在步骤400处,开
始将工作者线程添加到可伸缩线程池的过程。在步骤402处,将当前线程计数与工作时隙计
数进行比较。如果做出例如在图3A中所示的工作者线程计数>=工作时隙计数的确定404,
那么进行到步骤406。如果工作者线程计数>=工作时隙计数,那么一个或多个关联堆必须
与多于一个工作者线程相关联一定为真。在步骤406处,确定哪个关联堆被最少数量的工作
者线程共享并选择该堆(例如图3A中的关联堆320d)。在步骤408处,将在步骤406中选择的
堆与新的工作者线程相关联。然后进行到步骤430,结束用于添加工作者线程的过程。这个
过程确保工作者线程被添加到具有最少数量的工作者线程的关联堆。

如果做出例如图3B中所示的工作者线程计数<工作时隙计数的确定414,那么进行
到步骤416。如图3B图示,如果工作者线程计数<工作时隙计数,那么必须有至少两个工作时
隙共享相同关联堆。我们需要将这些时隙中的一个(例如工作时隙310c或工作时隙310d)与
新的关联堆相关联,并且还为新的关联堆创建新的工作者线程。同时,旧的关联堆320c仍然
由负责通过工作时隙310c和310d两者到来的所有任务的工作者线程330c进行处理。如果我
们为工作时隙310d创建新的关联堆,那么我们需要确保工作时隙310d放在共享关联堆320c
中的所有任务在与工作时隙310d相关联的新关联堆被激活之前完成,以便维护任务的FIFO
排序。

再次参考图4B,在步骤416处,选择共享关联堆的时隙(例如,图3B的工作时隙
310d)。在步骤418处,创建新的关联堆并将其与在步骤416处选择的工作时隙相关联。但是,
对应的守护进程(daemon)不立即开始。相反,在步骤420处,合成的StartWorker作业被添加
到旧的共享关联堆(例如,图3B的关联堆320c)。当StartWorker作业在旧的共享关联堆中被
处理时,先进先出排序保证了先前与工作时隙310d时隙相关联的旧共享关联堆中的所有先
前发布的作业都被处理。因此,当合成的StartWorker作业被处理时,在步骤422处,新的工
作者线程被启动并且与和在步骤416中选择的工作时隙相关联的新关联堆相关联。然后,进
行到步骤430,结束用于添加工作者线程的过程。

图4B示出从图3A和3B的可伸缩线程池中去除工作者线程的方法。在步骤450处,开
始从可伸缩线程池中去除工作者线程的过程。在步骤452处,将当前线程计数与工作时隙计
数进行比较。如果做出例如如图3A所示的工作者线程计数>工作时隙计数的确定454,那么
进行到步骤456。在步骤456处,选择工作时隙中的由最大数量的工作者线程服务的一个工
作时隙(例如,从图3A中选择工作时隙310a、310b或310c中的一个)。在步骤458处,经由在步
骤456中选择的工作时隙将合成的StopWorker作业添加到线程池。然后,进行到步骤480,结
束用于去除工作者线程的过程。当StopWorker作业被轮询时,它将停止处理它的任何线程。
因此减少服务该时隙的工作者线程的数量。例如,放置在工作空间310a中的StopWorker作
业将被放置在关联堆320a中,并且然后由工作者线程330a和330b之一轮询,从而停止从关
联堆320a轮询StopWorker作业的任何线程。

但是,如果做出例如如图3B所示的工作者线程计数<=工作时隙计数的确定464,
那么进行到步骤466。如果工作者线程计数<=工作时隙计数,那么每一个堆由一个并且仅
一个工作者线程处理。因此,如果工作者线程要被停止,那么关联堆也将必须被去除,并且
与被去除的关联堆相关联的(一个或多个)时隙被重定向。在步骤466处,选择由最小数量的
工作时隙共享的关联堆(P1)(例如,图3B中的关联堆320a)。在步骤468处,将StopWorker作
业添加到在步骤466中选择的关联堆(P1)。当“StopWorker”执行时,它将:在步骤470处关闭
与P1对应的所有工作时隙(例如图3B的工作时隙310a);在步骤472处找到与下一个最小数
量的时隙共享的堆(P2)(例如图3B中的关联堆320b);以及在步骤474处,将P1的内容(例如
图3B中的关联堆320a)合并到P2(例如图3B中的关联堆320b)中并且丢弃P1(例如图3B中的
关联堆320a)并且将所有关闭的时隙(例如图3B的时隙310a)重定向到P2(例如,图3B中的关
联堆320b)并且重新打开关闭的(一个或多个)时隙。然后,进行到步骤480,结束用于去除工
作者线程的过程。

动态线程池大小调整

在实施例中,本公开描述了支持适合在多线程处理环境(诸如,分布式数据网格)
中使用的动态线程池大小确定的系统和方法。可以例如在与分布式数据网格中的服务线程
相关联的可伸缩线程池中执行动态线程池大小调整。动态线程池大小调整利用线程池吞吐
量和工作者线程利用率的测量结合对先前线程池大小调整动作的功效的分析,以确定是否
在当前大小调整动作中向线程池添加工作者线程或从线程池中去除工作者线程。此外,动
态线程池大小调整系统和方法可以取决于系统的需要加速或减慢大小调整的分析,并因此
加快或减慢工作者线程添加和去除的速率。结合了优化以防止停滞在局部最大吞吐量上。
动态线程池大小调整系统和方法由此响应于工作负载和处理器可用性的改变而提供对线
程池大小的快速和响应式的调整。

根据本发明的实施例,分布式数据网格可以动态地对可伸缩线程池大小确定/大
小调整以最大化池的吞吐量和最小化系统资源的利用率。通过如下所述的大小调整的分析
的迭代执行来实现线程池的大小确定。以上的描述提供了用于向图3A和3B的可伸缩线程池
添加线程和从中去除线程的方法。以下的描述提供了用于响应于工作负载和处理器可用性
的改变来确定何时向可伸缩线程池添加和从中去除线程的方法。下面描述的大小确定和大
小调整的机制可以应用于上述可伸缩线程池或应用于其它可变大小和/或可伸缩线程池。

在如上所述的分布式数据网格中,工作负载会在服务线程之间以及随着太阳城集团相对
于每一个服务线程显著地改变。以下的事实增加了复杂性:在分布式数据网格中,用于不同
命名高速缓存的数个分布式高速缓存服务可以同时在相同节点中操作。此外,具有若干个
不同服务线程的若干个节点可以在相同服务器上操作,因此共享处理器资源。这些各种服
务线程的利用率也会随着太阳城集团而改变。因此,在分布式数据网格中,线程池的最佳大小可以
明显地变化,不仅基于呈现给与线程池相关联的服务线程的工作,而且还基于什么工作正
在并发地呈现给相同服务器上的其它服务线程。因此,期望以快速响应工作负载中的波动
并且可以在少量的迭代内为特定工作负载和环境建立最佳线程池大小的的方式来实现大
小调整的动态线程池大小调整机制。

图5图示根据本发明的实施例的用于支持分布式数据网格中的动态线程池大小确
定的系统和方法。如图5所示,线程池500(诸如,可伸缩线程池)可以动态地调整其线程计
数。在步骤501处,系统可以测量在一段太阳城集团内的线程池500的总吞吐量。然后,在步骤502
处,系统可以确定线程池500的总吞吐量自上一个时段的改变,并且如果满足一个或多个标
准,那么将线程池的大小调整随机的量。此外,在步骤503处,系统可以基于在上一个时段中
线程池500的大小调整的有效程度来确定下一个时段的长度。

这种动态线程池大小调整方法与图3A和3B的可伸缩线程池结合使用,以动态地调
整线程计数,以便:增加可伸缩线程池的总吞吐量和/或最小化可伸缩线程池的资源利用
率。动态大小调整经由上述插入到可伸缩线程池中的定期合成的ResizePool作业来完成。
一般而言,合成的ResizePool作业使用大小调整方法,该方法分析对添加或去除线程的性
能响应,并且使用分析的结果来确定是否添加或去除更多的线程,并且还确定在重新分析
性能之前要等待多长太阳城集团。此外,一旦已经实现潜在的最大吞吐量,线程池中的线程的数量
就周期性地增加或减少随机量,以试图避免停滞在局部最大吞吐量上。

定期合成的ResizePool作业的调度是基于大小调整作业之间的可变时段。插入一
个ResizePool作业和下一个ResizePool作业之间的太阳城集团段是上一次大小调整的有效程度
的函数。当执行ResizePool作业改变吞吐量时,插入该ResizePool作业和下一个
ResizePool作业之间的太阳城集团段减少。当执行ResizePool作业不显著改变吞吐量时,插入该
ResizePool作业和下一个ResizePool作业之间的太阳城集团段会增加。该方法本质上是迭代的性
能分析实验,并且可以单独基于吞吐量和线程利用率的测量来动态调整线程池大小以考虑
工作负载、吞吐量和处理器可用性的改变。

图6示出在合成的ResizePool作业中执行的步骤的图示。在步骤600处,合成的
ResizePool作业在计算周期的期满处开始,并且被插入到上述的可伸缩线程池中用于执
行。该作业然后如图所示由工作者线程从关联堆中轮询并处理。在步骤602处,该作业首先
测量池的总吞吐量(T.now)以及自从它上次运行(T.last)以来的总吞吐量的改变
(T.delta)。T.delta可以被计算为T.now和T.last之间的差。T.now存储在存储器中,用于在
下一次作业运行时用作T.last。在步骤604处,该作业确定是否是“晃动”池的太阳城集团。该确定
可以使用迭代计数器或定时器或等效物来做出。如果是“晃动”池的太阳城集团,那么作业执行步
骤606并且将池大小调整随机量,并且然后在步骤622处重新调度自身。随机量可以被计算
为特定范围内的线程计数的随机百分比,或线程的预配置数量的随机百分比。当
ResizePool作业被再次插入到上述可伸缩线程池中用于执行时,ResizePool作业在计算时
段期满时在步骤600处再次开始。在替代的实施例中,ResizePool作业由专用线程执行和/
或由不在线程池中的线程执行。

再次参考图6,如果在步骤604不是“晃动”池的太阳城集团,那么作业移动到步骤608。在
步骤608处,作业将“显著的”吞吐量改变应该是多少(T.jitter)计算为T.last的简单函数
(例如10%或5%)。作业然后将T.delta与T.jitter进行比较,以查看是否已经发生吞吐量
的显著改变。换句话说,在步骤608处,作业确定上次运行作业时的吞吐量与当前吞吐量之
间的差是否表示吞吐量相对于过去的吞吐量的显著改变。(可替代地,吞吐量的改变的显著
性可以通过与当前吞吐量而不是先前吞吐量进行比较来做出)。

如果如通过在步骤608处比较T.delta和T.jitter所确定的那样,自从作业上次运
行以来吞吐量没有显著改变,那么作业移动到步骤610。在步骤610处,如果线程池被过度利
用,那么作业将一个或多个线程添加到线程池,或者如果线程池未被充分利用,那么从线程
池中去除一个或多个线程。如果线程池既未被过度利用也未被充分利用,那么作业不对线
程池做出改变。如果在Resize.Pool作业运行时活动工作者线程的数量高于总工作者计数
的某个固定百分比(例如66%或80%),那么线程池被认为过度利用。如果活动工作者线程
的数量低于总工作者计数的某个固定百分比(例如33%或20%),那么线程池被认为未充分
利用。注意的是,即使线程池被“用光”,即线程池不能执行任何额外的工作,指示的线程利
用率也将小于100%,因为在任何时刻工作者线程的一部分将是“在作业之间”。在添加线
程、去除线程或不对线程的数量做出改变之后,作业移动到步骤620。

如果在步骤608处检测到自从作业上次运行以来吞吐量存在显著的改变,那么由
作业采取的下一个动作取决于上次作业执行时采取了什么动作(先前的大小调整动作)。因
此,在步骤612处确定先前的大小调整动作(即,添加线程、去除线程或不采取动作)。先前的
大小调整动作通常是与Resize.Pool作业连同其它值(诸如,T.now/T.last和该时段的当前
持续太阳城集团)相关联的状态中的记录器。这些值可以存储在例如存储器中,使得Resize.Pool
作业在每次它运行时能够访问这些值。

如果在先前动作中添加了线程,那么作业移动到步骤614。在步骤614处,如果
T.delta指示吞吐量的增加,那么作业将一个或多个附加的线程添加到线程池,并且减少在
下一次分析之前的太阳城集团段。在步骤614,如果T.Delta指示吞吐量的减少,那么作业从线程池
中去除一个或多个线程,并且增加下一次分析之前的太阳城集团段。响应于添加线程的吞吐量的
减少可以指示已经添加了太多线程,例如,响应于增加的工作负载,“过调(overshooting)”
线程的最佳数量。因此,一个或多个线程被去除并且分析被减慢以抑制振荡。在添加线程或
去除线程之后,作业移动到步骤620。

如果在先前动作中去除了线程,那么作业移动到步骤616。在步骤616处,如果
T.delta指示吞吐量的增加,那么作业从线程池中去除一个或多个另外的线程,并且减少下
一次分析之前的太阳城集团段。在步骤616处,如果T.delta指示吞吐量的减少,那么作业将一个或
多个线程加回线程池并增加下一次分析之前的太阳城集团段。响应于去除线程的吞吐量的减少可
以指示已经去除了太多线程,例如,响应减少的工作负载,“欠调(undershooting)”线程的
最佳数量。因此,一个或多个线程被添加回并且分析被减慢以抑制振荡。在添加线程或去除
线程之后,作业移动到步骤620。

当ResizePool作业确定应当执行大小调整动作以向可伸缩线程池添加工作者线
程或从中去除工作者线程时,ResizePool作业如以上太阳城集团图4A和4B所述的通过将一个或多
个StartWorker作业或StopWorker作业插入到线程池中来引起工作者线程的添加或去除。
应当选择在上述步骤中添加或去除的线程的数量(以及因此应当被插入到线程池中的
StartWorker作业或StopWorker作业的数量),以便对其中作业正在运行的线程池有效。因
此,对于具有较大线程计数的线程池,在每一个操作中可以添加或去除较大数量的线程。对
于具有较小线程计数的线程池,可以在每一个操作中添加或去除较少数量的线程。在一种
实施例中,可以基于当前线程计数的函数(例如当前线程计数的5%、10%或20%)来确定在
步骤中添加或去除的线程的数量。在以上给出的过调和欠调的示例中,可以添加或去除较
少数量的线程以校正过调,例如,在先前操作中添加或去除的线程数量的一半。可替代地,
在线程中添加或去除的线程的数量可以是固定的(例如每次一个线程)。

应当注意的是,向线程池中添加或从中去除线程的速率将取决于在Resize.Pool
作业的每次迭代中添加或去除的线程的数量以及Resize.Pool作业被执行的频率。因此,如
果周期减少,那么Resize.Pool作业的频率增加,并且因此在单位太阳城集团内执行更多的迭代。
因此,在单位太阳城集团内也可以执行更多的工作者线程的添加和去除。这允许动态大小调整的
系统和方法快速响应吞吐量、工作负载和其它因素(诸如,处理器可用性)的改变。

如果在先前动作中没有做出线程数量的改变,那么作业移动到步骤618。在步骤
618处,如果T.delta指示吞吐量的增加,并且线程池被过度利用,那么作业将一个或多个线
程添加到线程池。在步骤618处,如果T.delta指示吞吐量的减少并且线程池未被充分利用,
那么作业从线程池中去除一个或多个线程。如果以上两个语句都不为真,那么作业不对线
程池做出改变。在添加线程、去除线程或不对线程的数量做出改变之后,作业移动到步骤
620。

在步骤620处,如果在任何先前步骤中做出添加或去除线程的决定,那么合成的
“ResizePool”作业调度其自身在其新时段的一半处再次运行,以便在系统可能有可能停滞
之后收集新的吞吐量统计数据。在收集新的吞吐量统计数据之后(或直接地,如果对线程的
数量没有做出改变),合成的“ResizePool”作业调度其自身在其新时段中再次运行,这在该
时段期满之后在步骤600处重新开始作业。此外,所采取的大小调整动作应当存储在存储器
中,使得ResizePool作业的下一次迭代将能够访问指示所采取的先前大小调整动作的信
息。ResizePool作业将反复运行并响应于吞吐量和线程利用率测量来迭代地调整线程池中
的工作者线程的数量,并且如上所述响应于先前大小调整动作的功效通过增加或减少在下
一个作业之前的延迟时段来加速或减慢分析。

在本发明的实施例中,分布式数据网格100实现如下所述和在图2、3A、3B、4A和4B
中所图示的一个或多个可伸缩线程池系统和方法。在本发明的实施例中,分布式数据网格
100实现如下所述和在图5和图6中图示的用于可伸缩线程池的动态大小调整的一个或多个
系统和方法。在特定实施例中,可以相对于在分布式数据网格100的节点上操作的一个或多
个服务线程(包括例如,高速缓存服务线程和代理服务线程)来实现可伸缩线程池系统和方
法和/或用于可伸缩线程池的动态大小调整的系统和方法。

图7图示根据本发明的实施例的用于分布式数据网格中的可伸缩线程池的动态大
小调整的系统和可伸缩线程池的实现。例如,如图7所示,由分布式数据网格100中的节点
130a提供的服务可以由服务线程710提供。该服务可以是例如高速缓存服务132a。为了提供
额外的处理资源,服务线程710可以与包括可伸缩数量的工作者线程(示出了三个)702a、
702b、702c的可伸缩线程池700协作来执行工作。在实施例中,可伸缩线程池700实现如上所
述和在图2、3A、3B、4A和4B中图示的可伸缩线程池系统和方法。可伸缩线程池包括用于基于
吞吐量和线程利用率来调整可伸缩线程池700中的线程的数量的大小调整系统720。在实施
例中,大小调整系统720实现如上所述和在图5和图6中图示的用于可伸缩线程池的动态大
小调整的系统和方法。虽然为了说明性目的示出了高速缓存服务132a的服务线程710,但是
也可以相对于其中线程与工作者线程的线程池协作操作的分布式数据网格100中的各种各
样的其它线程来实现可伸缩线程池700和大小调整系统720。

通过提供可伸缩线程池以及用于响应于线程利用率和吞吐量的可伸缩线程池的
动态大小调整的系统和方法,本公开增强了线程(诸如,分布式数据网格中的服务线程)的
操作,其利用可伸缩线程池向服务线程提供附加的资源,从而提高分布式数据网格的性能
以及分布式数据网格响应改变的需求的能力。虽然相对于分布式数据网格进行了描述,但
是上述这种可伸缩线程池和动态大小调整系统和方法也适用于其中线程使用线程池来提
供附加的资源并需要伸缩以处理可变需求的各种各样的情况。例如,上述可伸缩线程池和
动态大小调整的系统和方法可适用于各种各样的多线程处理环境和应用。动态大小调整的
系统和方法也可以应用到具有与图2、3A、3B、4A和4B图示的不同配置的可变大小/可伸缩线
程池。

一种用于支持多线程处理环境(诸如,分布式数据网格)中的可伸缩线程池的系统
和方法。工作分布系统利用关联堆的集合来保持在服务线程和若干工作者线程之间传输的
元素。与关联堆相关联的工作者线程并行地轮询元素。轮询的元素直到从工作者线程返回
才被释放。通过确保相关元素被保持在相同关联堆中并且防止相关元素的轮询直到任何先
前被轮询以及相关的元素被释放为止,相对于相关元素维护了操作的先进先出排序。通过
在确保相对于相关元素的操作的恰当排序的同时跨若干关联堆分区元素,可伸缩线程池使
得能够使用与常规单生产者若干消费者队列相比具有减少的竞争的大线程池。

实施例的方法提供了一种可伸缩线程池,以执行从多线程处理环境中的调用线程
接收到的有序多个任务,该方法包括:提供被配置成保持任务的一个或多个关联堆;提供两
个或更多个工作时隙,每一个工作时隙定向到恰好一个关联堆,使得由所述调用线程提供
给所述工作时隙的有序多个任务中的每一个任务由所述调用线程经由所述工作时隙提供
给所述工作时隙所定向到的所述恰好一个关联堆;提供与所述一个或多个关联堆中的每一
个相关联的一个或多个工作者线程,每一个工作者线程被配置成从相关联的关联池轮询任
务、执行所述任务、以及在完成时释放所述任务;配置每一个关联堆,使得由工作者线程从
关联堆轮询的待决任务被保持在所述关联堆中,直到由所述工作者线程在任务完成时释
放;以及配置每一个关联堆以防止轮询待决任务以及与所述待决任务相关的所有任务,使
得每一个关联堆维护相关任务的先进先出排序。

实施例的方法提供一个或多个工作者线程比两个或更多个工作时隙更多,并且其
中提供被配置成保持任务的一个或多个关联堆包括为所述两个或更多个工作时隙中的每
一个提供专用的恰好一个关联堆。

实施例的方法提供两个或更多个工作时隙比一个或多个工作者线程更多,并且其
中提供被配置成保持任务的一个或多个关联堆包括为所述一个或多个工作者线程中的每
一个提供恰好一个关联堆。

实施例的方法提供配置所述调用线程,使得经由所述两个或更多个工作时隙的相
同工作时隙提供所有相关任务。

实施例的方法提供所述有序多个任务中的每一个任务与键相关联,并且其中配置
每一个关联堆以防止轮询待决任务以及与所述待决任务相关的所有任务,使得每一个关联
堆维护相关任务的先进先出排序包括配置每一个关联堆以防止轮询待决任务以及具有与
所述待决任务相同键的所有任务,使得每一个关联堆维护与相同键相关联的任务的先进先
出排序。

实施例的方法提供配置所述调用线程,使得经由所述两个或更多个工作时隙的相
同工作时隙提供具有相同键的所有任务。

实施例的方法提供一个或多个工作者线程比两个或更多个工作时隙更多,并且其
中该方法还包括通过将Start.Worker作业放置在与最少工作者线程相关联的任何关联堆
中来添加工作者线程,从而当所述Start.Worker作业被执行时,将创建与所述关联堆相关
联的新工作者线程。

实施例的方法提供一个或多个工作者线程比两个或更多个工作时隙更多,并且其
中该方法还包括通过将Stop.Worker作业放置在与最多工作者线程相关联的任何关联堆中
来去除工作者线程,从而当所述Stop.Worker作业被执行时,将停止与所述关联堆相关联的
工作者线程。

实施例的方法提供工作时隙比一个或多个工作者线程更多,并且其中该方法还包
括通过将Start.Worker作业放置在与最大数量的工作时隙相关联的任何关联堆中来添加
工作者线程,从而当所述Start.Worker作业被执行时,将创建与所述工作时隙相关联的新
关联堆,并且将创建与所述关联堆相关联的新工作者线程。

实施例的方法提供工作时隙比一个或多个工作者线程更多,并且其中该方法还包
括通过将Stop.Worker作业放置在与最小数量的工作时隙相关联的任何关联堆中来去除工
作线程,从而当所述Stop.Worker作业被执行时,将停止与所述关联堆相关联的工作者线
程,并且所述关联堆将被合并到另一个关联堆中。

实施例的系统提供一种可伸缩线程池,以执行从多线程处理环境中的调用线程接
收到的有序多个任务,该系统包括:具有存储器和处理器的计算机系统,其中处理器具有多
个核并且能够进行多线程操作;被配置成保持任务的一个或多个关联堆;两个或更多个工
作时隙,每一个工作时隙定向到恰好一个关联堆,使得由所述调用线程提供给所述工作时
隙的有序多个任务中的每一个任务由所述调用线程通过所述工作时隙提供给所述工作时
隙所定向到的所述恰好一个关联堆;与所述一个或多个关联堆中的每一个相关联的一个或
多个工作者线程,每一个工作者线程被配置成从相关联的关联池轮询任务、执行所述任务、
以及在完成时释放所述任务;其中每一个关联堆被配置成使得由工作者线程从关联堆轮询
的待决任务被保持在所述关联堆中,直到由所述工作者线程在任务完成时释放;以及其中
每一个关联堆被配置成防止轮询待决任务以及与所述待决任务相关的所有任务,使得每一
个关联堆维护相关任务的先进先出排序。

实施例的系统提供一个或多个工作者线程比两个或更多个工作时隙更多,并且其
中该系统包括用于所述两个或更多个工作时隙中的每一个的专用的恰好一个关联堆。

实施例的系统提供两个或更多个工作时隙比一个或多个工作者线程更多,并且其
中该系统包括用于所述一个或多个工作者线程中的每一个的恰好一个关联堆。

实施例的系统提供调用线程被配置成使得经由所述两个或更多个工作时隙的相
同工作时隙提供所有相关任务。

实施例的系统提供所述有序多个任务中的每一个任务与键相关联,并且其中每一
个关联堆被配置成防止轮询待决任务以及具有与所述待决任务相同键的所有任务,使得每
一个关联堆维护与相同键相关联的任务的先进先出排序。

实施例的系统提供一个或多个工作者线程比两个或更多个工作时隙更多,并且其
中系统被配置成通过将Start.Worker作业放置在与最少工作者线程相关联的任何关联堆
中来添加工作者线程,从而当所述Start.Worker作业被执行时,创建与所述关联堆相关联
的新工作者线程。

实施例的系统提供一个或多个工作者线程比两个或更多个工作时隙更多,并且其
中系统被配置成通过将Stop.Worker作业放置在与最多工作者线程相关联的任何关联堆中
来去除工作者线程,从而当所述Stop.Worker作业被执行时,停止与所述关联堆相关联的工
作者线程。

实施例提供工作时隙比一个或多个工作者线程更多,并且其中该系统被配置成通
过将Start.Worker作业放置在与最大数量的工作时隙相关联的任何关联堆中来添加工作
者线程,从而当所述Start.Worker作业被执行时,将创建与所述工作时隙相关联的新关联
堆,并且创建与所述关联堆相关联的新工作者线程。

实施例的方法提供工作时隙比一个或多个工作者线程更多,并且其中该系统被配
置成通过将Stop.Worker作业放置在与最小数量的工作时隙相关联的任何关联堆中来去除
工作者线程,由此当所述Stop.Worker作业被执行时,将停止与所述关联堆相关联的工作者
线程,并且所述关联堆被合并到另一个关联堆中。

实施例提供一种非瞬态计算机可读介质,该介质包括存储在其上用于提供可伸缩
线程池以执行从多线程处理环境中的调用线程接收到的有序多个任务的指令,当所述指令
被执行时,使得计算机系统执行步骤,包括:提供被配置成保持任务的一个或多个关联堆;
提供两个或更多个工作时隙,每一个工作时隙定向到恰好一个关联堆,使得由所述调用线
程提供给所述工作时隙的有序多个任务中的每一个任务由所述调用线程经由所述工作时
隙提供给所述工作时隙所定向到的所述恰好一个关联堆;提供与所述一个或多个关联堆中
的每一个相关联的一个或多个工作者线程,每一个工作者线程被配置成从相关联的关联池
轮询任务、执行所述任务、以及在完成时释放所述任务;配置每一个关联堆,使得由工作者
线程从关联堆轮询的待决任务保持在所述关联堆中,直到由所述工作者线程在任务完成时
释放;以及配置每一个关联堆以防止轮询待决任务以及与所述待决任务相关的所有任务,
使得每一个关联堆维持相关任务的先进先出排序。

虽然以上已经描述了本发明的各种实施例,但是应当理解的是,它们是以示例的
方式而不是限制的方式给出。对于相关领域的技术人员将显而易见的是,在不脱离本发明
的精神和范围的情况下,可以在其中进行各种形式和细节上的改变。

可以在硬件、软件、固件或其组合中、使用其或在其的帮助下执行本发明的许多特
征。可以使用一个或多个常规通用或专用数字计算机、计算设备、机器或微处理器(包括一
个或多个处理器、存储器和/或根据本公开的教导编程的计算机可读存储介质)来方便地实
现本发明。还可以使用例如硬件组件(诸如,专用集成电路(ASIC)和可编程逻辑器件)在硬
件中实现本发明的特征。实现硬件状态机以便执行本文所描述的功能对于相关领域的技术
人员将显而易见。

可以在用于控制处理系统的硬件和用于使得处理系统能够利用本发明的结果与
其它机制交互的软件和/或固件中结合本发明的特征。这种软件或固件可以包括但不限于
应用代码、设备驱动程序、操作系统和执行环境/容器。如对软件领域的技术人员将显而易
见的是,基于本公开的教导,熟练的程序员可以容易地准备适当的软件编码。

在一些实施例中,本发明包括计算机程序产品,该产品是具有存储在其上/其中的
指令的存储介质或计算机可读介质,其中指令可以用来对计算机进行编程以执行本发明的
任何过程。存储介质或计算机可读介质可以包括但不限于,任何类型的盘(包括软盘、光盘、
DVD、CD-ROM、微驱动器和磁光盘)、ROM、RAM、EPROM、EEPROM、DRAM、VRAM、闪存设备、磁卡或光
卡、纳米系统(包括分子存储器IC)、或适于存储指令和/或数据的任何类型的介质或设备。
在实施例中,存储介质或计算机可读介质可以是非瞬态的。

出于说明和描述的目的提供了本发明的前述描述。其不旨在穷举或将本发明限制
为所公开的精确形式。许多修改和变化对于本领域技术人员将是显而易见的。修改和变化
包括所公开特征的任何相关组合。选择和描述实施例是为了最好地解释本发明的原理及其
实际应用,从而使得本领域的其他技术人员能够理解本发明的各种实施例和具有适于特定
使用预期的各种修改。本发明的范围旨在由以下权利要求及其等效物限定。

关 键 词:
用于 支持 分布式 数据 网格 中的 动态 线程 大小 确定 系统 方法
  专利查询网所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
太阳城集团本文
本文标题:用于支持分布式数据网格中的动态线程池大小确定的系统和方法.pdf
链接地址:http://zh228.com/p-6059835.html
太阳城集团我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服客服 - 联系我们

copyright@ 2017-2018 zhuanlichaxun.net网站版权所有
经营许可证编号:粤ICP备17046363号-1 
 


收起
展开
葡京赌场|welcome document.write ('');