【虚拟化实战】VM设计之二内存机制

简介:

作者:范军 (Frank Fan) 新浪微博:@frankfan7

虚拟机需要配置多大的内存合适?怎样才能最佳利用主机的物理内存?怎么把握Over-Commitment的度?本文从概念到实战来阐述如何做好虚拟机上内存资源规划。

如何分配内存?

首先我们明确一些概念。

091245469.png

上图分三层,他们分别是是App层,OS层和Hypervisor层。对于物理服务器而言,所有的内存资源都分配给单独的操作系统和上面运行的应用。应用将请求先发送给操作系统,然后操作系统调度物理的内存资源。

我们以下面一个场景为例,来分析内存在各层中是如何分配的。

假设我们先启动ESXi主机,这时Hypervisor加载物理内存,这和任何其他操作系统加载物理内存的原理一样。在这一层Hypervisor加载的内存称作“Machine memory。然后我们在该ESXi主机上创建了虚拟机,并为其设置4G内存(Configured Memory Size,这也称为“Guest Physical Memory”,由于这是Virtual Hardware为该虚拟机所分配的内存。对于操作系统而言,这和物理内存没有区别,就认为自己是完全控制该4G内存的。然后我们启动该VM,上面的OS开始运行。之后运行一个应用,该应用通过系统调用(syscall)向OS发出请求,然后获得内存。这里称作“Virtual Memory

上面说的是内存分配的过程,那么内存是如何释放的呢?

App通过系统调用告诉OS来释放不需要的内存。可OS认为所有设置在虚拟机上的内存都是专门分配给自己的,并不会释放Guest Physical Memory,而是创建一个Free List来记录该内存是可以被重新分配的。而Hypervisor根本无法访问这个Free list。所以根本无法释放物理内存。


 Hypervisor如何释放物理内存?

这下问题来了,根本别指望通过Guest来能释放物理内存。那究竟Hypervisor是怎么释放内存的呢?主要有下面几个技术:

TPS Transparent Page SharingTPS缺省是一直自动运行的。比如一台ESXi主机上运行多个虚拟机,他们的OSApp很类似,必然很多内存页的内容是一样的,Hypervisor就会比较这些页面,在物理内存去除冗余,仅仅保留单个页面的信息。从而减少了物理内存的消耗。

Blooning

在虚拟机上安装的VMtools就包括了ballooningdriver它告诉Hypervisor哪些不活动的内存页面可以被收回。这对虚拟机上应用的性能是没有任何影响的。关于Blooning技术的原理,delxu的博文图解VMware内存机制解释的非常清楚,赞一个。我在此不再赘述。

Compression:缺省是启动的。在启动Swaping之前系统会尝试将虚拟内存页面压缩,如果小于2KB,可以保存在虚拟机的Comression Cache内。

Swapping

如果在TPSblooningCompression都用上了的情况下,仍然有物理内存不足的情况。那么不得已最后一招就是Swapping因为页面交换和Disk进行的,这对应用性能很可能造成大的负面影响。参见Frank Denneman博文Impactof host local VM swap on HA and DRS


内存Over-commitment:

顾名思义,就是说分配出去的内存比实际拥有的内存多。那么Over-commitment是如何衡量的呢?带来的影响是什么?


091247328.png

更多的关于内存的衡量指标参考:

http://www.vmware.com/support/developer/vc-sdk/visdk400pubs/ ReferenceGuide/memory_counters.html


上图很好的解释了在虚拟机这一层常用的一些与内存相关的术语和他们的关系。

这里特别要注意的是Active Memory. 指的是虚拟机中应用经常访问的内存。它并不能等同于这个虚拟机最少需要的内存,可是它可以帮助你判断该虚拟机的内存页面的活动情况,以及在该虚拟机上运行的应用是繁忙还是空闲。


Configured MemoryOvercommitment = Sum of VMs’ configured memory/ Host memoryavailable for VMs

比方说ESXi主机物理内存是16G,运行6VM,每个VMConfigured Memory4G,那么该值是(6*4/16 = 1.5

Active MemoryOvercommitment = (Sum of VMs’ machineactive memory)/host memory available for VMs

ESXi主机物理内存是16G,运行6VM,每个VMConfigured Memory4G,假设每个VMActive Memory2.5G那么该值是6*2.5/16=0.93

Configured MemoryOvercommitment > 1的时候,并不能说明什么问题,也不能推断出应用有性能下降。因为Hypervisor可以利用balloning,TPScompression等方式把物理内存释放。一般来讲,这个值超过1.5甚至更多,可以最大化的利用好物理内存。

Active MemoryOvercommitment 接近1的时候,就需要格外注意了。有可能某些应用已经濒临性能下降的边缘。ESXi主机的物理内存肯能已经不能满足Active Memory的需要了。这时需要把一些VM vMotion到其他有充足内存的主机。


参考:

Vmworldsession 2010 TA7750

VMMemory (vRAM) Sizing Considerations

图解VMware内存机制

Impactof host local VM swap on HA and DRS
















本文转自frankfan751CTO博客,原文链接:http://blog.51cto.com/frankfan/1320702 ,如需转载请自行联系原作者

相关文章
|
2月前
|
存储 监控 算法
Java中的内存管理:理解Garbage Collection机制
本文将深入探讨Java编程语言中的内存管理,着重介绍垃圾回收(Garbage Collection, GC)机制。通过阐述GC的工作原理、常见算法及其在Java中的应用,帮助读者提高程序的性能和稳定性。我们将从基本原理出发,逐步深入到调优实践,为开发者提供一套系统的理解和优化Java应用中内存管理的方法。
|
3月前
|
监控 算法 Java
Java中的内存管理:理解Garbage Collection机制
本文将深入探讨Java编程语言中的内存管理,特别是垃圾回收(Garbage Collection, GC)机制。我们将从基础概念开始,逐步解析垃圾回收的工作原理、不同类型的垃圾回收器以及它们在实际项目中的应用。通过实际案例,读者将能更好地理解Java应用的性能调优技巧及最佳实践。
103 0
|
25天前
|
存储 缓存 监控
Docker容器性能调优的关键技巧,涵盖CPU、内存、网络及磁盘I/O的优化策略,结合实战案例,旨在帮助读者有效提升Docker容器的性能与稳定性。
本文介绍了Docker容器性能调优的关键技巧,涵盖CPU、内存、网络及磁盘I/O的优化策略,结合实战案例,旨在帮助读者有效提升Docker容器的性能与稳定性。
63 7
|
1月前
|
存储 算法 Java
Go语言的内存管理机制
【10月更文挑战第25天】Go语言的内存管理机制
35 2
|
1月前
|
存储 运维 Java
💻Java零基础:深入了解Java内存机制
【10月更文挑战第18天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
35 1
|
2月前
|
存储 监控 算法
JVM调优深度剖析:内存模型、垃圾收集、工具与实战
【10月更文挑战第9天】在Java开发领域,Java虚拟机(JVM)的性能调优是构建高性能、高并发系统不可或缺的一部分。作为一名资深架构师,深入理解JVM的内存模型、垃圾收集机制、调优工具及其实现原理,对于提升系统的整体性能和稳定性至关重要。本文将深入探讨这些内容,并提供针对单机几十万并发系统的JVM调优策略和Java代码示例。
63 2
|
2月前
|
存储 安全 NoSQL
driftingblues9 - 溢出ASLR(内存地址随机化机制)
driftingblues9 - 溢出ASLR(内存地址随机化机制)
44 1
|
3月前
|
消息中间件
共享内存和信号量的配合机制
【9月更文挑战第16天】本文介绍了进程间通过共享内存通信的机制及其同步保护方法。共享内存可让多个进程像访问本地内存一样进行数据交换,但需解决并发读写问题,通常借助信号量实现同步。文章详细描述了共享内存的创建、映射、解除映射等操作,并展示了如何利用信号量保护共享数据,确保其正确访问。此外,还提供了具体代码示例与步骤说明。
|
2月前
|
程序员 编译器 数据处理
【C语言】深度解析:动态内存管理的机制与实践
【C语言】深度解析:动态内存管理的机制与实践
|
4月前
|
NoSQL Java 测试技术
Golang内存分析工具gctrace和pprof实战
文章详细介绍了Golang的两个内存分析工具gctrace和pprof的使用方法,通过实例分析展示了如何通过gctrace跟踪GC的不同阶段耗时与内存量对比,以及如何使用pprof进行内存分析和调优。
118 0
Golang内存分析工具gctrace和pprof实战