[qemu][acpi]acpi overflow的分析

前言: qemu启动之后,打出了log: qemu-system-x86_64: Warning: ACPI tables are larger than 64k. qemu-system-x86_64: Warning: migration may not work. qemu-system-x86_64: Warning: please remove CPUs, NUMA nodes, memory slots or PCI bridges. 分析: 1,acpi build 源代码qemu-2.8/hw/i386/acpi-build.c 在acpi_build函数中,

可见,是在acpi的各个table都添加完成后,最后检查的时候,报出来的error。 2,build_dsdt 既然tables_blob->len超过了ACPI_BUILD_TABLE_SIZE (0x20000),那么要么减少tables_blob->len,要么增大ACPI_BUILD_TABLE_SIZE 。考虑到系统的稳定性,acpi table的大小最好不要动,就想办法改小tables_blob->len。 于是,在每次操作tables_blob的地方,加上debug log。

例如在acpi_add_table(table_offsets, tables_blob); 函数后面加上ACPI_BUILD_DPRINTF("%s,%d,%d\n", __FILE__, __LINE__, tables_blob->len); 编译运行后,发现build_dsdt()函数使用了很多内存。 3,build_memory_devices 同理,在build_dsdt()函数中,找到了build_memory_devices使用了大量内存。

分析build_memory_devices函数,可见,对于每一个memory slot都要使用一定的内存,其中每个dev使用了184bytes,每个ifctx使用了10bytes。 那么,(184 + 10) × 256 = 49664。 “ACPI tables are larger than 64k.”这个问题就是这里引起的。 4,memory slot 再来说memory slot。qemu实现了内存热添加能力,其原理就是dimm技术。qemu先alloc一块内存,作为memory device的内存,添加到memory slot上,guest里面通过acpi的事件,得知memory device热添加。 如果guest是linux的话,在/sys/devices/system/memory目录下会增加新的memory目录,选择online为0的,修改为1就能让memory上线。例如,执行echo 1 > /sys/devices/system/memory/memory/memory64/online 执行完命令后,通过free -h或者cat /proc/meminfo就可以看到内存增加了。 那么,减少memory slot会带来什么问题?memory slot代表虚拟机在每次启动之后,可以执行内存热添加的次数。如果每次添加128M,那么256次可以添加32G。如果每次添加512M,添加64次也可以达到32G。少了一些内存热添加的次数,看起来也不是特别大的问题。

原文发布于微信公众号 - AlwaysGeek(gh_d0972b1eeb60)

原文发表时间:2017-11-18

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏xingoo, 一个梦想做发明家的程序员

Tomcat 6 JNDI数据源详解

数据库连接池这个概念应该都不陌生,在Java中连接池也就是数据库的连接池,它是一种采用连接复用的思想避免多次连接造成资源的浪费机制。 最常见的连接池就是DB...

22390
来自专栏开心的学习之路

Jenkins安装与配置(Flask+Gunicorn及React)

结合我们822实验室开源的图像处理平台(http://822lab.top)介绍Jenkins安装与配置(Flask+Gunicorn及React),供后续学弟...

18620
来自专栏技术专栏

centos 部署spring boot应用

18830
来自专栏企鹅号快讯

Spring、Spring MVC、MyBatis 整合文件配置详解

使用SSM框架做了几个小项目了,感觉还不错是时候总结一下了。先总结一下SSM整合的文件配置。其实具体的用法最好还是看官方文档。 Spring:http://sp...

21160
来自专栏C/C++基础

Linux命令(24)——mv命令

mv命令用来为文件或目录改名,或将文件或目录移入其它位置。如果将一个文件移到一个已经存在的目标文件中,则目标文件的内容将被覆盖。

26710
来自专栏耕耘实录

RHEL7、CentOS7的服务管理-系统管理(4)

从RHEL7的官方文档中我们,可以看出在未来service和chkconfig可能会退出历史舞台,现在的发行版中还保留这些命令最主的原因是考虑了兼容性,在使用中...

11530
来自专栏小勇DW3

MySql数据库实现分布式的主从结构

最近学习了关于使用MySql数据的实现主动结构的原理,在以前的并发访问低的场景一下,一般一台性能高的服务器作为一个MySql数据,就可以满足业务的增删改查场景,...

16850
来自专栏云计算教程系列

如何在Ubuntu 18.04上安装Java

Java和JVM(Java的虚拟机)是许多软件所必需的,包括Tomcat,Jetty,Glassfish,Cassandra和Jenkins。

2.2K20
来自专栏帅小子的日常

sso系统使用

42280
来自专栏FreeBuf

weblogic安全配置二三事

*本文原创作者:shewey,本文属FreeBuf原创奖励计划,未经许可禁止转载 1、引言 前段时间Java的反序列化漏洞吵得沸沸扬扬,因工作原因需要对webl...

47550

扫码关注云+社区

领取腾讯云代金券