当前位置:首页计算机论文其它 → 文章内容

计算机集群性能瓶颈的研究与改进

减小字体 增大字体 作者:孙俊峰  来源:本站整理  发布时间:2020-2-14 13:01:11


 摘要:文章主要针对 Linux 的 LVS(Linux Virtual Server)集群的工作机制进行了研究,找到了计算机集群性能瓶颈,在最影响集群性能的调度算法和传输机制开销这两方面都进行了优化,并通过实验测试证明了对 LVS 集群的这两方面的优化确实提高了 LVS 集群的性能。
  关键词:Linux;LVS;集群;调度算法;传输机制;负载均衡中图分类号:TP393.02 文献标识码:A 文章编号:1673-1131(2015)10-0105-03.
  0 引言
  随着计算机与网络技术的迅猛发展,互联网用户数量与网络访问流量大幅增加,大规模的计算任务明显增多,这要求服务器的性能也要随之获得提升。大型机虽然可以解决这些问题,但其高昂的价格显然不适合大多数网站和服务提供商。
  在此需求下,集群系统越来越成为大量网络访问与大数据计算解决方案中的首选方案。本文针对集群系统中常见的 LVS负载均衡集群进行深入研究,找到其主要性能瓶颈并对其提出改进策略,这对企业或个人希望改善负载均衡集群的性能具有借鉴意义。
  1 LVS 集群的通信机制的选取及优化
  LVS 集群釆用的是 Linux 标准内核提供的 TCP/IP 协议 栈作为其通信机制。TCP/IP 协议栈诞生之初主要是美国军队为了实现多台电脑通过互联网进行稳定通信而研发出来的,设计之初就大量考虑了远程通信的稳定性及正确率,起初ISO 制定的 OSI 七层参考模型已经精简为现在的应用层,传输层,网络层,链路层的四层参考模型,TCP/IP协议栈的linux实现正是采用这种四层模型[1]。由协议栈的原理可知,每一层都有自己的协议,根据自身的协议对传递过来的消息进行封装或者去封装。这样就会导致大量内存进行重新分配和拷贝,重复操作导致实现协议栈花费的开销大大增加,严重影响集群系统的性能。
  Linux 系统自从 2.0 内核开始在 TCP/IP 协议栈的实现中已经加入了缓冲机制来降低各协议层报文复制所带来的巨大开销。但是 Linux 内核中的协议栈中的缓冲机制的实现太过 庞大,没有专门对集群系统进行精简优化[2]。Linux 的标准内核中缓冲机制的核心是用 sk_buff {}这一数据结构存放数据,sk_buff{ }在Socket和它之后的层次中是用来存放网络接收到的以及需要发送的数据,它拥有足够的扩展性能,从而可以支持不同层次、相同层次不同类型的网络协议[3]。现在我们把庞大繁琐的 sk_buff 精简为:
  struct sk_buff_new {
  struct sk_buff_new *next; //指向下一结构体,用作构造双向链表struct sk_buff_new *prev; //指向上一结构体,用作构造双向链表void *efdata; //指向实际数据区void *head; //指向报文头void *tail //指向报文的尾部__u32 ef_lengs; //链表结构体内实际数据长度__u32 lengs; //该 sk_buff_new 的总长度__u32 flags //该 sk_buff_new 类型,复合用标志位} 使用精简后的sk_buff_new 的缓冲区管理方式(图 1),只需要 efdata 与 head 之间留出每层协议对上一层报文所加的头部空间的大小,就可以避免数据区反复拷贝,tail 指向 malloc ()在内存堆中动态分配的内存空间也就是缓冲区也是实际数据区的尾部。ef_lengs 成员存储(用户层提供的)数据区的长度,lengs 成员确定 sk_buff 数据结构的总长度,flags 成员指示 sk_buff 的使用类型,这就是精简后的缓冲机制的实现方式。
  图 1 精简后的 sk_buff_new 的缓冲区管理方式2 LVS 集群的负载均衡模式的选择负载均衡模式主要有以下三种:基于 NAT 实现负载均衡(VS/NAT)、基于 IP 隧道实现负载均衡(VS/TUN)以及基于直接路由实现负载均衡(VS/DR)。VS/NAT 模式因为响应消息必须通过负载均衡器,在客户并发连接数很大时,负载平衡器将成为瓶颈;VS/TUR 方式可以缓解负载均衡器的压力,但是同时它也带来了 IP 隧道的开销;VS/DR 中只有请求报文会经过负载均衡器,响应报文直接发送给客户端,负载均衡没有压力,并且本论文所要搭建的服务器集群处于一个局域网内,并且没有 IP 隧道的开销,搭建 VS/DR 模式简单。
  3 LVS 集群的负载均衡算法的选择
  负载均衡常用的调度算法有以下几种,轮转调度、加权轮转调度、最小连接调度和加权最小连接调度。其中加权最小连接算法对真实服务器中各机器的性能差别及其实时连接数 进行了重点考虑,是几种算法中性能较好的,更重要的是Linux支持的 LVS 的默认的调度算法[4]。因此,在我们搭建的集群系统中选择了加权最小链接调度算法。但是,这种算法也有不足之初,就是它只考虑了负载的连接数以及权值仅由经验估计取得的不严谨性。之后我们会对此算法做出分析并提出改进策略。
  4 加权最小链接(WLC)算法的不足及优化
  WLC 算法中真实服务器的权值是服务器管理员根据硬件配置信息以及自己经验估计得到的,缺少足够的科学依据。管理员在手动设定真实服务器的权值后,在集群系统的运行中是不会改变的。对于当前连接数与权值比值最小的真实服务器而言,即使已经处于负载过重的情况,但由于其权值不能动态调整,新的请求仍然会发送到该服务器上,加重其负担,而此时其他服务器可能正处于空闲状态,因此,固定不变的权值,容导致 LVS 集群在长时间运行后,出现负载倾斜的现象[5]。
  针对 WLC 算法的不足,本文在此基础上予以改进,提出了一种动态 WLC 算法。该算法根据真实服务器的当前负载情况,对其权值动态调整。其算法原理可以简单概括为:
  根据真实服务器当前负载的大小及时改变其权值,负载量大,就减小权值,以使真实服务器可以响应更多请求;负载量小,就增大权值,以使真实服务器可以响应更少甚至不响应请求[6]。
  真实服务器实时负载量可以用内存利用率、CPU利用率、网络带宽利用率来量化,但是这些信息频繁快速的采集过程又会加重真实服务器的负载量。所以本文选取的实时负载用服务器响应时间 T 来量化,因为服务器的响应速度从整体上反映了服务器的负载量,而且不消耗真实服务器本身的资源。
  借助负载量 T 定义了动态权值计算公式(1):
  (1)
  其中 700 是根据客户请求到服务器响应的参照延迟时间,若服务器响应用时超过 700ms,则认为服务器负载饱和,就将它的权值归零,不再接受新的请求;若响应用时小于 700ms,则将它的权值设为 700-T。
  5 LVS 集群性能优化方法的 Linux 内核级实现5.1 TCP/IP 协议栈缓冲区的内核实现方法为了使用套接字缓冲区,内核创建了两个后备高速缓存(lookaside cache)它们分别是 skbuff_head_cache 和 skbuff_fclone_cache,协议栈中所使用到的所有的sk_buff结构都是从这两个后备高速缓存中分配出来的。两者的区别在于 skbuff_head_cache 在创建时指定的单位内存区域的大小是 sizeof(struct sk_buff),可以容纳任意数目的 struct sk_buff,而 skbuff_fclone_cache 在创建时指定的单位内存区域大小是 2*sizeof(struct sk_buff)+sizeof (atomic_t),它的最小区域单位是一对strcut sk_buff 和一个引用计数,这一对 sk_buff 是克隆的,即它们指向同一个数据缓冲区,引用计数值是 0,1 或 2,表示这一对中有几个 sk_buff 已被使用。创建一个套接字缓冲区,最常用的操作是 alloc_skb,它在 skbuff_head_cache 中创建一个struct sk_buff,如果要在 skbuff_fclone_cache 中创建,可以调用__alloc_skb,通过特定参数进行[7]。
  5.2 动态权值更新 Linux 内核模块的实现
  动态权值更新模块由 3 个自定义函数实现,分别是主函数、动态负载值计算函数、动态权值计算函数。这三个函数的实现流程图见图 2 所示。
  图 2 函数实现流程图
  6 简单 LVS 集群系统下的性能测试结果对比与分析6.1 测试环境的搭建与配置在现有实验室资源下搭建简易的LVS集群系统来测试改进后的集群的性能。本试验系统由两台电脑组成服务器池,一台电脑作为负载均衡器,一台电脑作为

[1] [2]  下一页