docker 概念
关于docker的基本概念相关,可以参考官网介绍,介绍的挺全面的。
另外这篇文章介绍的也很清晰,并附带有可以直接上手的实例。
关于container和vm的对比,需要重点关注下,直接放图如下:
从图中可以看出两者的区别包括:
- 传统的VM需要依赖hypervisor层来实现,而不同hypervisor实现是和硬件强绑定的;docker对hardware的依赖则很少
- VM内部除了包含app以及依赖的运行库环境,还包括了Guest OS;相比docker,过于重量级,从而导致对host端资源的占用率比较高
- docker中多个container App都是使用Host的kernel,不适用与依赖不同kernel实现的App
- docker提供的swarm模式,可以方便地创建一个docker集群,从而灵活地提供高可用性和故障恢复等特性
研究方案选择
目前dpdk官网提供两种方案来支持container,如下图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-m130RYst-1658817337021)(http://dpdk.org/doc/guides/_images/use_models_for_running_dpdk_in_containers.svg)]
上图(1) 方案中需要NIC支持SR-IOV功能,物理NIC支持的VF个数也依赖于硬件资源;每个container的接口独占VF,多个VF共享下面的一个PF。基于这种方案实现的container,无论对硬件的依赖和绑定,还是container的迁移,支持性都做得不够好。
上图(2) 方案中需要在host中运行vswitch或者vRouter来将上层的containers和底层的物理NIC解耦,只要vswitch(当前比较流行的OVS+DPDK,将OVS放在用户态来实现)的性能足够,一样可以实现高性能的container app了。
技术分析
基于以上比较,本次预研主要选取第二种方案来实现,该方案中container中涉及的组件如下图所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mo51hKpO-1658817337022)(http://dpdk.org/doc/guides/_images/virtio_user_for_container_networking.svg)]
方案中使用virtual device(包括virtio-user和vhost-user backend)来实现高性能的container App 或者IPC。Virtio使用共享内存的方式来收发报文,传统的VM可以通过qemu来共享vhost后端的物理地址,但对container而言,作为系统的一个进程,使用这种方式则比较难。目前的思路是只能使用DPDK初始化的hugepages来进行内存共享。所以,要在container中使用dpdk,必须要分配足够的大页内存,且不同container在使用共享内存时要能够分区使用,避免地址重复。
container + dpdk 实践
拓扑图
dpdk 安装
wget http://fast.dpdk.org/rel/dpdk-17.05.tar.xz
tar -xvf dpdk-17.05.tar.xz
cd dpdk-17.05
#设置DPDK库目录位置
echo export RTE_SDK=$(pwd) >>~/.bashrc
#设置DPDK目标环境
#注意!这里的x86_64-native-linuxapp-gcc应替换为实际运行环境
echo export RTE_TARGET=x86_64-native-linuxapp-gcc >> ~/.bashrc
source ~/.bashrc
#配置DPDK,需要使用Vhost-user驱动,需要将CONFIG_RTE_LIBRTE_VHOST=y
vim config/common_base
#安装dpdk
make config T=$RTE_TARGET
make T=$RTE_TARGET -j8
#编译l2fwd
[root@nsfocus dpdk-17.05]# cd examples/l2fwd/
[root@nsfocus l2fwd]# make
hugepage的配置(配置使用1G大小的hugepagesize,同时最多分配8个):
sudo vim /etc/default/grub2.cfg
#找到其中一项为 GRUB_CMDLINE_LINUX_DEFAULT= ,不论后面的引号内包含任何内容,在原本内容之后添加 default_hugepagesz=1GB hugepagesz=1G hugepages=8(这里分配了8个1G的hugepages)
reboot
#查看分配情况
grep Huge /proc/meminfo
#分配成功后进行挂载
mkdir -p /dev/hugepages
mount -t hugetlbfs none /dev/hugepages
mkdir -p /mnt/huge
mount -t hugetlbfs -o pagesize=1G none /mnt/huge
pktgen 安装
pktgen的安装依赖于DPDK,安装前确保RTE_SDK和RTE_TARGET环境变量设置正确。
#安装依赖
yum install -y libpcap.x86_64
wget http://www.dpdk.