Libvirt-Qemu-Kvm 操作手记

(持续更新~)

本文主要用于记录在操作libvirt + qemu + kvm过程中遇到的问题及原因分析。

Hugepage

让qemu使用大页可以减少tdp的size,一定程度上可以提高性能;使用大页可以用memfd或者file backend。

memfd

操作步骤如下:

  1. 在系统中reserve大页;命令参考http://t.csdnimg.cn/PPetb,例如:

    cpp 复制代码
    echo 16 > /sys/kernel/mm/hugepages/hugepages-1048576kB/nr_hugepages
  2. 重新挂载/dev/hugepages,使其pagesize为1g,

    cpp 复制代码
    mount -o remount,pagesize=1g /dev/hugepages
  3. 重启libvirtd,

    cpp 复制代码
    systemctl restart libvirtd
  4. 修改虚拟机xml文件如下:

    cpp 复制代码
     <memory unit='KiB'>16777216</memory>
      <currentMemory unit='KiB'>16777216</currentMemory>
      <memoryBacking>
        <hugepages/>
        <source type='memfd'/>
        <access mode='shared'/>
      </memoryBacking

启动虚拟机之后,我们会看到memfd文件;

之所以会显示deleted,是memfd创建文件的方式导致的,参考内核代码:

cpp 复制代码
proc_pid_readlink()
  -> do_proc_readlink()
	-> d_path()
	   ---
		if (unlikely(d_unlinked(path->dentry)))
			prepend(&b, " (deleted)", 11);
		else
			prepend(&b, "", 1);
	   ---

static inline int d_unlinked(const struct dentry *dentry)
{
	return d_unhashed(dentry) && !IS_ROOT(dentry);
}

SYSCALL_DEFINE2(memfd_create)
  -> hugetlb_file_setup()
	-> alloc_file_pseudo()
	   ---
		path.dentry = d_alloc_pseudo(mnt->mnt_sb, &this);
		...
		path.mnt = mntget(mnt);
		d_instantiate(path.dentry, inode);
	   ---
其并没有调用d_splice_alias()、d_add()接口,所以是unhashed的

另外,初次测试时,并没有step 2,导致内存分配失败;原因是:libvirt传给qemu的hugetlbszie是2M,而我预留的是1G;追查libvirt代码,原因在于:

cpp 复制代码
virQEMUDriverConfigNew()
---
    /* For privileged driver, try and find hugetlbfs mounts automatically.
     * Non-privileged driver requires admin to create a dir for the
     * user, chown it, and then let user configure it manually. */
    if (privileged &&
        virFileFindHugeTLBFS(&cfg->hugetlbfs, &cfg->nhugetlbfs) < 0) {
		...
    }
---

libvirt会参考系统中挂载的hugetlbfs的pagesize,以此作为参考。

相关推荐
skd8999几秒前
酒店总机永不占线解决方案-小蜜蜂多酒店系统配置说明
服务器·信息与通信
机器视觉知识推荐、就业指导5 分钟前
npm 安装/运行报错及解决方案
前端·npm·node.js
BS_Li6 分钟前
【Linux网络编程】应用层自定义协议与序列化
linux·服务器·网络
摇滚侠6 分钟前
12 移动端 WEB 前端 WEB 开发 HTML5 + CSS3 + 移动 WEB
前端·css3·html5
泓博8 分钟前
docker ubuntu源码安装openclaw的常见问题
java·linux·开发语言·ai
ez52fF0k88 分钟前
.NET11云原生CI/CD在云原生应用持续集成与交付安全加固
前端·c#·交互
小此方8 分钟前
Re:Linux系统篇(十一)工具篇 · 三:三分钟学会gcc/g++编译工具&&初步认识动静态库&&重温编译基本原理
linux·运维·服务器·开发工具
YuanDaima20489 分钟前
WSL2 核心中间件部署实战:MySQL、Redis 与 RocketMQ
java·数据库·人工智能·redis·python·mysql·rocketmq
南境十里·墨染春水10 分钟前
线程池学习(一) 理解 进程 线程 协程及上下文切换
java·开发语言·学习
独泪了无痕12 分钟前
pnpm依赖管理:从零开始的实践手册
前端·npm·node.js