suriv520
2019-07-08 11:25:24 +08:00
✅ 避免预设立场的提问
✅ 避免反问式回答
✅ 关注问题本身与解决问题本身
大家都好好说话。
我想说的是,**无论是否超售,都应该是无法简单地通过 free 来判断的。**
市场上的虚拟化架构,hypervisor 声明了多少内存空间,虚拟机里面就会显示多少内存空间。即使宿主机只有 2G,也可以让 hypervisor 声明出一个 64G 内存的虚拟环境出来。操作系统本身没有可靠途径检测“实际可用”的内存大小(非得要检测的话那就是跑实际的 memtest 了)。只不过当虚拟机操作系统开始申请超过实际剩余的空间时,底层会给出报错罢了。反映到操作系统,就是 mem alloc 被拒绝了同时产生 OOM。
把虚拟机的内存分配请求重新映射到物理内存中也是 hypervisor 的作用之一。
我上面没把各个层说得很具体,是因为这里的“层”实在太多了,比如:
系统通电之后,是内存控制芯片对内存相关信息进行检测(存在欺骗的可能);
系统引导最初,是 BIOS 最先检测内存大小,在检测之前,BIOS 是运行于 ROM 的,并没有 RAM 给它用。所谓的检测,也就是“问一下”内存控制器而已(存在欺骗的可能+1 );
引导之后,BIOS 会做一系列的预留与分配,以便把实模式的真实地址映射为操作系统可用的地址,同时保留一部分供硬件使用的区域(存在欺骗的可能+2 );
操作系统引导之后,一般操作系统内核也会检测内存大小。检测方式为“问一句 BIOS ”(存在欺骗的可能+3 );
执行 free 时,我记得 free 应该是从内核直接读取的内存大小,反映在 shell 中,就是 /proc 里的东西(存在欺骗的可能+4 );
(希望有了解底层原理的人帮忙勘误)
看见了吧。云厂商想超售,有无数种方法让你感觉不出来,根本不用明目张胆地用 512M 内存“骗”你。这么骗,简直就是欺负用户智商低下。
我打这段话是对上面回复的同学们的回复。楼主你还是去问问客服吧。