admin管理员组

文章数量:1531270

2024年5月31日发(作者:)

内存简介:

在计算机的组成结构中有一个很重要的部分,就是存储器。存储器是用来存储程序和数据的

部件,对于计算机来说,有了存储器才有了记忆功能,才能保证正常工作。存储器的种类很

多,按其功图可分为主存储器和辅助存储器,主存储器又称内存储器(简称内存)。

内存是电脑中的主要部件,它是相对于外存而言的。我们平常使用的操作系统,应用软件等

一般都安装在硬盘等外存上,必须把它们调入内存中才能真正使用这些程序。通常我们把要

永久保存的、大量的数据存储在外存上,而把一些临时的或少量的数据和程序放在内存上。

虚拟内存是什么?

VM:irtual memory,虚拟内存是操作系统对内存管理和调度的一种方法,它把磁盘作为

内存的扩展,使可供使用的内存容量大大增加,通俗的说虚拟内存就是物理内存加磁盘。用

于虚拟内存的磁盘空间,通常叫做交换空间(swap space)。Linux可以使用文件系统中的

普通文件或单独的分区作为交换空间。交换分区更快,交换文件更易于改变大小(无需对硬

盘重新分区)。如果知道要多大交换空间,可以使用交换分区,如果不确定交换空间大小可

以先使用一段时间交换文件,根据交换文件大小来建立恰当的交换分区。

虚拟内存的管理对应用程序是透明的,进程并不知道自己使用的是物理内存还是虚拟内存。

实际上进程使用的页有可能在物理内存中,也有可能在交换空间中。当进程访问的页不在物

理内存中时,内核产生一个缺页中断处理,自动把这部分页从交换空间读入物理内存中,而

当应用程序占用的物理内存长时间没有被访问时,它也会被内核移动到交换空间中去,这个

过程叫做内存的换入和换出。

Linux虚拟内存实现机制:

Linux虚拟内存的实现需要6种机制的支持:地址映射机制、内存分配回收机制、缓存和刷

新机制、请求页机制、交换机制和内存共享机制。

内存管理程序通过映射机制把用户程序的逻辑地址映射到物理地址。当用户程序运行时,如

果发现程序中要用的虚地址没有对应的物理内存,就发出了请求页要求。如果有空闲的内存

可供分配,就请求分配内存(于是用到了内存的分配和回收),并把正在使用的物理页记录在

缓存中(使用了缓存机制)。如果没有足够的内存可供分配,那么就调用交换机制;腾出一部

分内存。另外,在地址映射中要通过TLB(后援存储器)来寻找物理页;交换机制中也要用到

交换缓存,并且把物理页内容交换到交换文件中,也要修改页表来映射文件地址。Linux虚

拟内存实现原理见图1。

物理内存在系统中的主要用途

A内核数据结构占用内存(通常1MB)

B程序运行占用内存

C读缓存cache

D写缓存buffer

除A,B使用掉的内存,剩余的内存都被系统认为是空闲内存,系统会把空闲内存用于C和

D。

Cache并不真正缓存文件,而是块,就是磁盘IO的最小单元(Linux下是1KB)。这样所

有的目录,超级块,其他文件系统记录数据和无文件系统磁盘都可以被缓存。

内存对存储系统性能的影响主要和物理内存多少有关,也就是可以用于cache和buffer

的内存的多少有关。

对于读操作影响:

假设这样一种场景:系统没有内存用于磁盘cache时。我们知道磁盘访问速度和内存相比

是很慢的,如果应用程序频繁读取磁盘数据,会大大降低应用程序的相应速度,如果磁盘出

现性能瓶颈,还会造成应用程序长时间等待磁盘IO。在多进程为主的应用中,等待磁盘IO

会造成大量进程的积压,而进程积压会消耗物理内存,物理内存不够用时,会使用交换空间,

交换空间又要造成磁盘访问,从而造成恶性循环。

如果有大量内存可以用于磁盘缓存的话,就可以减少上面问题的发生,内存越多,能缓存的

数据量就越大,因此大大降低磁盘读IO操作,这是好处之一,另一个好处是提高了应用程

序的相应速度,从而整体上提高了系统的性能。

对于写操作的影响:

内存对写操作的性能影响不如读操作明显,但总归还是有帮助的,因为可以缓冲的内容越

多,意味着可以把一个文件的多次逻辑写操作合并成一次物理磁盘写操作,因此内存充足时

候可以提高磁盘写操作性能。

对于应用程序来说,如果系统满足下面3个条件是最理想的:

A. 总有物理内存可以使用,从不用等待内存缺页处理,永远不需要使用交换空间

B. 所要读取的内容都被cache在物理内存中,不需要实际的磁盘IO

C. 往磁盘写数据时,系统有空闲物理内存用作写缓冲。

满足以上3个条件,并且cpu资源充足,那么应用程序的执行会非常平滑,系统运行也会

非常高效。但如果物理内存不足,系统必然会使用交换内存。比如:A进程执行时暂时休眠,

此时B进程开始运行,假如物理内存用尽,A进程不活跃部分可能被换进交换空间以省出物

理内存给B进程使用,而到A进程再次执行时又需要把数据从交换空间中移动到物理内存

中,这个过程对A和B进程都造成了执行中断和等待,使它们的执行速度变慢,响应度降

低。

因此我们可以得到这样的结论:物理内存充足时,应用程序执行速度更快,响应度更高,

而使用交换空间时,程序执行速度变慢,响应度降低,严重时还会造成大量进程积压。

内存不足对系统整体的影响

物理内存充足,VM系统大多时候主要处理内存分配,回收等处理,而不会有太多虚拟内存

交换,内存缺页异常处理等操作。但当一个运行较为繁忙的系统一旦出现内存不足时,就会

使系统中很多环节受到影响。

首先是磁盘,我们来分析交换空间的处理,交换空间的换入,换出,实际就是磁盘的读/写

操作,系统中出现频繁的内存交换时,一方面降低了程序的执行速度,另一方面会增加磁盘

读写的开销,出现程序访问磁盘和交换空间访问磁盘的资源竞争局面,造成两者之间相互影

响。

其次是CPU,交换空间使用频繁时,系统中的内存缺页处理会增多,这意味着系统的软中

断处理也增多,这些处理都会造成内核使用CPU的开销增大,从而又会出现应用程序使用

CPU和内核使用CPU相互竞争的局面,造成两者相互影响。

另外内存不足还会造成系统负载很高,系统响应迟缓等显现。

虚拟内存调优

虽然通过交换空间可以让系统运行更多的进程,也可以让进程使用更多的内存,但是交换空

间的换入和换出都会造成磁盘IO操作,而磁盘访问速度远低于物理内存访问的速度,使用

频繁的交换空间使用,会造成应用程序响应度低,执行变慢,性能下降,同时也会导致磁盘

出现IO性能瓶颈,所以关于交换空间的优化有以下几个方面:

A .根据磁盘的特点,我们知道磁盘是从外向内以柱面为单位存放数据,且磁盘最外部柱面,

线速度最快,磁头可以覆盖较多扇区,性能最好。所以在分区时,应该考虑将访问频率高度,

对系统性能影响相对较大的分区置于磁盘的靠外部分。同时为了减少磁盘碎片应将内容经常

改变的目录放在单独的分区。从方便备份数据的角度考虑,因为很多备份工具对整个分区进

行备份的效率要高,使用我们应该将Linux系统的几个主要目录作为单独的文件系统,为它

们各自分配一个区。比较推荐的方式如下:之所以有保留空间是为了将来扩展之需。

B 操作系统中可以设定多个交换分区同时使用,如果有多块物理硬盘,在每块磁盘上都划

分一个分区作为交换分区使用,且每个物理磁盘上都划分大小基本相同的交换分区,同样的

优先级,这样内存交换时就可以让多块磁盘并发处理,因此也能提高交换内存的性能。内核

是可以处理任何大小的交换分区,但内部数据结构是4的倍数。保持交换分区同样大小允许

内核优化的将交换空间分布在N个磁盘上。

C 如果有多块磁盘,可以通过RAID方式来提高磁盘性能和可靠性。

D 使用elvtune调谐磁盘IO,在linux内核2.4以后的版本中,可以通过磁盘IO调度操作

来控制磁盘的相应时间和吞吐量。通过调整IO请求在队列中的最大等待时间,可以在响应

时间和吞吐量之间调谐。如果要求较少的响应时间,你们吞吐量将降低,反之,较长的响应

时间则可以得到较大的吞吐量,可以使用工具/sbin/elvtune来改变最大相应时间值。通常

对于读写频繁,但操作数据量小的linux服务器,且对实时性要求高,你们可以将参数调小。

反之,要求具有较大的吞吐量的linux服务器,可以将参数调大,以获得较大吞吐量。

虚拟内存文件系统 tmpfs

有时候我们在内存充足的情况下,仍然不能很好的解决磁盘的性能瓶颈问题,整个时候可以

考虑使用虚拟内存文件系统,也就是tmpfs,前提是读写的内容总量不超出物理内存和交换

内存的总和。

本文标签: 内存交换磁盘物理使用