让 Xen dom0 得到足够 CPU 处理 IO

默认情况下 Xen 使用的是 Credit-Based CPU Scheduler,一种基于权重的 CPU 调度算法。简单的说就是给每个虚拟机的 CPU 一个权重,权重多的得到和使用物理 CPU 的时间就会多,如果虚拟机1的 CPU(VCPU 1.0)权重是256,虚拟机2(VCPU 2.0)的权重是512,那么虚拟机2的 VCPU 2.0 得到物理 CPU 的使用时间就是虚拟机1的2倍。

Xen 给每个虚拟机(包括 dom0 和 domU)分配的默认权重都是 256,也就是说 Xen 上运行的所有 guest 操作系统,dom0 和 众多 domU 都是均分和共享 CPU 的,他们能得到 CPU 的时间和机会都是一样的。这看上去对虚拟机用户(domU)来说很公平,但这种大锅饭的方法对 dom0 来说可不合适,dom0 承担着艰巨的任务,要处理来自其他 domU 的 IO 请求,如果都平均享用 CPU 的话就会造成 dom0 常常因得不到足够的 CPU 时间而不能及时处理自己或来自 domU 的 IO,所以在各虚拟机 IO 负载重的情况下我们需要修改 dom0 的权重,以便它能及时处理 IO. IO 这个问题很重要,一旦 IO 处理不及时,所有虚拟机的 IO 都会等待,将会影响所有虚拟机用户。这也是为什么我们不提供 64MB VPS 的一个原因,64MB VPS 用户会明显感到内存不足,系统会大量频繁 swapping,大量 disk IO 请求会影响服务器整体性能和所有其他用户。可以在这篇:64MB 的 VPS 能支持多少访问量?看到 128MB 的 swap 就用了 75MB.

查看当前 dom0 的 CPU 权重:

# xm sched-credit -d Domain-0
{'cap': 0, 'weight': 256}

修改 dom0 的 CPU 权重:

# xm sched-credit -d Domain-0 -w 512

# xm sched-credit -d Domain-0
{'cap': 0, 'weight': 512}

评论 (7 Comments)

  1. 这篇文章可能帮了我的大忙,博主对xen研究挺深的,佩服佩服

  2. 呜呼,测试了一下,现象依旧。

    这个问题困扰了我一年多了,在这里请教一下,如果感兴趣可以加我的msn详细请教一下:lxm_xml at hotmail dot com 。我们的服务器是pc server做存储服务器,有12个1T的硬盘,上面跑了几个domU,其中一个domU的io负荷比较重,这个domU上面每隔几十分钟就会出现一次hung住的情况,大约几十秒后恢复正常,随机出现。下面为vmstat 10的输出,wa等于100的时候就hung住了。不知道怎么往下定位这个问题。

    procs ———–memory———- —swap– —–io—- -system– —–cpu——
    r b swpd free buff cache si so bi bo in cs us sy id wa st
    1 0 0 145892 333564 7416516 0 0 5150 46 2237 759 0 0 92 8 0
    0 0 0 137524 334136 7424264 0 0 4714 12 2361 801 0 0 90 9 0
    0 0 0 140808 334252 7421288 0 0 4937 14 2161 778 0 0 94 5 0
    0 0 0 139888 334224 7423136 0 0 3209 22 1884 721 0 0 92 7 0
    0 1 0 155724 334264 7408536 0 0 3151 24 1883 758 0 0 91 9 0
    0 0 0 142504 334676 7419304 0 0 3163 62 1901 835 6 0 87 7 0
    0 0 0 145072 335272 7417408 0 0 2960 16 1776 727 0 0 86 14 0
    0 2 0 138680 335664 7423776 0 0 3363 27 1886 800 0 0 93 7 0
    0 0 0 136376 335840 7427760 0 0 3957 43 2055 878 0 0 89 11 0
    0 0 0 142336 335840 7418140 0 0 3227 16 2104 917 0 0 93 6 0
    0 9 0 138156 335068 7423332 0 0 5709 2 2742 991 0 0 63 36 0
    0 16 0 139280 334568 7422792 0 0 3008 0 2069 659 0 0 13 86 0
    0 24 0 155420 334524 7408536 0 0 1380 0 1513 515 0 0 0 100 0
    0 26 0 151708 334556 7413704 0 0 626 0 1256 255 0 0 0 100 0
    0 26 0 151584 334556 7413704 0 0 0 0 808 75 0 0 0 100 0
    0 26 0 151492 334556 7413704 0 0 0 0 652 79 0 0 0 100 0
    0 26 0 151112 334556 7413704 0 0 0 0 514 75 0 0 0 100 0
    0 28 0 149584 334556 7413704 0 0 0 0 390 80 0 0 0 100 0
    14 15 0 149648 335388 7413132 0 0 5010 42 680 283 1 1 1 97 0
    0 0 0 136240 336468 7424272 0 0 12363 64 3324 1870 15 4 73 9 0
    0 0 0 136220 336644 7427476 0 0 3692 13 2039 846 0 0 92 7 0
    0 0 0 139760 336168 7423532 0 0 4909 11 1945 761 0 0 94 6 0
    0 0 0 142528 335368 7422252 0 0 6755 14 2166 828 0 0 87 12 0
    0 0 0 139128 335444 7425296 0 0 5416 89 2332 810 5 1 84 10 0
    0 0 0 143756 335376 7419904 0 0 5325 11 2389 758 0 0 96 3 0

  3. 求教个问题啊,在多核的环境中,虚拟机单核,如果有空闲的核,这样还需要提高dom0优先级了么?如果多个虚拟机占满了所有的物理核,每个虚拟机都在做大量IO访问,此时需要提高dom0优先级么?

  4. @wyhao31
    可以分配1个核给 dom0 专用。每个虚拟机都做大量 io 不用提高每个 domu 的优先级(每个都提高相对来说就是每个都没提高),不用理会 dom0.

  5. 请教个问题,如果在grub.conf里指定Dom0 的CPU参数
    dom0_max_vcpus=2 dom0_vcpus_pin

    会不会dom0 就固定使用0-1 vcpu ,而不存在和其它domU 共用大锅饭?

  6. @xmn100
    嗯,可以。保险起见,还可以用 xm vcpu-pin 把每个虚拟机所要用的 CPU 固定住。

  7. 我固定了dom0的VPU,但在CPU分配大于物理CPU(开了VT,算上虚拟CPU)分配的情况下,有时用xm vcpu-list 查看,还是存在着其它的domU跟dom0共享cpu的情况,这是为什么

发表评论