以技术为主
虚拟化技术KVM
sheepdog源码分析之关键模块介绍(一)
三 15th
1) Worker工作线程模块
该模块是作为sheepdog工作线程模块,存在多个工作线程,默认NR_WORKER_THREAD =64个工作线程;线程的入口函数为worker_routine,同时struct work_queue中pending_list是双向链表,worker_routine从该链表中读取任务,然后执行,接着将执行过的任务放到struct worker_info中finished_list双向链表,然后向main thread发送一个信号,接着调用bs_thread_request_done来执行finished_list中任务的done函数,该函数的作用是发送响应信息。涉及的文件主要是worker.c和Worker.h

| struct work_queue {
int wq_state; // int nr_active; //当前活跃的任务数目 struct list_head pending_list;//待执行的任务列表 struct list_head blocked_list; //没有用处了 }; struct worker_info { struct list_head worker_info_siblings;//链表的连接器,目前只有一个worker_info int nr_threads; //线程个数 pthread_mutex_t finished_lock; // struct list_head finished_list; /* wokers sleep on this and signaled by tgtd */ pthread_cond_t pending_cond; /* locked by tgtd and workers */ pthread_mutex_t pending_lock; /* protected by pending_lock */ struct work_queue q; pthread_mutex_t startup_lock; pthread_t worker_thread[0]; //工作线程的数据结构 }; |
这里需要特殊说明的是,有关任务Worker的属性WORK_SIMPLE和WORK_ORDERED,及有关block相关的函数,在0.2版本中应该是没有用处的,当时我也迷惑一阵。
Sheepdog存在三类的工作任务:
- Request: 所有来自客户端或者其他sheep的请求
- Recovery_work: 数据恢复任务
- Delete_work: 删除vdi的任务
- Cpg_event_work: 该任务作为cpg有关集群管理的任务,例如节点加入和send_message消息发送等,sheep保证当前系统只运行一个cpg_event_work任务,从sys->cpg_event_siblings中是未执行的任务。
sheepdog源码分析之关键数据结构介绍
三 15th
关键数据结构的说明
1.
| struct sd_req {
uint8_t proto_ver; uint8_t opcode; //操作类型 uint16_t flags;// uint32_t epoch; uint32_t id; uint32_t data_length; uint32_t opcode_specific[8]; }; |
struct sd_rsp {
uint8_t proto_ver; uint8_t opcode; uint16_t flags; uint32_t epoch; uint32_t id; uint32_t data_length; uint32_t result; uint32_t opcode_specific[7]; }; |
| 这两个数据结构应该是作为抽象类,可以看出sizeof(struct sd_req) == sizeof(struct sd_rsp),这个是设计者故意为之,因为在发送请求和接收响应时,客户端是使用同一片内存区域; | |
2.
| struct sd_obj_req {
uint8_t proto_ver; uint8_t opcode; uint16_t flags; uint32_t epoch; uint32_t id; uint32_t data_length; uint64_t oid;//object id uint64_t cow_oid; uint32_t copies;//副本个数 uint32_t tgt_epoch; uint64_t offset; }; |
struct sd_obj_rsp {
uint8_t proto_ver; uint8_t opcode; uint16_t flags; uint32_t epoch; uint32_t id; uint32_t data_length; uint32_t result; uint32_t copies; uint32_t pad[6]; }; |
| 对object进行请求及响应,这里需要说明的一点:object在Sheepdog中作为数据存储单元,分为data_object 和vdi_object,分别存储数据和vdi的元数据,即后面提到的sheepdog_inode的内容,分片大小为4M。不知作者为何分这么小的分片? | |
|
struct sd_vdi_req { uint8_t proto_ver; uint8_t opcode; uint16_t flags; uint32_t epoch; uint32_t id; uint32_t data_length; uint64_t vdi_size; //vdi的大小 uint32_t base_vdi_id; uint32_t copies; uint32_t snapid; uint32_t pad[3]; }; |
struct sd_vdi_rsp { uint8_t proto_ver; uint8_t opcode; uint16_t flags; uint32_t epoch; uint32_t id; uint32_t data_length; uint32_t result; uint32_t rsvd; uint32_t vdi_id; uint32_t pad[5]; }; |
|
对vdi进行有关操作的请求和响应 |
|
sheepdog源码学习二之代码目录结构介绍
三 9th
目录结构
include/
- config.h: 定义公共的宏
- bitops.h: 有关的位操作,主要是针对oid的使用情况
- util.h: 公用操作的实现
- list.h: 双向链表的实现,主要是参考linux内核代码的实现
- event.h: epoll异步事件模型
- logger.h: 日志操作
- net.h: socket网络IO
- sheepdog_proto.h: sheepdog中用到的操作类型及数据结构的定义:
- sheep.h: Sheep本身需要的数据结构和操作类型,与sheedog_proto.h为何分开定义暂不清楚
lib/
- logger.c: 有关日志文件的操作的实现
- net.c: 有关socket网络IO的实现
- event.c: 事件模型的有关实现
sheep/
- sheep_priv.h: 定义相关数据结构和声明相关函数
- work.h: 定义工作队列对外提供的数据结构和API
- work.c: 实现工作线程
- sdnet.c: 对网络IO的进一步封装,包括回调函数的定义
- group.c: 利用corosync对组进行管理
- store.c: sheepdog有关数据存储、epoch和日志的操作
- vdi.c: sheepdog中vdi的相关操作
- sheep.c: sheep的main函数入口
collie/
- treeview.h: vdi tree的有关操作
- treeview.c: vdi tree的实现
- collie.c: 对sheep进行管理实现
sheepdog源码学习笔记一
三 4th
最近这两天一直在看sheepdog的源码,有关sheepdog的用法,请参考我的另一篇博客:KVM分布式共享存储解决方案-sheepdog 总的来说,sheepdog的代码量不是很大,在一万行左右,比起其他的分布式文件系统如kfs,ceph等还是比较轻量级的,而且定位也是针对qemu/kvm等volume的解决方案.
sheepdog原理介绍
1. sheepdog是作为虚拟机kvm的volume使用的,是非普通的文件系统,这点和Amazon的EBS(Elastic Block Store)比较类似
2. sheepdog是一种对称(symmetric)的结构,各个节点的地位相同,没有中心节点,没有meta-server,使用Corosync 对物理节点进行管理
3. sheepdog中的对象存储分为两类,其一是One reader One Writer 其二是No writer multiple reader 而且对象是4M大小分片的,使用“一致性哈希”算法来确定对象存储位置,多副本存储
sheepdog的代码结构
./collie/treeview.c ./collie/collie.c ./sheep/vdi.c ./sheep/store.c ./sheep/sdnet.c ./sheep/work.c ./sheep/sheep.c ./sheep/group.c ./lib/logger.c ./lib/event.c ./lib/net.c
sheep目录下是有关sheepdog的大部分逻辑的处理,部署在各个节点上
collie目录是作为管理管理sheep的代码
lib目录下是关于网络、日志和事件等处理模型
…..
今天暂时写到这里……待续
KVM可扩展性测试报告
二 16th
KVM可扩展性测试报告
by yaonli(http://www.yaronspace.cn/blog)
测试设计
对KVM虚拟机可扩展性测试,主要是指随着虚拟机的数量的增加,虚拟机的在CPU利用率、内存使用、磁盘IO和网络IO的性能是否表现良好,最后能够给出在物理机一定硬件条件下,可运行的虚拟机的数目的最佳指标。
在具体的设计方案上,在物理机上分别启动1到16个虚拟机,然后从CPU利用率、磁盘IO和网络IO三个方面进行分析,这里需要说明下没有测试内存使用的情况的原因:针对KVM来说,分配给虚拟机的内存大小是事先指定,加入分配512M内存,则虚拟机的物理内存就是512M内存,分析意义不大;
1, CPU利用率测试上
在测试虚拟机CPU利用率方面,主要是CPU密集型的软件进行测试,计算最终的执行时间;例如内核的编译或者bzip2对大文件进行压缩,都是CPU计算性。本次测试选用bzip2 对1.8G的镜像文件进行压缩,计算最终的执行时间。
| date+%s.%N && bzip2 –9 windows_2003_server.img && date +%s.%N |
2, 磁盘IO测试
测试磁盘IO的话,我选择用的是Bonnie++ 软件,并发地从虚拟机1台到16台的进行测试,执行命令如下:
| ./bonnie++ -d ~/test –s 1000 |
3, 网络IO测试
鉴于如果使用网卡类型如rtl8139或者e1000,效率非常低,所以本次测试网卡类型都是基于virtio网卡类型,然后并发地从物理机到1到16台虚拟机进行并发通信,主要是利用nertperf软件进行测试.
测试环境
物理主机硬件配置
1, 8核Intel(R) Xeon(R) CPU E5410 @ 2.33GHz
2, 16G内存
3, 1.4T硬盘
4, 千兆以太网卡
物理主机的软件配置
1,64Bit CentOS 5.3 2.6.18-128.el5
2,kvm-88
虚拟机分配的硬件配置
1, 单核CPU
2, 512M内存
3, Virtio 网卡
4, qcow2 format 增量镜像
虚拟机的软件配置
1,8.04 ubuntu系统
更多 >
KVM分布式共享存储解决方案-sheepdog
一 10th
介绍
今天在调研分布式文件系统时,非常偶然的机会看到sheepdog ,然后接着又看到KVM这个关键字,让我异常兴奋,这不是我一直在找的KVM镜像存储的分布式存储系统吗,原来KVM/Qemu最近已经开始对其进行了开发,并在Qemu 0.13.0版本后加入了与sheepdog的支持,太佩服国外的开源贡献者。
sheepdog(牧羊犬) 官方网站:http://www.osrg.net/sheepdog/
Sheepdog is a distributed storage system for KVM. It provides highly available block level storage volumes that can be attached to KVM virtual machines. Sheepdog scales to several hundreds nodes, and supports advanced volume management features such as snapshot, cloning, and thin provisioning.
安装步骤
1,环境准备
corosync-1.3.0.tar.gz sheepdog-0.2.0.tar.gz
2,安装corosync
corosync 是linux 集群管理的引擎,具体请参看官网
$ tar -xzvf corosync-1.3.0.tar.gz $ cd corosync-1.3.0 $ ./autogen.sh $ ./configure $ sudo make install
3,qemu 0.13的安装 (略)
4,sheepdog安装
$ tar -xzvf sheepdog-0.2.0.tar.gz $ cd sheepdog-0.2.0 $ ./autogen.sh $ ./configure $ sudo make install
这时可能会出现linux/signalfd.h 这个文件找不到,以及后续会出现signalfd undefined reference 的错误,我的系统是CentOS ,出现了这种错误,出现这种情况的话,我简单的解决方法是对signalfd进行模拟,这点我参考了qemu的有关实现,
具体是在sheep/work.c中加入以下代码:
代码太长,我贴到最后了,请参看附件
5,sheepdog的具体使用
1> 配置/etc/corosync/corosync.conf
mv /etc/corosync/corosync.conf.example /etc/corosync/corosync.conf
同时修改,bindnetaddr字段为自己的ip地址,mcastaddr(怎么修改暂时不清楚,应该是广播的地址,保持默认值即可)
2> 启动corosync
# corosync {注:需要是root账户}
3> 如果是ext3文件系统,需要加入user_xattr
mount -o remount,user_xattr /
4> 启动Sheep
# sheep ~/store_dir <span style="color: #ff6600;">#不能是相对路径,相对路径会出错</span>
# collie cluster format --copies=35> 查看状态
# collie node list
# collie cluster info
# colli vdi list6> 创建镜像
# qemu-img create sheepdog:Alice 256G
# qemu-img convert ~/amd64.raw sheepdog:Bob不过我在Convert时一直提示不成功,error while writing
查找原因:通过查看sheep.log日志文件,可以发现时由于Too Many open files 错误提示,原来是打开太多文件所造成的,因为sheepdog对文件进行4M进行分片的,这样会导致大量的文件打开,而一般的系统进程最多的文件数是1024 所以就这个错误!
解决方法:ulimit -n 4096 {或者更大的值} 这样修改只是在目前会话中有效,需要长久生效,请参看这篇文章
总结
sheepdog作为一个新的项目,感觉还是挺不错的,刚好弥补了开源虚拟化中有关镜像存储的问题,为后续的虚拟机迁移做准备,目前sheepdog暂时还未支持migrate ,不过看它的TODO LIST 下一步已经开始做了,系统能够尽快做出来,下一步主要是看下它的源码,因为很多地方会出现诡异的错误的,还需要解决呀!
KVM虚拟机在物理机间的迁移方法
一 5th
有关虚拟机间的动态迁移,我在虚拟机迁移技术漫谈 对它进行大概的介绍,现在结合今天我自身的实践,来具体解释下迁移的步骤;
1,环境准备
1) 共享存储-NFS: 理论上来说,需要迁移的虚拟机可以不适用共享存储,但是如果不用共享存储的话,在迁移的过程中就需要对镜像进行大量的拷贝,这个是非常耗时的,而且在大量的集群的情况下,基本上镜像都是存放在分布式的共享存储中,一是方便管理,一是为虚拟机的动态迁移做准备,有关NFS的使用和挂载,请参看我的另外一篇文章
CentOS配置NFS服务器的方法
2) 支持kvm迁移的qemu-kvm 和 kvm模块:我用的是最新的qemu-kvm-0.13.0.tar.gz ,而kvm模块,由于我的系统的内核版本过低,用的kvm-88中的kvm-intel.ko kvm.ko模块
2,启动kvm虚拟机
在下面的介绍中使用 源虚拟机是待迁移的虚拟机,目的虚拟机是迁移后的虚拟机
源主机的启动命令如下:
./qemu-system-x86_64 -m 512 -hda /home/yangguang/nfs_mnt/images/debian_lenny_i386_small.qcow2 -net tap -net nic,model=rtl8139 -vnc :1 -monitor stdio
#解释说明:
1, /home/yangguang/nfs_mnt: 代表NFS挂载的目录
2, -monitor stdio 将控制台定向的标准输入输出(这个是虚拟机迁移必须的,因为后续需要在命令行中进行操作)目的虚拟机的启动命令:
./qemu-system-x86_64 -m 512 -hda /home/yangguang/nfs_mnt/images/debian_lenny_i386_small.qcow2 -net tap -net nic,model=rtl8139 -vnc :1 -monitor stdio -incoming tcp:0:8888
#解释说明
1, 启动命令参数必须和源虚拟机的启动参数是一样的,包括网卡类型等
2, -incoming tcp:0:8888 这个是在端口8888接收迁移命令和数据这时在命令行中输入
info status
源虚拟机显示的状态是running
目的虚拟机的显示的状态时paused
更多 >
虚拟机迁移技术漫谈【两篇不错的文章】
十一 4th
虚拟机的迁移技术,为虚拟机的管理提供更方便的支持,可以在不间断服务的情况下,将虚拟机从host A 迁移到 host B!
虚拟机迁移分为三类:
P2V : 物理机到虚拟机的迁移
V2V: 虚拟机到虚拟机的迁移 【这个感觉用户还是最大的】
V2P: 虚拟机到物理机的迁移
这个应该是不错的研究和实践方向。
下面是有关虚拟机的迁移和KVM具体实践的文章,
虚拟机迁移技术漫谈,第 1 部分
KVM 虚拟机在物理主机之间迁移的实现
Linux 虚拟化技术
剖析开源云【转载】
十 14th
这篇文章写得不错~
云计算剖析
本文将从云架构的核心抽象开始讨论(从 Infrastructure as a Service [IaaS]),然后是构建块,最后是高度集成的解决方案。
尽管不是必需的,但虚拟化为构建可动态伸缩的架构提供了一些独特的优势。除可伸缩性外,为了负载均衡,虚拟化还能够在物理服务器间迁移虚拟机(VM)。图 1 中所示的这个虚拟化组件是由一个名为 hypervisor(有时也叫作 虚拟机监视器[VMM])的软件层提供的。这个层提供了同时在一个单一物理机器上执行多个操作系统(及其应用程序)的能力。在这个 hypervisor 上有一个名为 virtual machine 的对象,这个对象封装了操作系统、应用程序及配置。另外,如果需要,还可以在这个 hypervisor 中提供设备仿真或是作为一个 VM 提供设备仿真。最后,考虑到虚拟化的新的动态特性及它所提供的功能,还会需要新的管理模式。这种管理最好在各层内完成,本地管理在服务器上完成,还有更高级别的基础设施管理,以便提供虚拟环境的全面管理。
原文地址
探索 Linux 内核虚拟机[转载]
九 27th
虚拟化 概念很早就已出现。简单来说,虚拟化就是使用某些程序,并使其看起来类似于其他程序的过程。将这个概念应用到计算机系统中可以让不同用户看到不同的单个系 统(例如,一台计算机可以同时运行 Linux 和 Microsoft® Windows®)。这通常称为全虚拟化(full virtualization)。
虚拟化也可以使用更加复杂的格式,其中单个计算机看上去具有多个架构(对于一个用户来说,它是一个标准的 x86 平台;对于另外一个用户来说,它是 IBM Power PC® 平台)。这种虚拟化形式通常被称为 硬件仿真。
最后,更加简单的一种虚拟化是操作系统虚拟化,其中一台计算机可以运行相同类型的多个操作系统。这种虚拟化可以将一个操作系统的多个服务器隔 离开来(这意味着全都必须使用相同类型和版本的操作系统)。
………………….

近期评论