当前位置: 首页 > article >正文

Libvirt-Qemu-Kvm 操作手记

(持续更新~)

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

Hugepage

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

memfd

操作步骤如下:

  1. 在系统中reserve大页;命令参考http://t.csdnimg.cn/PPetb,例如:
    echo 16 > /sys/kernel/mm/hugepages/hugepages-1048576kB/nr_hugepages
  2. 重新挂载/dev/hugepages,使其pagesize为1g,
    mount -o remount,pagesize=1g /dev/hugepages
  3. 重启libvirtd,
    systemctl restart libvirtd
  4. 修改虚拟机xml文件如下:
     <memory unit='KiB'>16777216</memory>
      <currentMemory unit='KiB'>16777216</currentMemory>
      <memoryBacking>
        <hugepages/>
        <source type='memfd'/>
        <access mode='shared'/>
      </memoryBacking

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

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

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代码,原因在于:

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,以此作为参考。


http://www.kler.cn/news/133912.html

相关文章:

  • 麒麟信安助力长沙市就业与社保数据服务中心政务系统向自主创新演进
  • 股东入股可用的出资形式主要有哪些
  • 工程化实战 - 前端AST(进阶)
  • 10_6 input输入子系统,流程解析
  • FISCO BCOS 3.0【01】搭建第一个区块链网络
  • 前台页面从数据库中获取下拉框值
  • SpringBoot项目连接linux服务器数据库两种解决方法(linux直接开放端口访问本机通过SSH协议访问,以mysql为例)
  • golang学习笔记——接口interfaces
  • cad提示由于找不到mfc140u.dll,无法继续执行代码怎么修复
  • Visual Studio Code---介绍
  • Android Frgment中onActivityResult无效的问题
  • mysql练习1
  • 多媒体ffmpeg学习教程
  • SDUT OJ《算法分析与设计》贪心算法
  • 23.11.19日总结
  • 【嵌入式 – GD32开发实战指南(ARM版本)】第2部分 外设篇 - 第3章 温度传感器DS18B20
  • 笔记54:门控循环单元 GRU
  • 【Web】Ctfshow SSTI刷题记录1
  • OpenCV快速入门:绘制图形、图像金字塔和感兴趣区域
  • 提升工作效率,打造精细思维——OmniOutliner 5 Pro for Mac
  • ubuntu中用docker部署jenkins,并和码云实现自动化部署
  • flutter TabBar指示器
  • 实在智能携手中国电信翼支付,全球首款Agent智能体亮相2023数字科技生态大会
  • redis问题归纳
  • 八叉树(Octree)和KD树区别?2d tree与3d tree区别?
  • C语言链式栈
  • mac控制台命令小技巧
  • SQLite3 数据库学习(文章链接汇总)
  • 卷积神经网络(VGG-16)海贼王人物识别
  • CSS英文单词强制截断换行