Embedded Virtualization

From Trusted Cloud Group
Jump to: navigation, search

Contents

项目目的

  • 为Xen提供实时虚拟机支持

项目方案

  • 修改Xen虚拟机调度器,使其快速响应实时任务
  • 为实时虚拟机分配薄Hypervisor,使其相对近的接近硬件,减少中断响应时间
  • 相对固定的硬件分配


关键技术

  • RT Guest处于最高优先级
  • 引入事件驱动机制,当RT Guest接收到相对应的事件时,允许抢占当前CPU
  • 引入RT Guest平衡机制,当多个RT Guest运行于同一个物理CPU时候,有可能导致循环抢占而使实时性能下降,故每个物理CPU只允许运行一个RT Guest
  • 在RT Guest中引入VBD,进一步降低RT Guest对Dom0的依赖,从而提高RT Guest的RAS,降低RT Guest的事件等待时间
  • 对其他非RT Guest的影响有待评测


实验平台

  • 硬件环境:
    • DELL VOSTRO 220S
      • CPU: E8044
      • MEM: 3G
      • Disk: 250G + 120G
  • 虚拟机平台:
    • XEN 3.4.1 + 2.6.18 Kernel
    • Dom0 CentOS 5.4
    • DomU CentOS 5.4 & Ubuntu 8.04


RT内核编译

  • Kernel和Patch都可以直接从kernel.org上获取
  • Kernel版本:2.6.26.8
  • RT-Patch版本:2.6.26.8-rt16
  • 内核编译:
    • 进入Kernel 和 Patch所在目录
    • tar xjf linux-XXXX
      • *最好读取所在操作系统/boot目录下的config文件作为make menuconfig阶段的初始config文件*
    • cd linux-XXXX
    • bzcat ../patch-XXXX | patch -p1
    • make menuconfig
      • 在process and XXX这一目录中将High Resolution Time XXX选上,同时将下面的相关的选项选成Real-Time
    • make bzImage CONFIG_PREEMPT_RT=y
    • make modules CONFIG_PREEMPT_RT=y
    • make modules_install
    • mkinitrd /boot/initrd.img-XXXX XXXX
    • 然后跟正常编译新内核一样,启动该内核
  • 进入该内核后,用uname -a查看内核版本

在Grub中修改Xen的调度器

  • kernel中添加 sched=sedf 或者 sched=credit

初始测试

  • RTLinux + Cyclictest
    • Native CentOS 5.4:
[root@localhost ~]# uname -a 
Linux localhost.localdomain 2.6.18-164.el5 #1 SMP Thu Sep 3 03:33:56 EDT 2009 i686 i686 i386 GNU/Linux
[root@localhost ~]# cyclictest -p 80 -t5 -i 10000 -l 10000
WARNING: High resolution timers not available
policy: fifo: loadavg: 0.23 0.35 0.18 3/160 3598          
T: 0 ( 3592) P:80 I:10000 C:  10000 Min:     70 Act:  684 Avg: 1002 Max:    1993
T: 1 ( 3593) P:79 I:10500 C:   9523 Min:     11 Act:  675 Avg: 1006 Max:    1987
T: 2 ( 3594) P:78 I:11000 C:   9091 Min:     59 Act:  682 Avg: 1004 Max:    1982
T: 3 ( 3595) P:77 I:11500 C:   8695 Min:     53 Act:  666 Avg: 1007 Max:    1999
T: 4 ( 3596) P:76 I:12000 C:   8333 Min:     47 Act:  655 Avg: 1004 Max:    1972


    • Native CentOS 5.4 with RT-Patch( kernel-2.6.26.8 + patch-2.6.26.8-rt16):
[root@localhost ~]# uname -a
Linux localhost.localdomain 2.6.26.8-rt16 #1 SMP PREEMPT RT Thu Apr 1 12:47:12 CST 2010 i686 i686 i386 GNU/Linux
[root@localhost ~]# cyclictest -p 80 -t5 -i 10000 -l 10000
policy: fifo: loadavg: 0.38 0.51 0.27 2/206 4434          
T: 0 ( 4426) P:80 I:10000 C:  10000 Min:      8 Act:   18 Avg:   18 Max:      69
T: 1 ( 4427) P:79 I:10500 C:   9523 Min:      8 Act:   11 Avg:   18 Max:      56
T: 2 ( 4428) P:78 I:11000 C:   9091 Min:      8 Act:   21 Avg:   16 Max:      40
T: 3 ( 4429) P:77 I:11500 C:   8695 Min:      8 Act:   10 Avg:   18 Max:      62
T: 4 ( 4430) P:76 I:12000 C:   8333 Min:      9 Act:   21 Avg:   17 Max:      39
    • Dom0 CentOS 5.4 with Xen:
      • 运行一个测试线程并不进行任何操作
[root@localhost ~]# cyclictest -p 80 -t1 -i 10000 -l 10000
WARNING: High resolution timers not available
policy: fifo: loadavg: 0.03 0.27 0.30 4/158 5274          
T: 0 ( 5272) P:80 I:10000 C:  10000 Min:   8533 Act: 8570 Avg: 8567 Max:    8620
      • 运行五个测试线程,数据如下,基本不具备参考性,实际上,当运行一个以上测试线程时,数据便会很大
[root@localhost ~]# uname -a
Linux localhost.localdomain 2.6.18.8-xen #1 SMP Tue Mar 30 15:56:23 CST 2010 i686 i686 i386 GNU/Linux
[root@localhost ~]# cyclictest -p 80 -t5 -i 10000 -l 10000
policy: fifo: loadavg: 1.00 0.76 0.40 5/176 5233
T: 0 ( 5224) P:80 I:10000 C:   6876 Min:  10298 Act:68760288 Avg:34385291 Max:68760288 
T: 1 ( 5225) P:79 I:10500 C:   9822 Min:   5281 Act:34389784 Avg:17199758 Max:34389784 
T: 2 ( 5226) P:78 I:11000 C:  10000 Min:   5272 Act:27521282 Avg:13761572 Max:27521282
T: 3 ( 5227) P:77 I:11500 C:   9565 Min:   5768 Act:27534268 Avg:13769048 Max:27534268
T: 4 ( 5228) P:76 I:12000 C:   9168 Min:   6294 Act:27506293 Avg:13755769 Max:27506293


Some Hints
  • 用mount进行DomU的硬盘映射时,文件貌似不能复制到子目录下,只能在最高级目录
  • Kernel启动时候出现的
insmod: error inserting '/lib/dm-region-hash.ko' : -1 File exists
是因为重复加载了/lib/dm-region-hash.ko
可以解决的,步骤如下
1,解压initrd文件
[root@bogon ~]# cp /boot/initrd-2.6.30.4.img /tmp
[root@bogon ~]# cd /tmp/
[root@bogon tmp]# ls
initrd-2.6.30.4.img
[root@bogon tmp]# mkdir newinitrd
[root@bogon tmp]# cd newinitrd/
[root@bogon newinitrd]# zcat ../initrd-2.6.30.4.img |cpio -i
11537 blocks
释放之后看到如下内容
[root@bogon newinitrd]# ls
bin  dev  etc  init  lib  proc  sbin  sys  sysroot
2,ok,下边就是编辑init,删掉其中重复的四行中的两行
echo "Loading dm-region-hash.ko module"
insmod /lib/dm-region-hash.ko
echo "Loading dm-region-hash.ko module"
insmod /lib/dm-region-hash.ko
3,重新打包initrd
[root@bogon newinitrd]# find .|cpio -c -o > ../initrd
11538 blocks
[root@bogon newinitrd]# cd ..
[root@bogon tmp]# gzip -9 < initrd > initrd.img
[root@bogon tmp]# ls
initrd-2.6.30.4.img      initrd       initrd.img            newinitrd

好了,initrd.img就是重新打包的initrd了,然后把initrd.img拷贝到/boot,更改grub.conf里边的initrd- 2.6.30.4.img为  initrd.img就可以了,
这样“insmod: error inserting '/lib/dm-region-hash.ko' : -1 File exists” 就不会有了


Personal tools
Namespaces
Variants
Actions
Navigation
Upload file
Toolbox