多租户数据中心拥塞控制学习笔记 (二)

作者简介:刘宇欣,福州大学数学与计算机科学学院2015级软件工程研究生 ,研究方向:数据中心的拥塞控制;数据平面可编程。邮箱:562613629@qq.com。

前言

上一节中,我们已经对多租户数据中心拥塞控制有了初步认识,这一节我们主要介绍论文提到的mininet实验,论文在参考文献[20]中提供了vCC project. http://webee.technion.ac.il/~isaac/vcc/. 其中包括了mininet相关实验的两个github库,在库中有相关实验说明,接下来对于详细步骤进行说明。

一、设置mininet工作环境及实验前期准备

可以从http://mininet.org/download/(这是获取Mininet的最简单的方法)下载一个已经安装了Mininet的 VM。 当然,官网其实提供了四种的安装方式,但论文推荐的是根据http://mininet.org/vm-setup-notes/中的建议,下载mininet的VM,如下图所示

下载完成后解压可以看到

我们可以选择不同的虚拟化程序打开,比如vmware workstation、virtualbox和Qemu/KVM等,这里选择使用vmware,这里牵扯到一个磁盘大小的问题,因为我们要进行linux内核的修改编译,至少需要20G以上的磁盘空间,而官方提供的VM只有8G的大小,所以我们需要vmware的扩展磁盘空间功能,通过一些设置,使磁盘大小扩充到30G。而其他虚拟化程序怎么扩展虚拟机的磁盘空间,笔者没有研究,如果能解决这个问题,也可以选择其他虚拟化程序。

(1)vmware虚拟机参数设置
Vmware打开OVF文件后,将虚拟机内存设置为4G,处理器设置为2,核心数也设为2(这是为了之后跑实验快一点,配置稍低也是可以的)。

除此之外,我们还需要利用vmware的扩展磁盘空间功能,将磁盘扩充为30G

(2)git clone 论文提供的github库
虚拟机参数设置完成后,我们就可以打开虚拟机,登陆用户名为:mininet,密码:mininet

登陆后,我们需要git clone 论文提供的github库,所以先需要下载git,命令为

之后创建git文件夹,然后通过git clone命令下载github库,命令如下

如图所示会生成两个文件夹vcc-exp和vcc_linux_vecn,其中vcc-exp为实验相关文件,而vcc_linux_vecn为linux内核修改补丁

二、重现ECN与非ECN不公平性试验

ECN的应用,以及基于显式反馈的拥塞控制算法的实现,使得我们能够在网络拥塞前作出反应,减少发送速率,以避免拥塞,从而达到提高网络性能,但它直到最近才被广泛支持操作系统。 因此,数据中心中的传统客户端可能不支持ECN。不幸的是,缺少ECN支持可能导致这样的传统客户端的性能受损,如下图所示这一点我们在上节已经说明过。

所以论文中设计了一个实验来分析ECN和非ECN流之间的不公平性,接下来我们详细说明步骤:
(1)安装linux3.19内核
因为论文实验室基于linux3.19,所以我们需要安装linux3.19内核,命令如下

然后重新启动,就可以安装新的内核版本,通过uname –r命令可以验证内核版本,修改成功后,才能运行论文中的不公平实验。

(2)运行ECN与非ECN不公平测试
前面的准备工作继续后,我们就可以通过命令,来运行ECN与非ECN不公平测试,这将创建论文中所有不依赖于修改内核的图片。要跑完实验,预计要一个小时以上。

实验跑完后,在figure文件夹下会生成实验中的图,如下所示

(3)安装Secure FX
生成图片后,发现命令行界面无法查看图片,这时候可以使用github上传,或者安装Secure FX访问虚拟机,当然使用这种方法,虚拟机上要安装ssh,命令为

这方面,网上资源很多,就不一一赘述了。完成后就可以在自己的操作系统下查看生成的图,比如4a,基本与论文趋势一致,这样,我们就重现了论文中的不公平性试验。

三、重现需要修改内核的实验

之前我们重新了不需要修改内核就能实现的ECN和非ECN不公平性试验,接下来我们重现需要修改内核的实验,包括论文中提到的两个概念验证试验,虚拟ECN的验证(即虚拟ECN,ECN,非ECN的性能对比)以及相关参数调整对实验结果影响的实验(比如RED参数)。

论文提供的github库对后续实验的说明中提到,“要生成包含概念验证内核的图,请按照https://github.com/brycecr/vcc_linux_vecn.git中的README.md文件中的说明构建修改的内核,您可以在Mininet VM上构建修改的内核,但是必须显着增加其磁盘(和分区)大小(大约20 GB),并且可能需要很长时间才能构建内核”,这也是为什么我们在上文中提到选择vmware扩展磁盘空间,但其对如何增加磁盘空间,以及如果构建修改内核都没有具体说明,笔者也是一步一步查文献,摸着石头过河。那么接下来我们首先来讲增加磁盘空间。

(1)增加磁盘空间
按照上文的做法将虚拟机的磁盘扩充到30G后,我们会发现,虚拟机实际并没有扩充到30G,我们通过df –h命令可以很清楚的看到,而如果磁盘空间不够,造成的后果就是内核在make的时候,出现no space的报错,这都是笔者血的教训。

要增加磁盘空间,就必须要分区,通过

如下图所示,command 输入p 可以看到现在的分区情况

之后,按照下图的提示输入命令,分别输入,n,p,以及三个回车(其中三个空的红框直接按回车就好),最后按W保存,输入sudo reboot 重启

重启后,我们需要格式化新的分区,输入命令


但这时分区还是没有被挂载的,我们需要在根目录下新建一个文件夹,然后把新的分区挂载到这个文件夹上,命令如下

完成后使用命令查看分区情况,命令如下


完成以上步骤后,我们还需要设置开机自动加载分区,需要修改/etc/fstab 分区表文件,命令如下

然后在文件最后加上“/dev/sda3 /cm ext3 defaults 0 0“然后保存,重启即可,如下图所示

细心的人也许现在会发现,新建的sda3分区大小只有999K,这时候不用担心,我们把上面的操作在重复一遍就可以了,即再创建一个/dev/sda4的分区,这样剩下的磁盘空间都会分配给最后一个分区,这里就不多加赘述,最后的结果是下图所示

(2)下载linux 3.19内核文件
Linux内核文件的获取途径有两种,一种是直接使用git clone下载,然后用git reset命令回退3.19版本,另外一种是直接从用可视化操作系统访问github网站,直接下载release的文件,下面我们分别介绍。注意,内核文件要放在我们扩充为22g的/cm文件夹,否则在编译的时候会出现磁盘空间不够的情况。

第一种,命令如下

这样就可以了,当然直接git clone要下载2G左右的文件,考虑到github的网速,会比较慢,嫌慢的可以参考第二种方法,访问https://githu.com/torvalds/linux,直接下载3.19的release,如下图所示。然后用Securt Fx传到虚拟机,这边提醒一个低级失误,别再windows下把压缩文件解压,会报错的,然后make就会发生错误!

(3)打补丁
打补丁这一步大家都应该很清楚了,之前我们git clone了vcc_linux_vecn,其文件夹下有一个vcc319.patch的补丁,将这个补丁复制到你下载的linux内核的文件夹下,然后输入

(4)配置内核
配置内核的方法很多,主要有如下几种:

由于对Linux还处在初学阶段,所以选择了简单的配置内核方法,即make menuconfig。如果ncurse没有安装的话,需要新安装。在终端输入sudo make menuconfig,等待几秒后,终端变成图形化的内核配置界面。我们不需要什么修改直接save然后退出即可

(5)编译内核
只需在终端输入sudo make,然后等待编译的完成,一般需要三个小时。
(6)编译和安装内核模块
输入make modules_install,这步很快能完成。
(7)安装内核
输入make install
(8)相关新内核配置文件的生成以及修改
将新内核文件夹下的

复制到/boot文件夹下
命令为

然后将它们分别重命名为vmlinuz-3.19.0,System.map-3.19.0,config-3.19.0,命令如下

除此之外我们还需要生成initrd.img-3.19.0文件(这一步需要在复制完成后执行,不然会报错,多次执行还会造成根目录硬盘爆满的情况),命令行如下:

完成这些后我们就只需要最后在更新和修改grub文件了,命令行如下

如果打开grub.cfg有提示说,其为只读文件,用命令行强制修改

我们会发现grub更新了3.19的相关设置

这时候我们只需要再修改一个地方,即是,将图片中红框的内容改为图片那样,原来的内容分别为,/boot/vmlinuz-3.19.0-31-generic, /boot/initrd.img-3.19.0-31-generic,注意,图片是修改后的样子。

然后重新虚拟机,我们用uname –r就可以发现内核换成我们修改的3.19.0
(9)完成剩余实验
将一切准备工作完成后,我们就可以完成剩余的实验了,命令行如下

这个过程会比较漫长,笔者的电脑跑了4个半小时左右。

四、结语

到这里为止,我们就完成了论文mininet的实验复现,一路走来,遇到了很多坎坷,特别是扩展磁盘空间,内核编译,通过上网查教程,查阅书籍,但网上的教程和书上的内容都是老旧的,需要自己挖掘需要的东西,尝试不同的方法,所幸,最后都解决了。当然,因为笔者也是linux的初学者,所以可能文中许多问题,在大牛看来很简单,望请谅解!在这里,还是感谢前人的探索与分享,感谢过程中所有提供过帮助的伙伴!最后,还是欢迎交流,特别是数据中心的同袍们,期待!

参考材料

https://github.com/brycecr/vcc_exp

https://github.com/brycecr/vcc_linux_vecn

https://wiki.ubuntu.com/KernelTeam/GitKernelBuild

http://zjuedward.blog.51cto.com/1445231/461376

http://blog.itpub.net/24435147/viewspace-694200/

参考文献
[1] Cronkite-Ratcliff B, Bergman A, Vargaftik S, et al. Virtualized congestion control[C]//Proceedings of the 2016 conference on ACM SIGCOMM 2016 Conference. ACM, 2016: 230-243.


  • 本站原创文章仅代表作者观点,不代表SDNLAB立场。所有原创内容版权均属SDNLAB,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用,转载须注明来自 SDNLAB并附上本文链接。 本站中所有编译类文章仅用于学习和交流目的,编译工作遵照 CC 协议,如果有侵犯到您权益的地方,请及时联系我们。
  • 本文链接https://www.sdnlab.com/18768.html
分享到:
相关文章
条评论

登录后才可以评论

yuxinliu 发表于17-03-27
4