关于前端:分析核亲和性对高吞吐量的流的影响

35次阅读

共计 27033 个字符,预计需要花费 68 分钟才能阅读完成。

剖析核亲和性对高吞吐量的流的影响 ### 简介

网络吞吐量正在朝更高的数据传输率倒退,与此同时,终端零碎的处理器也在朝着多核倒退。为了在多核终端零碎上优化高速数据传输,像网络适配器卸载以及性能调优等技术曾经受到了宽泛的关注。此外,曾经呈现了一些多线程网络接管解决的办法。但对于如何调参,以及应用哪个卸载能力达到更高的性能的关注度远远不够,而且对于为什么这么设定的了解也远远有余。本论文会联合前人的研究成果来跟踪高速 TCP 流下,终端零碎呈现性能瓶颈的源头。出于本论文的目标,咱们认为协定解决效率是指实现每单位 (以 Gbps 为单位) 吞吐量所耗费的系统资源(例如 CPU 和缓存),并应用低级零碎事件计数器测量耗费的各种系统资源的总量。亲和性或核绑定用于决定终端零碎上负责解决中断,网络和利用的解决核。咱们得出亲和性对协定解决的效率会产生至关重要的影响,三种不同的亲和性计划下网络接管解决的性能瓶颈会产生急剧变动。

介绍

因为多种物理限度,处理器内核达到了时钟速度的“极限”,此时 CPU 时钟频率将无奈减少。而另一方面,光纤网络中的数据速率却在一直进步,更好的光学和精细设施改善了散射,排汇和离散的物理事实[1]。只管物理层获得了这些提高,但咱们依然受到用于协定解决的系统软件层面的限度。因而,为了进步应用层的网络吞吐量,高效的协定解决和适当的零碎层面的调优是必要的。

TCP 是一种牢靠的,面向连贯的协定,它会保障发送者到接收者之间的数据的程序,这样做会将大部分协定解决推到终端零碎上。实现 TCP 协定的性能须要肯定水平的复杂性,因为它是一个端到端协定,因而所有性能都须要在端系统中进行检测。这样,晋升现有 TCP 实现效率的路径分为两类:首先,应用卸载尝试将 TCP 性能放到协定栈之下,以此来达到更好的传输层效率;其次,通过调参,但这些参数会给下层 (软件,零碎和系统管理) 带来复杂性。

调参次要关注亲和性。亲和性 (或核绑定) 从根本上说是对于在网络多处理器零碎中的哪个处理器上应用哪些资源的决定。Linux 网络接管解决音讯在古代零碎上次要有两种实现形式:首先通过中断解决 (通常会联结解决),一旦 NIC 接管到特定数量的报文后,就会向处理器发动中断,而后 NIC 会通过 DMA 将报文传输到处理器(_应该是先将报文放到 DMA,而后再向处理器发动中断_),随后 NIC 驱动核 OS 内核会持续协定解决,直到给利用筹备好数据;其次,通过 NIC 轮询(在 Linux 中称为 NEW API,NAPI),这种形式下,内核会轮询 NIC 来查看是否有须要接管的网络数据,如果存在,则内核将依据传输层协定解决数据,以便依据 socketAPI 将数据将数据传递给应用程序。不管哪种形式,都存在两类亲和性:1) 流亲和性,用于确定那个核将会中断解决网络流;2)利用亲和性,用于确定哪个核会执行接管网络数据的利用过程。流亲和性通过 /proc/irq//smp affinity 中的十六进制核描述符进行设置,而利用亲和性能够通过 taskset 或相似的工具进行设置。因而一个 12 核的终端零碎,存在 144 种 (12^2) 可能的流和利用亲和性。

在本论文中,咱们将通过具体的试验扩大先前的工作[3],[4],应用单个高速 TCP 流对每个亲和性组合进行压力测试。咱们会应用终端零碎的性能内省来了解抉择的亲和性对接管零碎效率的影响。咱们能够得出有三种不同的亲和性场景,且每种场景下的性能瓶颈差别很大。

相干工作

目前已有多项钻研评估了多核零碎中的网络 I / O 性能 [5]–[8]。以后内核中一个次要的晋升是默认启用 NAPI [9]。NAPI 用于解决接管活锁问题[8],即 CPU 耗费大量周期来解决中断。当一个机器进入活锁状态时,因为大部分的 CPU 周期用于解决硬中断和软中断上下文,它会抛弃报文。启用了 NAPI 的内核会在高速率下切换到轮询模式来节俭 CPU 周期,而不依赖纯中断驱动模式。10 Gbps WAN 上的报文失落和性能阐明能够参见[10],[11]。[12] 更多关注提早的架构起源,而不是根底数据中心的链接。改善终端零碎瓶颈不利影响的另一个方面波及重新考虑终端零碎的硬件架构。传输敌对的 NIC,以及新的服务器架构能够参见[12],[14]。可怜的是,这些戏剧性的变动很少能用于已部署的、用于测试目标的商品终端零碎类型。

Linux 网络性能调优选项

古代 NIC 反对多接管和传输描述符队列。NIC 应用过滤器将报文发送到不同的队列,以此来在多个核上分担负载。启用 Receive-Side Scaling (RSS) [15]后,不同流的报文会发送到不同的接管队列,并由不同的 CPU 解决。RSS 须要 NIC 的反对。Receive Packet Steering (RPS) [16]是 RSS 的内核软件版本。它会为接管的报文集抉择 CPU 核来执行协定解决。Receive Flow Steering (RFS) [17]与 RPS 相似,但它会应用 TCP 四元组来保障一条流上所有的报文会进行雷同的队列和核。所有这些扩大技术目标都是为了晋升多核零碎的整体性能。

当执行网络解决 [6] 时,通常理智的做法是抉择共享雷同的最低缓存构造的核 [18]。例如,当一个给定的核(如核 A) 被抉择来执行协定 / 中断解决时,与核 A 共享 L2 缓存的核应该执行相应的用户应用程序。这样做会缩小上下文切换,晋升缓存性能,最终减少总体吞吐量。

Irqbalance守护过程会执行轮询调度来在多核上进行中断的负载平衡。但它也会造成负面影响,见 [19], [20]。咱们须要更理智的办法,而且须要管制抉择解决中断的核。在咱们的试验中禁用了irqbalance 守护过程。

暂停帧 [21] 能够容许以太网通过流控制阻止 TCP,因而,当仅须要在路由器或交换机上进行长期缓冲时,能够防止 TCP 窗口的倍数减小(防止)。为了实现该性能,反对暂停帧的以太网设施会在每个链路中应用闭环过程,在这种链路中,发送设施晓得须要缓冲帧的传输,直到接收器可能解决它们为止。

巨帧 (Jumbo Frames) 仅仅是个以太帧,但它的长度远大于 IEEE 规范的 1500 字节的 MTU。在大多数场景下,当应用 Gigabit 以太网时,帧的大小能够达到 9000 字节,这样做能够通过减少减少无效负载与帧头大小的比率来取得更好的协定效率。尽管以太速度从 40Gbps 晋升到了 100Gbps,但 9000 字节的帧大小的规范并没有发送变动 [22]。起因是因为存在各种分段卸载 (segmentation offloads)。Large/Generic Segment Offload (LSO/GSO) 和 Large/Generic Receive Offload (LRO/GRO) 与当代路由器和交换机中的以太网实现相结合,来在当条 TCP 流上发送和接管十分大的帧,这种形式下惟一的限度因素是协商的传输速率和错误率。

数据转移技术

本钻研不会间接关注如何在长距离上挪动大量数据,一些终端零碎应用程序曾经实现了多种形式,这些形式有助于无效地利用 TCP [23]–[26]。这些成熟利用背地的总体思路是应用多条 TCP 流来解决应用层的传输,并将这些流的解决和重组调配给多个处理器[27]–[29]。大部分这些利用同样可能利用基于 UDP 的传输层协定,如 RBUDP [30] 和 UDT [31]。

目前曾经有很多协定专门用于在关闭的网络 (在数据中心内或数据中心之间) 中疾速牢靠地转移大量数据。最近,这些协定专一于如何将数据从一个零碎的一块内存间接转移到另一块内存中,两个例子是 RDMA [32] 和 InfiniBand [33]。这些协定的共同点是它们依赖于终端零碎之间绝对简单,强壮和牢靠的两头网络设备。

以前,咱们钻研了亲和性对终端零碎性能瓶颈的影响 [3],并得出亲和性对端到端系统的高速流的影响微小。此钻研并没有深究不同亲和性场景下终端性能瓶颈产生的地位,指标是确定这些亲和性场景下的性能瓶颈产生在哪里,并评估新的 Linux 内核 (后面应用的是 Linux 2.6 版本的内核) 是否解决了这些问题。

试验设置

各种 NIC 卸载提供了很多有用的参数。NIC 厂商通常会提供一些倡议来领导用户如何调节零碎,以充分利用其高性能硬件。[34]提供了贵重的 Linux 调参资源,这些资源是通过在 ESnet 的 100 Gbps 测试平台上进行认真的试验取得的。ESnet 提供了很多演示文稿,具体介绍了试验中取得的调优倡议,但很少有教训证实这些调优倡议和卸载的原理。

本论文中,咱们将提供多线程协定解决,或将协定解决推送到协定栈的不同组件中。咱们将致力证实参考空间局部性在终端零碎中跨多条流的数据流解决中的重要性。因而,这些试验中引入了_iperf3_ [35] 来通过单条高速 TCP 流来进行压力测试,该测试会使流量达到终端零碎的网络 I / O 下限。留神,这并不是一个理论案例,实际中,如 GridFTP [23] 这样的利用会通过多条流来达到更快的传输速率,性能也更加可预测,但在实践中应审慎应用这种工具(尤其使在长距离挪动大量数据时)。但了解终端零碎中数据传输的限度十分重要(最好只用一个流即可实现)。

为此,咱们引入了两台服务器,连贯提早 < 1ms RTT,与咱们之前应用 ESnet Testbed 的 95ms RTT 光纤环路进行的试验 [3] 相同。循环测试能够无效地观测长距离下 TCP 带宽的行为,咱们的指标是进行压力测试,而后剖析接收端的性能效率。

本试验中的零碎都运行在 Fedora Core 20 上,内核为 3.13。应用最新内核的起因是,假如该内核曾经引入了最新的网络设计。

用于生成 TCP 流的利用为 iperf3。为了确保将压力施加在终端零碎上,传输应用了零拷贝模式(应用 TCP sendfile 零碎调用来防止不必要的拷贝以及避免耗尽发送端系统的内存)。

被测试的零碎是依据 ESnet 数据传输节点(DTN)的原型建模的。这类零碎的目标是作为一个中间人,将大量数据从高性能计算机 (HPCs) 传输到耗费数据的中的终端零碎上。实际中,这类零碎必须可能通过 InfiniBand 主机总线适配器尽可能快地接管大量数据,而后将数据传输到本地磁盘或大规格的本地内存中,而后在高速(100 Gbps)WAN 上向接管零碎提供数据。它们应用了连贯到 Intel Sandy Bridge 处理器的 PCI-Express Generation 3。每个终端零碎有两个六核处理器。因为 Sandy Bridge 的设计,特定的 PCI-Express 槽会在物理上间接连贯到一个独自的 socket(_即 CPU 插槽,能够应用 lscpu 命令查看_)。能够通过 Quick Path Interconnect(QPI)提供的低级 socket 间的通信来克服此限度。图 1 站展现了该架构:

测试平台选用的是 ESnet 100 Gbps 测试平台[37],它连贯了(专门用于跨洲的)100 Gbps 网络上的各种基于商用硬件的终端零碎。该测试平台凋谢给了所有研究员,并提供了除了产生反复后果外的其余益处,因为整个测试床都是可保留的。这样就保障了不会存在竞争的流量。出于试验目标,须要在终端零碎上测试性能瓶颈,而不是网络上。

Linux 下图分析器应用的是_Oprofile_。Oprofile 为 Linux 提供了轻量且高度内省的对系统硬件计数器 [38] 的监控性能。Oprofile 的新工具_ocount_ 和_operf_用于监控接管零碎上的各种事件的计数器。在这些试验中,因为须要监督的接收者可能会超额,因而 Oprofile 的低开销和具体的 Linux 内核自检的能力是至关重要的。通过自省能够无效地测量 operf 的开销,并且发现该开销始终比受监督过程的计数后果至多小一个数量级。因为可用的计数器数量和自省性能,在这些试验中,Oprofile 被选为英特尔的性能计数器监视器(PCM)。PCM 还能够报告功耗,在将来的测试中可能会有用。

上面是试验中应用的自变量:

  • 流亲和性:0~11 核
  • 利用亲和性:0~11 核
  • 测试总次数:12×12=144

上面是试验中应用的因变量:

  • 吞吐量
  • 指令退出数(零碎范畴以及内核和用户过程的自省)
  • 最初一级缓存援用(零碎范畴以及自省)
  • L2 缓存拜访
  • 重试的内存事务
  • 脱机申请

表 1 展现了试验环境的详情。发送和接收端零碎的配置雷同。

试验办法

在执行 144 次试验前,都会运行一个脚本来查看零碎的网络设定和调参,保障后续的试验的一致性。零碎应用了 ESnet 的调参倡议,保障 TCP 的高性能。而后进行初步测试,以确保没有异样会导致可变的带宽后果。发送零碎设置为最佳亲和配置,且不会更改其亲和设置。在发送端会启动一个 iperf3 服务器,并放在那里运行。而后在接收端,应用嵌套的 for 循环 shell 脚本批改了设置所有 rx 队列的中断 (/proc/irq/<irq#) 设置到对应的 /smp_affinity 配置文件中,这样所有接管队列中的报文都会发往雷同的核。外部 for 循环会在执行 iperf3 反向 TCP 零拷贝测试时运行 operf,将接收者绑定到一个给定的核,并报告后果。通过这种形式来测试流和利用亲和性的所有组合。屡次运行试验来保障后果的一致性。

后果

咱们当初核之前的工作 [3] 得出存在三种不同的性能类型,对应如下亲和性场景:1)雷同的 socket,雷同的核 (即流和利用都绑定到雷同的核),这种状况下,吞吐量能够达到 20Gbps;2)不同的 socket(不同的核) 能够达到的吞吐量为 28Gbps;3)雷同的 socket,不同的核,吞吐量能够达到 39Gbps。尽管变更了 OS(从运行 2.6 内核的 CentOS 换到了运行 3.13 内核的 Fedora),并更新了 NIC 驱动后的整体性能失去了晋升,但三种亲和性设定下的绝对性能并没有变动。

能够看到雷同的 socket,不同的核的吞吐量最大,起因是雷同的 socket 使得缓存查问效率比拟高,不同的核缩小了中断上下文切换造成的性能损耗。因而将解决报文和利用放到雷同的核上并不总是正确的,尽管进步缓存命中率,但有可能减少了中断上下文造成的损耗。

咱们以前的工作表明,在零碎级上超额的接收者的低吞吐量与缓存未命中之间存在关联。本次试验也会驳回这种观点,应用 ocount 来监控零碎级别的硬件计数器,并应用 operf 来进行内核自省,以仔细检查接收者的性能瓶颈的本源。

上图展现了 144 次试验后果,空心圆示意 NIC 给出的速率(见表 1),填充的蓝色示意理论测量到的吞吐量,填充越多,示意理论吞吐量越大。

这个论断与下面给出的雷同,左下角和右上角象限中的吞吐量最大,此时利用和流的亲和到雷同的 socket,但不同的核。

后果剖析

为了高效地传播 144 个测试的后果,咱们应用了图 2 中的矩阵。Y 轴示意利用亲和的核,数字 0 到 11 示意物理核。因而核 0 到 5 位于 socket0,核 6 到 11 位于 socket1(见图 1)。上数矩阵有两个重要属性:

  1. 图 2 中的对角线示意利用和流应用亲和到雷同的核
  2. 图表能够按象限查看,每个象限代表与两个 socket 相干的可能的亲和性组合之一。即,所有大于 5 的利用亲和核,且小于 6 的流亲和核示意利用亲和到 socket1,流亲和到 socket0,等。

整体的流和利用的解决效率

在前面的图中咱们引入了 Oprofile 硬件计数器后果。当解释后果时,须要留神硬件计数器自身携带了一些信息。例如,能够简略地查看 iperf3 传输过程中退出的指令总数,但这并不蕴含理论传输的数据量。这样做的目标是为了查看效率,因而应用退出的指令数除以传输吞吐量 (Gbps) 作为后果。因为每个测试的长度是雷同,因而能够对后果进行归一化。

图 3 展现了每秒每 GB 的数据传输下退出的指令数。本图中的对角线展现了 (当流和利用都亲和到雷同的核时) 解决效率低下。这种场景下,不仅仅吞吐量很低(见图 2),而且解决效率也远远低于其余场景。在流亲和到 socket0,利用亲和到 socket1 的状况下,须要在 socket0 和 socket1 之间通过更多的指令来挪动数据。

144 次测试的解决效率,圆越大示意解决效率越低。

从图 3 能够看出缓存地位对缓存指令数的影响。间隔越远,命中率约低,搜寻量越大,导致须要的指令越多。

存储层次结构

在下面提到的对角线场景中,用户的正本数决定了终端零碎耗费的资源。从零碎角度看,大量用于拜访内存层次结构的指令恰好证实了这一点(见图 4,5,6)。次要留神的是这些图的题目进行了简化(_具体意义参见解析_)。此外,因为原始的计数器输入在此处的意义不大,因而应用了计数器的数据除以指令退出 / 吞吐量作为后果(图 3)。

在利用和流亲和到不同核但雷同 socket 的场景下,内存层级构造的事务仿佛主导了次要的退出指令数。但这种状况下的传输靠近线性,因而内存层次结构并不像是真正的瓶颈。通过初步剖析,发现对于流和利用位于不同 socket 的场景,瓶颈可能是因为 LOCK 前缀引起的,因为应用方正在期待缓存一致性。

然而,对于利用和流亲和到不同 socket 的场景,只有非常少的一部分指令会用于内存层次结构的事务,只管事实上用户正本会持续主导 CPU 耗费。这种状况下应用了很多计数器来监控并剖析可能的瓶颈,包含硬件中断和因为 LOCK 前缀造成的 CPU 周期节约,但都没有展现出与该亲和场景的关联性。

用于 L2 高速缓存事务中的已退出指令 / 吞吐量的比例,能够看出雷同 socket,但不同 core 的缓存命中率绝对较高。

用最初一级高速缓存事务中的已退出指令 / 吞吐量的比例

NIC 驱动的 CPU 利用率瓶颈

乏味的是,在本对角线场景下,与内存层次结构相干的事务仅占了整体退出指令数的很小一部分。这种状况下,内省显示 NIC 驱动 (mlx4 en) 是次要的系统资源耗费者。未来会应用驱动程序自省考察这种状况下瓶颈的确切起源。

用于内存事务处理中的已退出指令 / 吞吐量的比例

论断和后续工作

本论文最重要的论断之一是零碎内和零碎间通信间的时钟速度壁垒的界限正在迅速含糊。当一个处理器核和另外一个核进行通信时,数据须要在零碎 (芯片) 网络间进行传输。为了实现大规模数据复制和一致性,必须在 WAN 上进行数据的传输。那么这些网络有什么不同?WAN 上对数据传输性能的影响正在继续变小,且网络也正在变得越来越牢靠,越来越可重配置。同时,零碎间的网络也变得越来越简单(因为横向扩大零碎和虚拟化),且有可能升高了可靠性(如因为节能有时须要升高芯片的某些局部或齐全敞开它们的局部)。当探讨到亲和性,除了这些变动外,依然须要关注其间隔,本地性(无论网络的大小)。将来,最无效的解决方案可能不仅仅是将 NIC 集成到处理器芯片上[14],甚至有可能集成现有的 I / O 构造的性能,如北向桥。然而,这些可行性可能须要很多年才可能实现。

本钻研给出了更确切的论断,即须要审慎往一个芯片上增加更多的组件,这样有可能导致跨 socket 的性能变低。这些论断为以终端零碎为主的吞吐量和提早测试提供了重要的背景:在高吞吐量,高性能硬件上,端到端的 TCP 流的体系结构提早源可能会产生巨大变化。

同时,也能够应用雷同的形式来测试其余 NIC 和其余 NIC 驱动,看是否可能得出相似的论断。最近,中断合并和在 NAPI 之间主动切换的 NIC 驱动程序也正在钻研中。此外,也在调研多流 TCP 和 UDT GridFTP 传输。将来的指标是实现一个轻量级中间件工具,该工具能够在更大程度上优化亲和性,并扩大已在缓存感知的亲和性守护程序 [18] 上的工作。

援用

[1] G. Keiser, Optical Fiber Communications. John Wiley & Sons, Inc., 2003.

[2] C. Benvenuti, Understanding Linux Network Internals. O’Reilly Media, 2005.

[3] N. Hanford, V. Ahuja, M. Balman, M. K. Farrens, D. Ghosal, E. Pouyoul, and B. Tierney,“Characterizing the impact of end-system affinities on the end-to-end performance of high-speed flows,”in Proceedings of the Third International Workshop on Network-Aware Data Management, NDM’13, (New York, NY, USA), pp. 1:1–1:10, ACM, 2013.

[4] N. Hanford, V. Ahuja, M. Balman, M. K. Farrens, D. Ghosal, E. Pouyoul, and B. Tierney,“Impact of the end-system and affinities on the throughput of high-speed flows.”poster – Proceedings of The Tenth ACM/IEEE Symposium on Architectures for Networking and Communications Systems (ANCS) ANCS14, 2014.

[5] A. Pande and J. Zambreno,“Efficient translation of algorithmic kernels on large-scale multi-cores,”in Computational Science and Engineering, 2009. CSE’09. International Conference on, vol. 2, pp. 915–920, IEEE, 2009.

[6] A. Foong, J. Fung, and D. Newell,“An in-depth analysis of the impact of processor affinity on network performance,”in Networks, 2004. (ICON 2004). Proceedings. 12th IEEE International Conference on, vol. 1, pp. 244–250 vol.1, Nov 2004.

[7] M. Faulkner, A. Brampton, and S. Pink,“Evaluating the performance of network protocol processing on multi-core systems,”in Advanced Information Networking and Applications, 2009. AINA’09. International Conference on, pp. 16–23, May 2009.

[8] J. Mogul and K. Ramakrishnan,“Eliminating receive livelock in an interrupt-driven kernel,”ACM Transactions on Computer Systems (TOCS), vol. 15, no. 3, pp. 217–252, 1997.

[9] J. Salim,“When napi comes to town,”in Linux 2005 Conf, 2005.

[10] T. Marian, D. Freedman, K. Birman, and H. Weatherspoon,“Empirical characterization of uncongested optical lambda networks and 10gbe commodity endpoints,”in Dependable Systems and Networks (DSN), 2010 IEEE/IFIP International Conference on, pp. 575–584, IEEE, 2010.

[11] T. Marian, Operating systems abstractions for software packet processing in datacenters. PhD thesis, Cornell University, 2011.

[12] S. Larsen, P. Sarangam, R. Huggahalli, and S. Kulkarni,“Architectural breakdown of end-to-end latency in a tcp/ip network,”International Journal of Parallel Programming, vol. 37, no. 6, pp. 556–571, 2009.

[13] W. Wu, P. DeMar, and M. Crawford,“A transport-friendly nic for multicore/multiprocessor systems,”Parallel and Distributed Systems, IEEE Transactions on, vol. 23, no. 4, pp. 607–615, 2012.

[14] G. Liao, X. Zhu, and L. Bhuyan,“A new server i/o architecture for high speed networks,”in High Performance Computer Architecture (HPCA), 2011 IEEE 17th International Symposium on, pp. 255–265, IEEE, 2011.

[15] S. Networking,“Eliminating the receive processing bottleneckintroducinhttps://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…
https://github.com/hitl837/ml…
https://www.github.com/hitl83…
http://github.com/hitl837/mlo…

正文完
 0