摘 要
Boost是一套开放源代码、高度可移植的C++库。其内容广泛 函数绑定、智能指针、数据结构、 图算法、字符串处理、语法分析、 网络编程……等均包含在内。ASIO 是Boost库中基于异步IO模型的可移植的网络编程库。
Tracke r服务器作为P2P应用中的关键组成部分其主要作用是跟踪网络中每个节点的资源信息并提供检索服务。 Track er服务器作为P2P网络的入口其性能、容量安全性以及健壮性是至关重要的。本文探讨如何利用上述库设计并实现一个可无限扩容的高性能Tracker服务器系统。
首先从健壮性的角度比较了多线程模型和单线程异步模型之间的优劣。然后比较了C++标准模板库STL中的HashMap以及Boost库中多索引容器的插入、删除、查询的性能。并选定了Boost作为基本库使用ASIO单线程异步模型用多索引容器建立资源和节点的对应关系。并针对资源数量远远大于用户数量这个事实进行方案的设计和优化。
为了对系统进行性能测试和正确性测试本文借鉴JSON的语法设计并实现了一种支持自定义模式和表达式计算的定义式测试脚本可以定义每个包的具体内容、发包频率、节点生命周期等一系列参数。
关键字前摄器模式;Boost模板库;多索引容器;异步I/O;Tracker服务器;JSON
I
Abstract
Boost is an open source and highly portable C++library. It is intended to be widely use ful, supporting function b inding, smart po inter,various data structures,graph algorithms,string processing,grammar parsing,network programming,and so on.AS IO is part of Boost library which provides developers with an asynchronous I/O model.
Tracker server cluster is an important part of a peer to peer application. It traces the resources information held by eachpeer and provides query services to all peers in the network.As the entry of a peer to peer network, tracker server cluster is required to process much faster and more robust with higher capacity.These features are critical for a tracker server cluster.This thesis analyzes how to design and implement a capacity-scalable tracker server cluster with the library mentioned above.
Firstly,from robust aspect, this thesis compares the multi-thread model and the asynchronous I/O model; then from performance view,compares the insertion,deletion,query operations between hash map of STL(Standard Template Library)and multi index container with hashed index ofboost library.Finally,Boost with Multi-Index Container library is chosen to establish the mappings between peers and resources;also optimizations are applied considering the fact that the number of resources is greatly larger than the numb er o f us ers.
At last,for the purpose of stress testing and accuracy testing,based on JSON grammar,the thesis suggests a script that supports pattern and expression evaluations, to describe the testing progre ss, including p ackets definition,packets sending frequencies,peers‟ life cycle and all the other necessary parameters needed.
Key Wo rds:Proactor Pattern;Boost Template Library;Multi-Index Container;
Asynchronous I/O;Tracker Server;JSON
II
缩略语
JSON(JavaScript Object Notation) JavaScript对象表示法UUID(Universally Unique Identifier) 全局唯一标识
独创性声明
本人声明所呈交的学位论文是我个人在导师的指导下进行的研究工作及取得的研究成果。尽我所知除文中已标明引用的内容外本论文不包含任何其他人或集体已经发表或撰写过的研究成果。对本文的研究做出贡献的个人和集体均已在文中以明确方式标明。本人完全意识到本声明的法律结果由本人承担。
学位论文作者签名
日期 2008年月 日
学位论文版权使用授权书
本学位论文作者完全了解学校有关保留、使用学位论文的规定 即学校有权保留并向国家有关部门或机构送交论文的复印件和电子版允许论文被查阅和借阅。本人授权华中科技大学可以将本学位论文的全部或部分内容编入有关数据库进行检索可以采用影印、缩印或扫描等复制手段保存和汇编本学位论文。
保密□在______年解密后适用本授权书。
本论文属于
不保密√。
请在以上方框内打“√”
学位论文作者签名 指导教师签名
日期 2008年月 日 日期 年月 日
1绪 论
1.1 课题背景
随着互联网的发展 网络带宽也越来越大 网站也从过去偏向与文本的形式转向到偏向于多媒体形式。在这种形势下各种视频分享网站也逐渐成为网络的主流使得每个人都有机会成为生活的导演。随着用户数量的飞速增长这些视频分享网站需要付出高昂的带宽费用来满足用户的最佳体验。在这种背景之下一种能充分利用网络带宽来减少用户的缓冲等待时间给用户带来更流畅播放体验 同时也能为这些视频网站分担带宽压力的解决方案应运而生。
这种方案的核心思想是在用户与视频分享网站之间加入一层缓存将所有播放的视频在本地保存一份并在不同的用户之间进行共享。这样除了视频服务器能给用户提供数据外用户也可以从其他拥有同样资源的用户那里去获取数据加快了视频数据的下载速度减少了缓冲时间使得视频观看更加流畅 同时从视频分享网站的角度来看一部分流量被分担到了用户与用户的共享之中相当于以更低的带宽成本满足了同样规模用户的最佳播放体验。
在这个方案中要让用户之间进行共享需要有一个服务器来告诉用户它正在播放的资源被其他哪些用户拥有这样它才能去向这些用户请求数据以实现共享或者下载的加速。这个服务器就是本文要研究的Track er服务器它的任务就是动态的记录当前哪些用户拥有哪些资源并能提供查询服务供用户查询资源的拥有者以实现资源共享。
1.2 研究意义
从1.1节的描述可以看到 当用户需要从其他用户那里获取数据时它首先得向Tracker服务器进行查询 同时当用户需要分享自己的数据时也必须首先告诉Tracker 服务器自己拥有哪些资源。因此可以说 Track er服务器是整个客户端P2P网络的入口点 Tracker服务器记录了当前每个客户端节点拥有哪些资源 以及每个资源被哪些客户端节点拥有并且这些信息还需要有较高的实时性。 Tra cker服务器能承载的客户端节点个数就决定整个系统能承载的用户数量 同样 Tracker服务器能承载的资源总量也决定了系统的容量。因此提高Track er服务器的性能或者通过增加服务器来
1
扩充容量具有很实际的意义。
1.3 本文研究内容与结构
本文将主要研究如何设计实现单个Track er服务器并研究多个Tracker服务器之间如何进行负载均衡以便能增加整个系统的容量。最后设计实现相应的测试工具对服务器进行正确性测试和压力测试。本文共分六章 内容安排如下
第一章绪论
本文的项目概况和项目实现技术的总体综述。这一章首先介绍了项目背景概述了本文研究课题的来源、 目的与意义然后对本文内容及整体结构作了说明。
第二章技术背景介绍
介绍了本系统用到的一些技术包括Boost库[1]、ASIO库[2]以及JSON[3]的语法。
第三章系统分析与架构
本章首先从整体的角度介绍了整个P2P应用的架构并介绍了各个模块之间的是如何交互的。重点讲了Track er服务器模块在整个系统中所处的位置与需要实现的功能。接下来提出了一种能支持多Track er服务器合作扩容和负载均衡的方案。最后详细分析了每个Tracker服务器内部的设计和实现细节。
第四章测试模块分析与设计
本章主要分析测试需求设计测试脚本的格式和元素。最后实现整个测试工具。
第五章系统性能测试
本章主要介绍如何部署系统以及设计测试数据。最后对测试结果进行了分析。
第六章总结与展望
论文的总结以及对研究课题的预测和展望。
2
2技术背景介绍
本章主要介绍在分析和设计整个系统的过程中考虑到会选用的一些技术并指出了选用它们的原因。技术背景的介绍主要包括Boost库、ASIO库和JSON。这里Boost 主要用做基本库作为底层的平台在其上构建所有的组件 ASIO库主要用做网络编程的平台所有的网络层组件都是在ASIO库的基础上搭建而成而JSON是作为一个轻量级的数据交换格式本文将其扩展之后用来描述测试脚本的行为。
2.1 Boost介绍
2.1.1 Boost简介
Boost是一个由C++标准库委员会发起在Boost软件许可协议[4]下开源的C++模板库其由哈佛大学法学院协助撰写的协议同时鼓励商业和非商业的用途并且和GPL或者其他商业不友好的协议没有任何关系。 Boost的库都能够很好的和C++保准库兼容并且最重要的是它是一个高质量跨平台的C++模板库实现了众多的常用模块和多种高质量的算法模块。可以极大的提高产品的质量减少臭虫的产生并带来更小的维护代价。并且Boost库即将成为事实上的标准库 已经有十个Boo st库被加入了C++技术报告的第一版更多的库被排到C++技术报告第二版。
Boost库旨在提供全新的、有创造性的设计。它们并不是其他那些拥有知识产权库的拷贝、克隆或者演绎。 Boost库有严格的政策来尊重其他库的知识产权。 Boo st 库的开发和文档的撰写都是邮件列表或者版本控制系统公开进行的。其源代码已经被许许多多经验丰富的程序员所审查过。许多的商业机构或者组织也愿意将自己维护、改进的代码贡献给开源社区这样他们可以更加关注于自己的核心事务。
2.1.2 Boost支持的库
Boost主要包含一下几个大类字符串及文本处理、容器、迭代子、算法、函数对象和高阶编程、泛型编程、模板元编程、预处理元编程、并发编程、数学相关、纠错和测试、数据结构、输入/输出、跨语言支持、 内存相关、语法分析、杂项。
3
2.1.3 Boost基本知识
本章将介绍需要用到的Boost库。主要包括一些最基本最常用的库智能指针、函数绑定、多容器索引、语法分析以及字符串格式化。
2.1.3.1智能指针
资源泄露曾经是C++程序的噩梦垃圾回收一时备受瞩目。然而垃圾回收机制并不能满足内存管理的及时性和可视性往往使得程序设计者不自在况且C++的实现也没有引入这样的机制。在探索的过程中 C++程序员创造了智能指针一定程度上解决了资源泄露的问题。智能指针的关键技术在于用栈上构造对象的生命期控制堆上构造对象的生命期 因为在智能指针内部存储者堆上对象的的指针而且在析构函数中调用de lete行为。智能指针机制作为C++垃圾回收机制的核心必须足够的强大、具有工业强度和安全性 Boost的智能指针库正是为此目的而设计的。
Boost的智能指针库[5]提供了多种不同类型的智能指针[6]类模板每种智能指针都有不同的目的和用途。这些智能指针列举如下
表2.1 Boost智能指针的类型
在本系统中用到是基于引用计数的共享指针sha re d_p t r和s har e d_arra y[7]。用于防止内存泄露[8]。一个简单几乎能完全消灭内存泄露的原则是 总是使用一个已命名的智能指针变量接手new的对象。每次出现new关键字都应该是这样的形式要使用已命名的智能指针变量下面看看匿名的智能变量是如何的危险
4
量这就可能导致内存泄露。因为函数参数的求值顺序是不确定的 new int(2)首先被求值 g()可能是接下来求值的如果这个时候函数g抛出异常那么s hared_ptr<int>的构造函数就永远无法达到了也就意味着分配的内存无法被释放了。
那么在实际运用中对类的封装可以采取如下的方式
这里 A的构造函数被声明为私有的只能通过C re at e方法来构造A的实例这个时候返回的指针是指向A的s hared_p tr指针对象的生命周期就由 s hared_p tr内部的引用计数来管理了。要注意的一点是 当调用其他的函数需要传入一个this指针时必须使用shared_fro m_this()函数只有这样才会将当前指针所属的智能指针的引用数加一。如果使用shared_ptr<A>(this)传入那就相当于构造了一个新的s hared_ptr 指针也拥有新的引用计数并且它不会跟以前的智能指针共享所有权最后会导致this被de lete两次这将是非常严重的错误。
2.1.3.2函数绑定
Boost提供了一个Bind库用于将各种函数绑定成一个仿函数对象。这样的好处是可以绑定函数的参数状态并延迟对一个函数的调用。在ASIO库中广泛的用到了这些技巧。boost: :b ind[9]是标准函数std: :b ind 1 st和std: :b ind2 nd的泛化。它支持任意函数对象 函数 函数指针和成员函数指针它能将任何参数绑定为一个特定的值或者
5
A400互联是一家成立于2020年的商家,本次给大家带来的是,全新上线的香港节点,cmi+cn2线路,全场香港产品7折优惠,优惠码0711,A400互联,只为给你提供更快,更稳,更实惠的套餐。目前,商家推出香港cn2节点+cmi线路云主机,1H/1G/10M/300G流量,37.8元/季,云上日子,你我共享。A400互联优惠码:七折优惠码:0711A400互联优惠方案:适合建站,个人开发爱好者配置...
Digital-VM商家的暑期活动促销,这个商家提供有多个数据中心独立服务器、VPS主机产品。最低配置月付80美元,支持带宽、流量和IP的自定义配置。Digital-VM,是2019年新成立的商家,主要从事日本东京、新加坡、美国洛杉矶、荷兰阿姆斯特丹、西班牙马德里、挪威奥斯陆、丹麦哥本哈根数据中心的KVM架构VPS产品销售,分为大硬盘型(1Gbps带宽端口、分配较大的硬盘)和大带宽型(10Gbps...
HostYun是一家成立于2008年的VPS主机品牌,原主机分享组织(hostshare.cn),商家以提供低端廉价VPS产品而广为人知,是小成本投入学习练手首选,主要提供基于XEN和KVM架构VPS主机,数据中心包括中国香港、日本、德国、韩国和美国的多个地区,大部分机房为国内直连或者CN2等优质线路。本月商家全场9折优惠码仍然有效,以KVM架构产品为例,优惠后韩国VPS月付13.5元起,日本东京...