FreeBSD下的内存文件系统( 二 )




虽然从本质上讲,内存文件系统根本不需要缓冲,直接访问就能达到最好的效率,但是很难做到这一点,尤其是由于目前都还是使用内存来模拟一个磁盘设备的情况,内存文件系统事实上还是经过了缓冲 。从这个地方,也可以看出目前使用的内存文件系统的弊病,内存文件系统本身占据了一份内存,磁盘缓冲又会占据一份内存,这样就导致了内存的浪费 。在系统有交换分区存在的条件下,一旦系统内存紧张,该文件系统中的有关数据也会被交换到具体的交换设备上,同样避免不了对磁盘的物理访问,达不到提高性能的目的 。而且一旦包括交换空间在内的所有虚拟内存用光,系统就无法正常提供服务了,从而影响系统的稳定性 。


试图使内存文件系统绕过磁盘缓冲其实并不容易,这是因为在目前的操作系统中,磁盘是非常重要的一部分 。非常重要的虚拟内存概念就是使用磁盘设备作为交换设备模拟内存,而磁盘缓冲而是通过内存来缓冲磁盘数据,虚拟内存、磁盘缓冲就是操作系统内存管理中的最基本元素,如何处理这两个部分,也是影响系统性能的最重要的因素 。文件系统实质上是建立在操作系统的内存管理部分之上的,因此绕过这一部分,需要更困难的内核工作 。


因此,对于高负载的服务器,使用内存文件系统实际上得不偿失,在系统内存很快用光的情况下,操作系统将进行磁盘交换,导致系统性能严重下降,这比起直接使用磁盘文件系统更为糟糕 。事实上,在高负载的服务器环境下,允许系统使用更多的内存来缓冲磁盘数据,更有效的发挥系统的磁盘缓冲能力,在实际使用中更为有效 。



使用MFS


FreeBSD下最基本的内存文件系统为MFS(Memory File System)文件系统,它是直接从虚拟内存中为文件系统申请空间 。虽然它命名为MFS,实质上它还是使用的标准UFS的数据组织格式,仍然有扇区、磁盘块等基本概念,但是为了使用方便,它没有创建可以被直接访问的虚拟磁盘设备 。实际上MFS是一个不完整的虚拟磁盘系统,由于它没有虚拟磁盘设备,因此导致在一些情况下它不能很方便的应用 。


使用MFS需要内核中的”options MFS”支持,这个选项实质上是一个标准选项,在缺省情况下的FreeBSD内核都支持,因此一般不需要重新定制内核 。然后就可以使用mount_mfs来安装内存文件系统,或者在标准mount命令中指定mfs选项 。

# mount_mfs -s 131072 /dev/da0s1b /tmp


执行这个命令之后,mount_mfs就从虚拟内存中申请131072个扇区大小的内存,用来作为MFS文件系统的存储区域,并将该文件系统安装到/tmp目录下 。这里使用/dev/da0s1b作为设备文件参数,这个磁盘分区为一个交换分区,它并不是实际使用的磁盘设备或虚拟磁盘,它的基本目的是用来满足mount_mfs的参数需要 。即使系统中有多个交换设备,这也并不意味着MFS就只会交换到这个指定设备上,虚拟内存按照自己的规则分配物理内存或交换空间 。


当然,使用交换设备作为参数事实上也起到了一些额外的作用,因为对于标准文件系统来讲,必须通过初始化的过程确定文件系统的组织格式,而MFS不需要独立的初始化过程,在mount_mfs操作的时候就同时执行了初始化,因而mount_mfs可以从这个设备文件中读取一些初始化相关的参数信息,例如每个扇区大小等,来初始化MFS文件系统 。通常扇区尺寸为512字节,因此该文件系统总大小为64M 。


这里就可以看出,基本的MFS是不存在虚拟磁盘设备的,mount_mfs直接申请内存并用作文件系统,而在mount命令中使用的设备参数为交换设备而非虚拟磁盘设备 。一些情况下希望操作虚拟磁盘设备,那么使用MFS就不方便了 。

推荐阅读