当前位置:首页> 正文

电脑虚拟内存释放(linux释放虚拟内存)

电脑虚拟内存释放(linux释放虚拟内存)

1. linux释放虚拟内存

swap查看有很多种方法,一一介绍下:

1.free

free -m

就能看出当前系统所使用的swap了。那么如何查看哪些进程使用了swap呢,这样好针对性的做出优化。

2.top

Centos(6.0之前):

top只能看到swap总使用量

网上很多人说top+f+p能显示出来swap。可是按完f查看的时候,man top里面swap的解释是:

并不是实际的使用swap。而是VIRT-RES得来的。用我蹩脚的英文翻译就是,虚拟内存中所使用过的swap部分

3.Centos(6.0之后):

man top

这样就明显看出是取出的每个进程的swap,能很方便的查看哪些进程使用了swap。从中也能看到一个信息。那就是读取了/proc/#/status

4.vmstat

vmstat -n 1也能查看到

仍旧无法查看到哪些进程使用了。但是能看到si、so

Memory(内存):

swpd: 使用虚拟内存大小

free: 可用内存大小

buff: 用作缓冲的内存大小

cache: 用作缓存的内存大小

Swap:

si: 每秒从交换区写到内存的大小

so: 每秒写入交换区的内存大小

5.shell

在Linux内核 2.6.16中引入了一个系统内存接口特性,这个接口位于/proc/$pid/目录下的smaps文件中 ,一看内容发现是进程内存映像信息,比同一目录下的maps文件更详细些。

cat /proc/1/smaps

这里解释下samps里面的内容:

bfdca000-bfddf000 是该虚拟内存段的开始和结束位置

rw-p 内存段的权限,rw是指可读写,p是指私有,如果是s则为共享

bffea000 该虚拟内存段在对应的映射文件中的偏移量

00:00 文件的主设备和次设备号

0 被映射到虚拟内存的文件的索引节点号

[stack] 被映射到虚拟内存的文件名称

Size 是进程使用内存空间,并不一定实际分配了内存(VSS)

Rss是实际分配的内存(不需要缺页中断就可以使用的)

Shared_Clean 和其他进程共享的未改写页面

Shared_Dirty 和其他进程共享的已改写页面

Private_Clean 未改写的私有页面页面

Private_Dirty 已改写的私有页面页面

Swap 存在于交换分区的数据大小(如果物理内存有限,可能存在一部分在主存一部分在交换分区)

Pss是平摊计算后的使用内存(有些内存会和其他进程共享,例如mmap进来的)

2. linux虚拟机占用内存

是的啊,VMWare本身不占用什么内存,是配置出来的并处于开启状态的那个具体的虚拟机要占用内存,占用多大内存的是看你分配了多少。 使用多少内存作为虚拟机的内存是你创建虚拟机文件时指定的,包括使用磁盘空间大小。

当然如果直接使用推荐配置(如模拟Linux、DOS、Windows98、WindowsXP、Windows Server等环境都有预定义的配置可供选择)则都有一个推荐内存使用大小的。

具体指定时,如果计划将来还用在这些操作系统上安装更多的应用,而内存又富足(保证剩余的内存够当前系统用),则应当适当增大分配给虚拟机的内存。

当然这不意味着这些内存永远会被占用,如果你临时挂起虚拟机(呵呵,这可是真实机器没有的好处)或关闭虚拟机,这这些内存会被马上释放。

3. linux 虚拟内存

4G-10G。

建议虚拟内存最小为物理内存的1到1.5倍。虚拟内存最大为物理内存的2到2.5倍。

1、虚拟内存是计算机系统内存管理的一种技术。它使得应用程序认为它拥有连续的可用的内存(一个连续完整的地址空间),而实际上,它通常是被分隔成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,在需要时进行数据交换。目前,大多数操作系统都使用了虚拟内存,如Windows家族的“虚拟内存”;Linux的“交换空间”等。

2、虚拟内存的具体设置方法为:

①在我的电脑图标上单击右键,选择属性。

②在系统属性窗口中选择高级,在性能区域中单击设置按钮。

④在性能选项中选择高级,在虚拟内存区域中单击更改按钮。

④选择一个比较空闲的分区用来存放虚拟内存的Pagefile.sys文件。

⑤在自定义大小区域中设置虚拟内存的大小为物理内存的1.5倍到3倍

4. 虚拟机释放内存

虚拟机资源涉及多个方面:CPU、内存、网络以及磁盘。在规划虚拟机时应该考虑这些资源之间的关系,否则,分配的资源不合理将导致虚拟机内的应用程序性能表现不佳。 虚拟机每个vCPU只运行在一个物理核心之上,因此CPU频率越高虚拟机的运行速度也就越高,vCPU数量越多有助于提升应用的性能表现。一个比较复杂的因素就是在ESXi服务器内,所有的虚拟机共享使用物理CPU。ESXi服务器的核心数越多,每个vCPU获得的核心份额也就越大,因此多核心的性能表现要强于核心频率高但数量少的情况。

如果虚拟机需要占用大量的CPU时间,那么可以考虑为虚拟机分配第二个vCPU,但是,为虚拟机分配两个以上vCPU并不一定让应用运行的更快,因为只有多线程应用才能有效地使用多个vCPU。 ESXi服务器内RAM资源通常有限,因此在给虚拟机分配RAM时需要格外小心。VMkernel在处理RAM时非常巧妙;允许虚拟机使用ESXi服务器所有的物理内存而且会尽量避免占用物理内存却没有真正使用的情况。

物理内存被完全用完后,VMkernel必须确定哪些虚拟机能够保留物理内存,哪些虚拟机要释放物理内存。这称之为“内存回收”。当虚拟机占用的物理内存被回收后,存在的一个风险就是会对虚拟机的性能造成影响。虚拟机被回收的内存越多,相应的风险也就越大。

最明智的是只为虚拟机分配完成工作所需要的内存。分配额外的内存将会增加回收风险。另一方面,当虚拟机操作系统将未被使用的内存用作磁盘缓存时,将会显著降低对磁盘系统的性能要求,所以这里有一个折衷问题。

对于数据库服务器以及VDI桌面来说,为虚拟机分配更多的内存往往更划算—在一台ESXi服务器上运行更少的虚拟机—而不是购买高性能的磁盘阵列。关键在于针对虚拟机的负载分配足够多内存而且没有浪费。 网络带宽包括两个方面:一是虚拟机和虚拟交换机之间的带宽,二是虚拟交换机与外部网络之间的带宽。如果希望虚拟机获得最大带宽那么应该使用VMXNET3网络适配器,VMXNET3在最小的CPU开销下提供了最好的吞吐量。如果情况允许,所有的虚拟机都应该使用VMXNET3网络适配器。

对于与外部物理网络的连接,一定要确保ESXi主机具备速度最快的物理网卡;10Gb是一个不错的选择,即使物理网卡的数量很少,但10Gb能够允许虚拟机承受突发的网络流量。

请记住,进行大量网络传输的虚拟机,虚拟机以及数据包的传输都会消耗CPU时间。因此,运行在CPU受限的ESXi服务器之上的虚拟机由于CPU无法快速响应请求可能会面临网络吞吐量不高的情况。 磁盘性能往往是无声的性能杀手。虚拟机磁盘性能受阵列磁盘数量、类型以及运行在其上的虚拟机的数量的限制。因为集中地共享存储架构将导致通过同一位置访问所有的虚拟机磁盘,阵列的存储控制器以及磁盘过载情况很容易出现,只剩下虚拟机在等待存储的响应。

虚拟机等待磁盘IO、虚拟机CPU空闲对性能的影响有很大不同。等待IO的虚拟机无法做其他工作,因此高I/O等待时间意味着性能肯定会下降。进行周密的存储设计以避免上述情况的发生至关重要。

合理选择磁盘 提升虚拟机性能

在虚拟化中,hypervisor将工作负载从运行在底层的物理硬件中抽象出来,允许快速分配并共享计算资源,迁移工作负载。尽管hypervisor以及与虚拟化兼容的处理器性能开销很小,但是虚拟化层的存在却对性能有影响。

当磁盘性能对工作负载至关重要时,某些管理员可能会选择以直通模式配置LUN,允许虚拟机的操作系统绕过hypervisor与直接LUN进行通信。例如,Windows服务器虚拟机可能使用直通模式绕过Hyper-V直接访问磁盘,这对SQL Server数据库的性能有些许提升。然而,由于客户操作系统(采用直通模式)以及hypervisor试图同时访问磁盘,那么hypervisor必须被配置为忽略直通LUN。

直通模式存在的问题是其不被某些重要的虚拟化功能比如虚拟机快照或者集群所支持。因此,虚拟机在实际上可能会受益于虚拟化提供的各种功能特性而非采用直通模式所带来的处于边缘地位的性能提升。管理员需要评估虚拟机的需求并确定直通模式的适宜性。

除直通模式外,Hyper-V以及其他hypervisor还提供了其他磁盘存储选项。例如,当.VHD文件被创建时,大小固定的磁盘将分配所有的数据块。一旦被创建,大小固定的磁盘就不能够进行调整了。然而,动态扩展磁盘从一开始创建的就是没有数据块的.VHD文件,当数据写入到.VHD文件中后磁盘空间才会被分配出去。这和精简配置类似,尽管在逻辑上创建了一块磁盘,但实际的磁盘空间只有数据写入时才会被用到。

差分磁盘是一种特殊的动态扩展磁盘类型。其设计思路是父磁盘拥有固定的镜像而且差分磁盘与父磁盘相关联,因此写入到磁盘的数据被存放在差分磁盘而非.VHD文件中。读请求首先检查差分磁盘的.VHD文件,如果没有更改,就会读父.VHD文件。当需要标准化的磁盘镜像而且回滚功能很重要时,差分是一个不错的主意,但是管理员在维护父子磁盘配置时可能会面临挑战。

5. linux增加虚拟内存

Linux 的虚拟内存管理有几个关键概念:

1、每个进程都有独立的虚拟地址空间,进程访问的虚拟地址并不是真正的物理地址;

2、虚拟地址可通过每个进程上的页表(在每个进程的内核虚拟地址空间)与物理地址进行映射,获得真正物理地址;

3、如果虚拟地址对应物理地址不在物理内存中,则产生缺页中断,真正分配物理地址,同时更新进程的页表;如果此时物理内存已耗尽,则根据内存替换算法淘汰部分页面至物理磁盘中。

6. 释放内存 linux

要想检测内存泄漏,就必须对程序中的内存分配和释放情况进行记录,所能够采取的办法就是重载所有形式的operator new 和 operator delete,截获 new operator 和 delete operator 执行过程中的内存操作信息。下面列出的就是重载形式

void* operator new( size_t nSize, char* pszFileName, int nLineNum )

void* operator new[]( size_t nSize, char* pszFileName, int nLineNum )

void operator delete( void *ptr )

void operator delete[]( void *ptr )

我们为 operator new 定义了一个新的版本,除了必须的 size_t nSize 参数外,还增加了文件名和行号,这里的文件名和行号就是这次 new operator 操作符被调用时所在的文件名和行号,这个信息将在发现内存泄漏时输出,以帮助用户定位泄漏具体位置。对于 operator delete,因为无法为之定义新的版本,我们直接覆盖了全局的 operator delete 的两个版本。

在重载的 operator new 函数版本中,我们将调用全局的 operator new 的相应的版本并将相应的 size_t 参数传入,而后,我们将全局 operator new 返回的指针值以及该次分配所在的文件名和行号信息记录下来,这里所采用的数据结构是一个 STL 的 map,以指针值为 key 值。当 operator delete 被调用时,如果调用方式正确的话(调用方式不正确的情况将在后面详细描述),我们就能以传入的指针值在 map 中找到相应的数据项并将之删除,而后调用 free 将指针所指向的内存块释放。当程序退出的时候,map 中的剩余的数据项就是我们企图检测的内存泄漏信息--已经在堆上分配但是尚未释放的分配信息。

以上就是内存检测实现的基本原理,现在还有两个基本问题没有解决:

1)如何取得内存分配代码所在的文件名和行号,并让 new operator 将之传递给我们重载的 operator new。

2)我们何时创建用于存储内存数据的 map 数据结构,如何管理,何时打印内存泄漏信息。

先解决问题1。首先我们可以利用 C 的预编译宏 __FILE__ 和 __LINE__,这两个宏将在编译时在指定位置展开为该文件的文件名和该行的行号。而后我们需要将缺省的全局 new operator 替换为我们自定义的能够传入文件名和行号的版本,我们在子系统头文件 MemRecord.h 中定义:

#define DEBUG_NEW new(__FILE__, __LINE__ )

而后在所有需要使用内存检测的客户程序的所有的 cpp 文件的开头加入

#include "MemRecord.h"

#define new DEBUG_NEW

就可以将客户源文件中的对于全局缺省的 new operator 的调用替换为 new (__FILE__,__LINE__) 调用,而该形式的new operator将调用我们的operator new (size_t nSize, char* pszFileName, int nLineNum),其中 nSize 是由 new operator 计算并传入的,而 new 调用点的文件名和行号是由我们自定义版本的 new operator 传入的。我们建议在所有用户自己的源代码文件中都加入上述宏,如果有的文件中使用内存检测子系统而有的没有,则子系统将可能因无法监控整个系统而输出一些泄漏警告。

再说第二个问题。我们用于管理客户信息的这个 map 必须在客户程序第一次调用 new operator 或者 delete operator 之前被创建,而且在最后一个 new operator 和 delete operator 调用之后进行泄漏信息的打印,也就是说它需要先于客户程序而出生,而在客户程序退出之后进行分析。能够包容客户程序生命周期的确有一人--全局对象(appMemory)。我们可以设计一个类来封装这个 map 以及这对它的插入删除操作,然后构造这个类的一个全局对象(appMemory),在全局对象(appMemory)的构造函数中创建并初始化这个数据结构,而在其析构函数中对数据结构中剩余数据进行分析和输出。Operator new 中将调用这个全局对象(appMemory)的 insert 接口将指针、文件名、行号、内存块大小等信息以指针值为 key 记录到 map 中,在 operator delete 中调用 erase 接口将对应指针值的 map 中的数据项删除,注意不要忘了对 map 的访问需要进行互斥同步,因为同一时间可能会有多个线程进行堆上的内存操作。

好啦,内存检测的基本功能已经具备了。但是不要忘了,我们为了检测内存泄漏,在全局的 operator new 增加了一层间接性,同时为了保证对数据结构的安全访问增加了互斥,这些都会降低程序运行的效率。因此我们需要让用户能够方便的 enable 和 disable 这个内存检测功能,毕竟内存泄漏的检测应该在程序的调试和测试阶段完成。我们可以使用条件编译的特性,在用户被检测文件中使用如下宏定义:

#include "MemRecord.h"

#if defined( MEM_DEBUG )

#define new DEBUG_NEW

#endif

当用户需要使用内存检测时,可以使用如下命令对被检测文件进行编译

g++ -c -DMEM_DEBUG xxxxxx.cpp

就可以 enable 内存检测功能,而用户程序正式发布时,可以去掉 -DMEM_DEBUG 编译开关来 disable 内存检测功能,消除内存检测带来的效率影响。

7. linux 释放内存

申请内存:

void *kmalloc(size_t size, int flags)

kmalloc函数和malloc函数相似,它有两个参数,一个参数是size,即申请内存块的大小,这个参数比较简单,就像malloc中的参数一样。第二个参数是一个标志,在里面可以指定优先权之类的信息。在Linux中,有以下的一些优先权:

GFP_KERNEL,它的意思是该内存分配是由运行在内核模式的进程调用的,即当内存低于min_free_pages的时候可以让该进程进入睡眠;

GFP_ATOMIC,原子性的内存分配允许在实际内存低于min_free_pages时继续分配内存给进程。

GFP_DMA:此标志位需要和GFP_KERNEL、GFP_ATOMIC等一起使用,用来申请用于直接内存访问的内存页。

释放:

Kfree(const void *objp) const void *objp=为需要释放的内存空间指针

8. linux虚拟内存命令

物理内存(RAM)指的是RAM(即内存条)提供的临时数据存储空间交换区指Unix/Linux系统前台与后台之间数据交换的场所,即为Unix/Linux系统的虚拟内存虚拟内存泛指将临时数据存储于磁盘存储器上的技术(简单点说就是划出一部分磁盘作为临时的RAM),Windows系统的“虚拟内存”,Linux系统的“交换区”都是虚拟内存

9. 深入理解linux虚拟内存

默认虚拟内存是设置在C盘的,由于C盘本来空间比较小,而且安装软件越来越多的情况下C盘空间就不够用了,所以很多人就想把虚拟内存设置到D盘或者C盘以外的盘,这要怎么设置呢?虽然不同的操作系统设置的方法有所不同,但设置方法都是大同小异

下面我们以Win7系统为例

第一步:右击桌面“计算机”--》点击“属性”

第二步:在弹出的系统窗口中点击左上角的“高级系统设置”

第三步:在弹出的系统属性窗口中点击“高级”--》“设置”

第四步:在弹出的性能选项窗口中点击“高级”--》“更改”

第五步:在弹出的虚拟内存窗口中点击取消“自动管理所有驱动器的分页大小(A)”前面的勾选。

第六步:我们需要把保存在C盘的虚拟内存设置为空,默认是选中C盘的,我们直接点击“无分页文件”---》“设置”。

点击设置后会弹出一个提示窗口“如果禁用分页文件或将初始大小设置为少于 200 MB 并且发生了系统错误,windows 可能不会记录可能有助于标识问题的详细信息。确实要继续吗?”,我们直接点击“是”。

第七步:我们需要把虚拟内存设置到D盘,这样我们选中D盘,然后点击自定义大小,初始大小(MB):填入数字4000,最大值(MB)填入数字6000,然后点击设置。

然后依次点击确定,这们我们就成功把虚拟内存设置到了D盘。

10. 虚拟内存如何释放

虚拟内存是指大型软件访问内存时候(比如软件调用1Gb,而电脑只有512mb),系统调给软件的一个硬件存储位置,而不是真正的内存,这个位置就叫虚拟内存。这个存储位置的作用是缓存,再去访问内存才是真正的电脑内存;转移虚拟内存是指虚拟内存存放在c盘(也就是存放系统文件的那个磁盘分区)转存到其它磁盘里面去, 如果自身内存较大,大于2GB以上,虚拟内存的设置意义不是很大,如果不是运行大型文件或者大型游戏,基本用不着虚拟内存;所以你若删除它,需要用的时候还是会有,因为系统会自动配一个虚拟内存给自己使用;

11. linux 虚拟内存 物理内存

ram plus虚拟内存是计算机系统内存管理的一种技术。它使得应用程序认为它拥有连续的可用的内存(一个连续完整的地址空间),而实际上,它通常是被分隔成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,在需要时进行数据交换。目前,大多数操作系统都使用了虚拟内存,如Windows家族的“虚拟内存”;Linux的“交换空间”等。

展开全文阅读

相关内容