logo NodeSeekbeta

教程,检查自己的kvm内存有没有被超售

kvm内存超售的方法一般而言就三种。

·
·
·

内存交换(Swap)

当系统内存不够用时,宿主机把部分长时间未操作(读写)的内存交换到磁盘上配置的Swap分区,等相关程序需要运行时再恢复到内存中。
·

说白了,就是宿主机的swap当内存用


·
·
·

气球驱动(Balloon)

通过virtio_balloon驱动实现动态调整Guest与Host的可用内存空间。Balloon的工作原理是在虚拟机中安装一个kmod,KVM宿主机内存不足,会根据virtio_balloon判断哪些内存页面可以被回收,然后virtio_balloon将这些内存占用,返回给宿主机使用。
·

说白了,就是小鸡的一个间谍virtio_balloon,KVM宿主机内存不足,virtio_balloon kmod会申请占用小鸡空闲的内存。占用的内存就会释放到宿主机。


·
·
·

KSM(Kernel Samepage Merging)

KSM是一种内存合并技术,它可以在KVM中实现内存共享,从而节省内存空间。是Linux kernel的一种内存共享机制,在2.6.32版本引入,用于合并具有相同内容的物理主存页面以减少页面冗余。在Kernel中KSM会定期扫描用户注册的内存区域,当有相同的页面就会将其合并,并用一个添加到页表中的新页面来代替原来的页面。当需要修改时,复制新的内存页,再做修改(将其标记为 copy-on-write)
·

说白了,就是相同小鸡的内存页面有重复,KVM宿主机会把这些内存只存为一份。

·
·


·
·
·

简单介绍一下各个方案的问题,和如何发现内存被超售

·

宿主机加swap当内存,

用这个方法是最蠢的,看一下iowait就能发现。客户长期跑基于内存的应用(memcached),还会导致io爆表(传说中的滥用内存)。基本测试一下内存就能发现。内存读取速度低于1G/s(ddr3 ecc都比这个快)

·


·
·
·

小鸡被加了气球驱动(Balloon)

检查lsmod|grep virtio,看看有没有virtio_balloon。如果有,直接rmmod virtio_balloon

这种方法对性能来说没有明显缺点,就是客户的RAM内存会莫名其妙的少一大截。

·


·
·
·

KSM(Kernel Samepage Merging)合并内存页

这种方法,正常来说是没有什么缺点,但是如果kvm宿主机的内存满了,客户机(小鸡)想要修改时,必须复制新的内存页,再做修改(copy-on-write),但是内存不够,那么会引发 OOM Killer 导致进程 crash。

·

如何检查ksm超售

cd /sys/kernel/mm/ksm

里面有几个文件

run 这个是是否打开的标志 为1时打开,0表示停止,2表示正在强行停止KSM并取消合并所有合并页
pages_shared 共享的物理页数
pages_sharing 正在被共享的物理页数

·

检查
`cat /sys/kernel/mm/ksm/run ``
·
·
·
我好像有一点洁癖,不允许我的内存被超售,(可能是我写软件本来就特别吃内存【内存滥用】),粗略总结了一下,可能有一些不完美。大家可以指正

·


补充,还有一个zram内存的方法。原理就是压缩内存,本质上是用cpu换内存。
zram在小鸡上使用,可以自己超售自己。
在母鸡上使用就可以超售母鸡

1234
  • @斯大林 #0

    感谢您发布此信息! 我刚刚开始了解 KVM,所以本教程很有帮助!
    Thanks for posting this! I am just beginning to learn about KVM, so this tutorial was helpful!

    如果有人感兴趣,这里是我的教程小提纲以及来自 Google Cloud 和 Oracle Cloud 的 KVM VPSes 的快速测试。
    In case anybody is interested, here is my little outline of the tutorial plus quick tests from KVM VPSes at Google Cloud and at Oracle Cloud.

    KVM memory overbooking

      Memory exchange (swap) 
        - host's swap is used as memory
        - high iowait, memcached causes iowait to explode
        - Check: memory i/o speed is lower than 1G/s (ddr3 ecc is faster than this)
      Balloon -- virtio_balloon kmod installed in VM returns VM memory to host
        - no obvious performance disadvantage
        - Check `lsmod | grep virtio`; if yes, `rmmod virtio_balloon`
      KSM -- Kernel Samepage Merging -- beginning with 2.6.32, kernel scans VM memory area
        - no normal disadvantages
        - full host memory triggers OOM kill of rewrite crashes VM page modification
        - Check: `cat /sys/kernel/mm/ksm/run` ; 0 = off, 1 = on, 2 = forcibly stopped 
      ZRAM -- Memory compression on the host
    

    Oracle Cloud (VM.Standard.E2.1.Micro x86_64)

    [opc@instance-20220717-1620 ~]$ date
    Mon Jun 12 01:36:48 GMT 2023
    [opc@instance-20220717-1620 ~]$ swapon
    NAME        TYPE SIZE   USED PRIO
    /.swapfile  file 1.3G 399.5M   -2
    /.swapfile1 file   2G    12K   -3
    [opc@instance-20220717-1620 ~]$ lsmod | grep virtio
    virtio_net             57344  0
    net_failover           20480  1 virtio_net
    virtio_scsi            24576  3
    virtio_pci             20480  0
    virtio_pci_legacy_dev    16384  1 virtio_pci
    virtio_pci_modern_dev    16384  1 virtio_pci
    [opc@instance-20220717-1620 ~]$ cat /sys/kernel/mm/ksm/run
    0
    [opc@instance-20220717-1620 ~]$ 
    

    Google Cloud (e2 micro Intel Haswell)

    root@gc:~# date
    Mon 12 Jun 2023 01:40:48 AM UTC
    root@gc:~# swapon
    root@gc:~# mount | grep swap
    root@gc:~# lsmod | grep virtio
    virtio_balloon         20480  0
    virtio_rng             16384  0
    rng_core               16384  1 virtio_rng
    virtio_scsi            20480  1
    scsi_mod              249856  3 virtio_scsi,sd_mod,sg
    virtio_net             53248  0
    net_failover           20480  1 virtio_net
    virtio_pci             28672  0
    virtio_ring            28672  5 virtio_rng,virtio_balloon,virtio_scsi,virtio_pci,virtio_net
    virtio                 16384  5 virtio_rng,virtio_balloon,virtio_scsi,virtio_pci,virtio_net
    root@gc:~# cat /sys/kernel/mm/ksm/run
    0
    root@gc:~# 
    

    似乎谷歌正在使用 virtio_balloon,但甲骨文没有。
    It seems like Google is using the virtio_balloon, but Oracle is not.

    记得添加第二个交换文件 到 Oracle 实例。 我想我可能也添加了第一个交换文件,但也许第一个交换文件是实例附带的。 也许我在某处有笔记。
    I remember adding the second swap file to the Oracle instance. I think I might have added the first swap file also, but maybe the first swap file came with the instance. Maybe I have notes somewhere.

    再次感谢发布教程!
    Thanks again for posting the tutorial!


    Tom

    1. swap当内存,点名VMOcean.
    2. virtio_balloon共享内存,点名云筏.
    3. 暂时还没碰到过.
  • 学到了,大佬们都很专业

  • 还真的有,在vpshostingservice.co, BuyVM, VirMach的机器上发现了。
    Oracle没有发现。

  • 技术贴 xhj010

  • ding

  • @1号城管 #1 pr?

  • 真用virtio_balloon会不会太明显呢?

  • 绑定

  • 补充一个:
    contabo,使用zram内存压缩技术,内存读写速度会下降,但不会降特别多,所以很多人都觉得还凑合

  • 好帖,增加50鸡腿,先预付精品贴奖励了

1234

你好啊,陌生人!

我的朋友,看起来你是新来的,如果想参与到讨论中,点击下面的按钮!

📈用户数目📈

目前论坛共有15509位seeker

🎉欢迎新用户🎉