分享

swap空间和tmpfs文件系统的使用原理

 野崎君noZakiKu 2017-05-08

                                                                                                  swap空间和tmpfs文件系统的使用原理

首先,swap空间是由磁盘空间转换成虚拟内存空间的,而tmpfs是由虚拟内存空间转换成文件系统使用的。而swap空间是由操作系统和tmpfs文件系统使用,而tmpfs是由用户指定才能使用;默认情况下,系统会把/dev/shm挂载为tmpfs系统,并且默认大小是实际内存大小的一半,这个大小只是一个上限值,并且tmpfs使用的是VM的空间,VM就是虚拟内存,由物理内存和swap组成,如果你的/dev/shm里面没有放任何东西,那么不会占用VM的大小,如果设置tmpfs的大小超过物理内存的一半,而且使用tmpfs的时候也超过了物理内存的一般,那么tmpfs将使用swap空间。使用完毕之后,/dev/shm下面的某些内容被删除了,那么VM的空间也会相应的自动回收,所以tmpfs真正使用的空间大小是由VM管理子系统自动管理的。而swap是由磁盘创建的,里面存放的主要是一些匿名变量,包括堆栈空间,由new和malloc分配的空间,进程和线程被操作系统调度时使用到的某些资源。

swap分区的详细介绍:

Swap,即交换区,除了安装Linux的时候,有多少人关心过它呢?其实,Swap的调整对Linux服务器,特别是Web服务器的性能至关重要。通过调整Swap,有时可以越过系统性能瓶颈,节省系统升级费用。

  Swap的原理是一个较复杂的问题,需要大量的篇幅来说明。在这里只作简单的介绍,在以后的文章中将和大家详细讨论Swap实现的细节。

  众所周知,现代操作系统都实现了“虚拟内存”这一技术,不但在功能上突破了物理内存的限制,使程序可以操纵大于实际物理内存的空间,更重要的是,“虚拟内存”是隔离每个进程的安全保护网,使每个进程都不受其它程序的干扰。

  Swap 空间的作用可简单描述为:当系统的物理内存不够用的时候,就需要将物理内存中的一部分空间释放出来,以供当前运行的程序使用。那些被释放的空间可能来自一些很长时间没有什么操作的程序,这些被释放的空间被临时保存到Swap空间中,等到那些程序要运行时,再从Swap中恢复保存的数据到内存中。这样,系统总是在物理内存不够时,才进行Swap交换。

  计算机用户会经常遇这种现象。例如,在使用Windows系统时,可以同时运行多个程序,当你切换到一个很长时间没有理会的程序时,会听到硬盘“哗哗”直响。这是因为这个程序的内存被那些频繁运行的程序给“偷走”了,放到了Swap区中。因此,一旦此程序被放置到前端,它就会从Swap区取回自己的数据,将其放进内存,然后接着运行。

  需要说明一点,并不是所有从物理内存中交换出来的数据都会被放到Swap中(如果这样的话,Swap就会不堪重负),有相当一部分数据被直接交换到文件系统。例如,有的程序会打开一些文件,对文件进行读写(其实每个程序都至少要打开一个文件,那就是运行程序本身),当需要将这些程序的内存空间交换出去时,就没有必要将文件部分的数据放到 Swap空间中了,而可以直接将其放到文件里去。如果是读文件操作,那么内存数据被直接释放,不需要交换出来,因为下次需要时,可直接从文件系统恢复;如果是写文件,只需要将变化的数据保存到文件中,以便恢复。但是那些用malloc和new函数生成的对象的数据则不同,它们需要Swap空间,因为它们在文件系统中没有相应的“储备”文件,因此被称作“匿名”(Anonymous)内存数据。这类数据还包括堆栈中的一些状态和变量数据等。所以说,Swap 空间是“匿名”数据的交换空间。

  突破128M Swap限制

  经常看到有些Linux(国内汉化版)安装手册上有这样的说明:Swap空间不能超过128M。为什么会有这种说法?在说明“128M”这个数字的来历之前,先给问题一个回答:现在根本不存在128M的限制!现在的限制是2G!

  Swap 空间是分页的,每一页的大小和内存页的大小一样,方便Swap空间和内存之间的数据交换。旧版本的Linux实现Swap空间时,用Swap空间的第一页作为所有Swap空间页的一个“位映射”(Bit map)。这就是说第一页的每一位,都对应着一页Swap空间。如果这一位是1,表示此页Swap可用;如果是0,表示此页是坏块,不能使用。这么说来,第一个Swap映射位应该是0,因为,第一页Swap是映射页。另外,最后10个映射位也被占用,用来表示Swap的版本(原来的版本是 Swap_space ,现在的版本是swapspace2)。那么,如果说一页的大小为s,这种Swap的实现方法共能管理“8 * ( s - 10 ) - 1”个Swap页。对于i386系统来说s=4096,则空间大小共为133890048,如果认为1 MB=2^20 Byte的话,大小正好为128M。

  之所以这样来实现Swap空间的管理,是要防止Swap空间中有坏块。如果系统检查到Swap中有坏块,则在相应的位映射上标记上0,表示此页不可用。这样在使用Swap时,不至于用到坏块,而使系统产生错误。

  现在的系统设计者认为:

  1.现在硬盘质量很好,坏块很少。

  2.就算有,也不多,只需要将坏块罗列出来,而不需要为每一页建立映射。

  3.如果有很多坏块,就不应该将此硬盘作为Swap空间使用。

  于是,现在的Linux取消了位映射的方法,也就取消了128M的限制。直接用地址访问,限制为2G。

  Swap配置对性能的影响

  分配太多的Swap空间会浪费磁盘空间,而Swap空间太少,则系统会发生错误。

  如果系统的物理内存用光了,系统就会跑得很慢,但仍能运行;如果Swap空间用光了,那么系统就会发生错误。例如,Web服务器能根据不同的请求数量衍生出多个服务进程(或线程),如果Swap空间用完,则服务进程无法启动,通常会出现“application is out of memory”的错误,严重时会造成服务进程的死锁。因此Swap空间的分配是很重要的。

  通常情况下,Swap空间应大于或等于物理内存的大小,最小不应小于64M,通常Swap空间的大小应是物理内存的2-2.5倍。但根据不同的应用,应有不同的配置:如果是小的桌面系统,则只需要较小的Swap空间,而大的服务器系统则视情况不同需要不同大小的Swap空间。特别是数据库服务器和Web服务器,随着访问量的增加,对Swap空间的要求也会增加,具体配置参见各服务器产品的说明。

  另外,Swap分区的数量对性能也有很大的影响。因为Swap交换的操作是磁盘IO 的操作,如果有多个Swap交换区,Swap空间的分配会以轮流的方式操作于所有的Swap,这样会大大均衡IO的负载,加快Swap交换的速度。如果只有一个交换区,所有的交换操作会使交换区变得很忙,使系统大多数时间处于等待状态,效率很低。用性能监视工具就会发现,此时的CPU并不很忙,而系统却慢。这说明,瓶颈在IO上,依靠提高CPU的速度是解决不了问题的。

  系统性能监视

  Swap空间的分配固然很重要,而系统运行时的性能监控却更加有价值。通过性能监视工具,可以检查系统的各项性能指标,找到系统性能的瓶颈。本文只介绍一下在Solaris下和Swap相关的一些命令和用途。

  最常用的是Vmstat命令(在大多数Unix平台下都有这样一些命令),此命令可以查看大多数性能指标。

  例如:

  # vmstat 3

  procs memory swap io system cpu

  r b w swpd free buff cache si so bi bo in cs us sy id

  0 0 0 0 93880 3304 19372 0 0 10 2 131 10 0 0 99

  0 0 0 0 93880 3304 19372 0 0 0 0 109 8 0 0 100

  0 0 0 0 93880 3304 19372 0 0 0 0 112 6 0 0 100

  …………

  命令说明:

  vmstat 后面的参数指定了性能指标捕获的时间间隔。3表示每三秒钟捕获一次。第一行数据不用看,没有价值,它仅反映开机以来的平均性能。从第二行开始,反映每三秒钟之内的系统性能指标。这些性能指标中和Swap有关的包括以下几项:

  procs下的w

  它表示当前(三秒钟之内)需要释放内存、交换出去的进程数量。

  memory下的swpd

  它表示使用的Swap空间的大小。

  Swap下的si,so

  si表示当前(三秒钟之内)每秒交换回内存(Swap in)的总量,单位为kbytes;so表示当前(三秒钟之内)每秒交换出内存(Swap out)的总量,单位为kbytes。

  以上的指标数量越大,表示系统越忙。这些指标所表现的系统繁忙程度,与系统具体的配置有关。系统管理员应该在平时系统正常运行时,记下这些指标的数值,在系统发生问题的时候,再进行比较,就会很快发现问题,并制定本系统正常运行的标准指标值,以供性能监控使用。

  另外,使用Swapon-s也能简单地查看当前Swap资源的使用情况。例如:

  # swapon -s

  Filename Type Size Used Priority

  /dev/hda9 partition 361420 0 3

  能够方便地看出Swap空间的已用和未用资源的大小。

  应该使Swap负载保持在30%以下,这样才能保证系统的良好性能。

  有关Swap操作的系统命令

  增加Swap空间,分以下几步:

  1)成为超级用户

  $su - root

  2)创建Swap文件

  # dd if=/dev/zero of=swapfile bs=1024 count=65536

  创建一个有连续空间的交换文件。

  3)激活Swap文件

  #/usr/sbin/swapon swapfile

  swapfile指的是上一步创建的交换文件。 4)现在新加的Swap文件已经起作用了,但系统重新启动以后,并不会记住前几步的操作。因此要在/etc/fstab文件中记录文件的名字,和Swap类型,如:

  /path/swapfile none Swap sw,pri=3 0 0

  5)检验Swap文件是否加上

  /usr/sbin/swapon -s

  删除多余的Swap空间。

  1)成为超级用户

  2)使用Swapoff命令收回Swap空间。

  #/usr/sbin/swapoff swapfile

  3)编辑/etc/fstab文件,去掉此Swap文件的实体。

  4)从文件系统中回收此文件。

  #rm swapfile

  5)当然,如果此Swap空间不是一个文件,而是一个分区,则需创建一个新的文件系统,再挂接到原来的文件系统上。

 

tmpfs文件系统的介绍:

 

linux下面VM的大小由RM(Real Memory)和swap组成,RM的大小就是物理内存的大小,而Swap的大小是由你自己决定的。Swap是通过硬盘虚拟出来的内存空间,因此它的读写速度相对RM(Real Memory)要慢许多,我们为什么需要Swap呢?当一个进程申请一定数量的内存时,如内核的vm子系统发现没有足够的RM时,就会把RM里面的一些不常用的数据交换到Swap里面,如果需要重新使用这些数据再把它们从Swap交换到RM里面。 如果你有足够大的物理内存,根本不需要划分Swap分区。

     通过上面的说明,你该知道tmpfs使用的存储空间VM是什么了吧? 前面说过VM由RM+Swap两部分组成,因此tmpfs最大的存储空间可达(The size of RM + The size of Swap)。 但是对于tmpfs本身而言,它并不知道自己使用的空间是RM还是Swap,这一切都是由内核的vm子系统管理的。

怎样使用tmpfs呢?

CODE:
     #mount  -t tmpfs -o size=20m  tmpfs  /mnt/tmp


上面这条命令分配了上限为20m的VM到/mnt/tmp目录下,用df命令查看一下,确实/mnt/tmp挂载点显示的大小是20m,但是tmpfs一个优点就是它的大小是随着实际存储的容量而变化的,换句话说,假如/mnt/tmp目录下什么也没有,tmpfs并不占用VM。上面的参数20m只是告诉内核这个挂载点最大可用的VM为20m,如果不加上这个参数,tmpfs默认的大小是RM的一半,假如你的物理内存是128M,那么tmpfs默认的大小就是64M,


tmpfs有没有缺点呢?

     当然有,由于它的数据是在VM里面,因此断电或者你卸载它之后,数据就会立即丢失,这也许就是它叫tmpfs的原故。不过这其实不能说是缺点。那tmpfs到底有什么用呢?

tmpfs的用途

     由于tmpfs使用的是VM,因此它比硬盘的速度肯定要快,因此我们可以利用这个优点使用它来提升机器的性能。

CODE:
      #mount -t tmpfs  -o size=2m   tmpfs  /tmp


  上面这条命令分配了最大2m的VM给/tmp。    

  由于/tmp目录是放临时文件的地方,因此我们可以使用tmpfs来加快速度,由于没有挂载之前/tmp目录下的文件也许正在被使用,因此挂载之后系统也许有的程序不能正常工作。没有关系,只要在/etc/fstab里面加上下面的语句

CODE:
      tmpfs    /tmp      tmpfs   size=2m    0   0


  重启电脑之后就一切OK了。

 

RAMDISK的介绍:

Linux内存磁盘,虚拟硬盘的使用

由于php没有超级变量,一直想把一些变量,类等放到内存,不用每次请求都重新读取一次提高性能,但一直没找到好的办法

先是想到php的模块 eacclerator,它可以使用系统的共享内存,并且提供函数可以读写,但php的类有个问题就是:实例化以后,类的方法不能被序列化,必须在之前包含,于是用共享内存的方法失败。

再想到用Linux系统带的ram,把它挂载成磁盘不就行了:

首先执行  mkfs.ex2 /dev/ram0

然后挂载 mount /dev/ram0 /ram

这样用时没问题的,但存在几个问题导致了我放弃了这个思路:1,启动的时候不能自动挂载,就是没法通过修改/etc/fstab 加载,因为加载之前需要mkfs。2,文件系统导致内存空间浪费,越先进的fs浪费越多,而内存不需要太先进,因为不考虑数据丢失。3,不论虚拟盘里有没有文件,都会占用这么大的内存,不能动态分配。

经过搜索和实践,终于找到一个好的解决办法,就是使用tmpfs,它是动态管理的,而且可以放在/etc/fstab 启动时候加载,写一行:
tmpfs /var/ram tmpfs size=100M 0 0

表示 挂载到 /var/ram  100M大小。

只要在apache启动前把类文件解压到此虚拟盘就行了,修改php.ini的include_path,这样所有的include不再耗费io时间,速度肯定暴快,而且还能用来保存一些需要快速读取得变量,比如点击统计,也能存成超级变量,不过需要注意的是磁盘空间,如果服务器磁盘够大,就没问题了。


----------------------------------------------------

如何创建任意大小的linux内存虚拟硬盘

您讲的内存盘是英译过来的:即ramdisk,并非虚拟内存大多数的Linux发行版本中,内存盘默认使用的是/dev/shm 路径,文件系统类型为tmpfs 默认大小是内存实际的大小,这很符合实际的操作习惯,操作这个路径就是对内存的操作。我们可以重新设置这个内存盘的大小,或者建立新的内存盘,以加速一些特别的应用,例如squid的缓冲,dns的缓冲文件等等。重设内存盘大小:例如: mount -o remount,size=3G /dev/shm 注意size的大小可以的单位是M\k\G 新建内存盘:例如: mkdir /usr/local/squid/var/cache mount -t tmpfs -o size=3G,mode=0755 tmpfs /usr/local/squid/var/cache 注意重新设置内存盘后为了使用下次启用生效必须写到fstab文件中,一般linux是在/etc/fstab中。


----------------------------------------------------
Linux的RAM disk

在开发中,程序经常需要频繁地读写某些临时文件,遇到这种情况,RAM disk就是最好的解决办法。
简单地说,RAM disk就是将一块内存模拟成为某个磁盘驱动器,对应用程序来说,RAM disk和普通磁盘是完全一样的,也就是说,RAM disk对应用程序是“透明”的——唯一的区别在于,系统重新启动或者关机时,存储在RAM disk上的数据会丢失。

核心版本在2.4以上的Linux内置了对RAM disk的支持,下面,我们就来看看如何使用RAM disk(操作系统为RedHat Linux AS)。

在默认情况下,RedHat会创建16块RAM disk,但不是所有的RAM disk都处于激活(active)状态。下面列出了ram0-ram19一共20块RAM disk,但只有ram0-ram15是可以使用的。


[root]# ls -l /dev/ram*
lrwxrwxrwx    1 root     root            4 Jun 12 00:31 /dev/ram -> ram1
brw-rw----    1 root     disk       1,   0 Jan 30 2003 /dev/ram0
brw-rw----    1 root     disk       1,   1 Jan 30 2003 /dev/ram1
brw-rw----    1 root     disk       1, 10 Jan 30 2003 /dev/ram10
brw-rw----    1 root     disk       1, 11 Jan 30 2003 /dev/ram11
brw-rw----    1 root     disk       1, 12 Jan 30 2003 /dev/ram12
brw-rw----    1 root     disk       1, 13 Jan 30 2003 /dev/ram13
brw-rw----    1 root     disk       1, 14 Jan 30 2003 /dev/ram14
brw-rw----    1 root     disk       1, 15 Jan 30 2003 /dev/ram15
brw-rw----    1 root     disk       1, 16 Jan 30 2003 /dev/ram16
brw-rw----    1 root     disk       1, 17 Jan 30 2003 /dev/ram17
brw-rw----    1 root     disk       1, 18 Jan 30 2003 /dev/ram18
brw-rw----    1 root     disk       1, 19 Jan 30 2003 /dev/ram19
brw-rw----    1 root     disk       1,   2 Jan 30 2003 /dev/ram2
brw-rw----    1 root     disk       1,   3 Jan 30 2003 /dev/ram3
brw-rw----    1 root     disk       1,   4 Jan 30 2003 /dev/ram4
brw-rw----    1 root     disk       1,   5 Jan 30 2003 /dev/ram5
brw-rw----    1 root     disk       1,   6 Jan 30 2003 /dev/ram6
brw-rw----    1 root     disk       1,   7 Jan 30 2003 /dev/ram7
brw-rw----    1 root     disk       1,   8 Jan 30 2003 /dev/ram8
brw-rw----    1 root     disk       1,   9 Jan 30 2003 /dev/ram9
lrwxrwxrwx    1 root     root            4 Jun 12 00:31 /dev/ramdisk -> ram0



要查看RAM disk的大小,可以使用dmesg命令。


[root]# dmesg | grep RAMDISK
RAMDISK driver initialized: 16 RAM disks of 4096K size 1024 blocksize
RAMDISK: Compressed image found at block 0



默认情况下,每个RAM disk的大小都是4MB。

我们可以修改启动配置文件来设置RAM disk的大小,在Redhat Linux上,修改Grub的conf文件:
/etc/grub.conf


# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE: You do not have a /boot partition. This means that
         all kernel and initrd paths are relative to /, eg.
         root (hd0,0)
         kernel /boot/vmlinuz-version ro root=/dev/sda1
         initrd /boot/initrd-version.img
#boot=/dev/sda
default=0
timeout=5
splashimage=(hd0,0)/boot/grub/splash.xpm.gz
hiddenmenu
title Red Hat Enterprise Linux AS (2.6.9-5.ELsmp)
        root (hd0,0)
        kernel /boot/vmlinuz-2.6.9-5.ELsmp ro root=LABEL=/ramdisk_size=16000
        initrd /boot/initrd-2.6.9-5.ELsmp.img



保存之后重新启动,查看一下,改动已经生效:


[root]# dmesg | grep RAMDISK
RAMDISK driver initialized: 16 RAM disks of 16000K size 1024 blocksize
RAMDISK: Compressed image found at block 0



普通的RAM disk并不需要保存日志,所以我们可以将其格式化为ext2格式,并指定-m 0参数,保证RAM disk上所有空间对普通用户开放(不设保留空间)。


[root]# mke2fs -m 0 /dev/ram0
mke2fs 1.32 (09-Nov-2002)
Filesystem label=
OS type: Linux
Block size=1024 (log=0)
Fragment size=1024 (log=0)
4000 inodes, 16000 blocks
0 blocks (0.00%) reserved for the super user
First data block=1
2 block groups
8192 blocks per group, 8192 fragments per group
2000 inodes per group
Superblock backups stored on blocks:
        8193

Writing inode tables: done
Writing superblocks and filesystem accounting information: done

This filesystem will be automatically checked every 22 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.



现在,RAM disk已经格式化完毕,我们只需要将其挂接起来,就可以使用了。


[root]# mkdir /mnt/rd
[root]# mount /dev/ram0 /mnt/rd
[root]# mount | grep ram0
/dev/ram0 on /mnt/rd type ext2 (rw)
[root]# df -h | grep ram0
/dev/ram0              16M   13K   16M   1% /mnt/rd



为了让普通用户可以操作RAM disk,还需要赋予相应的权限。


[root]# chown van:root /mnt/rd
[root]# chmod 0770 /mnt/rd
[root]# ls -ald /mnt/rd
drwxrwx---    2 van     root         4096 Dec 8 11:09 /mnt/rd



如果每次启动都必须使用RAM disk,可以将上面执行的几条语句写成一个.sh脚本,放入启动文件(例如,/etc/rc.local),这样,以后每次启动都可以直接使用RAM disk了。

Trackback: http://tb./TrackBack.aspx?PostId=1024435

 
通过ramdisk设置将内存作为磁盘,加速网络资源访问

A:由于我们的互联网产品中有需要给用户呈现大量的碎小图片,而且访问量非常大,这就非常让我们感到头疼。我因此想过很多办法,用apache的alias来做图片资源的映射?用lighttpd缓存图片?还有传说中nginx,我们也试过。也许是我们配置得不是很好,反正效果看上去区别不大。甚至我们都把图片放到tomcat里面,感觉也没什么差距。但是当产品上线的时候,用户量一上来我们就傻眼了,程序响应到是响应了,就是图出来得很慢。后来无意中发现windows中有个Ramdisk的工具,能把内存作为磁盘的一个分区使用,这下子让我们high了不少,马上把图片放到这个虚拟分区中,试了一把,不错,好使!于是我在想,看看linux有没有这个玩意儿。(不好意思,linux我很不熟)
    Ramdisk,即将内存作为磁盘用。内存的速度之快,是电脑存储设备中仅次于CPU缓存和显示卡显存的,当然比磁盘的IO读写要快很多了;
1、大家可以先通过ls /dev/ram*来查看有多少可供使用的Ramdisk。
2、使用其中一个来创建 mke2fs /dev/ram4,我这选用的是ram4,一般来说总共有16个
执行下来可以看到有一行1024 inodes, 4096 blocks,默认就是4M,这肯定不够的
3、 设置虚拟磁盘的大小,我装的是Red Hat Enterprise Linux Server,所以我在/etc/grub.conf中直接修改
kernel /vmlinuz-2.6.18-8.el5 ro root=/dev/VolGroup00/LogVol00 rhgb quiet ramdisk_size=102400;这样,1G应该差不多了
4、加载ramdisk, mount /dev/ram4 /tmp/your real directory;如果想取消,直接umount /dev/ram4 /tmp/your real directory
5、用df -k /dev/ram4查看你用了多少虚拟磁盘了,如果不是0%或者1%,那就说明生效了
6、我的图片放tomcat下做测试的,所以在server.xml的Host标签中加上
<Context path="/images" docBase="/tmp/ramdisk4/images"/>
最后,自己通过url试一下吧
这个东西我只是抛砖引玉一下,大家如果是用apache或者lighttpd做静态资源的服务器的话,可以按照我这种方式来配置;但是有一点,这个东西当系统reboot以后,就什么都没有了,需要重新设置,所以说用户上传的东西,最好是写个shell来控制一下,及时备份;不过对于我们的生产环境,我们暂时没有把用户上传的路径做虚拟磁盘,没敢去尝试;当linux都reboot了,那就说明我们整个业务都停掉需要做调整,所以无所谓的。

B:搞那么复杂,直接用tmpfs不行么?

A:恩,刚看了一下,tmpfs的方式,是要简单一些,不过都是通过挂载文件系统的方式做的,我想2者应该没什么本质的区别

B:这个,最好前面加squid.
如果图片太多,楼主这种方法就不灵了

A:为什么图片太多就不太好了?squid我没试过,我只知道cdn是这么干的,请问你有没有在生产环境中
使用squid来做加速,或者能否告诉我,图片为什么太多就不好,是文件寻址速度受到影响了吗?如果
是这样的话,那我可以划分多个ram挂载文件系统,我想应该也没问题吧

B:这个用Squid、 NCache、 Varnish 来做确实更适合。

A:mount -t tmpfs tmpfs /tmp/your_dir 
一个命令搞定,而且tmpfs是动态增长,按需分配内存,不仅是“简单一些”而已。
 
--------------------------------

Redhat AS, Ubuntu默认将内存的一半作为ramdisk空间使用(注意这是上限,并不是实际消耗,tmpfs会按需的分配内存)。挂载点为/dev/shm 文件类型为tmpfs

/dev/shm 不完全是RamDisk,若它使用超过电脑一半以上的RAM,就会开始吃SWAP。另外它没用到的部份,会自动释放出来给系统使用

ramdisk作用可以将缓存放到其中,这样延长硬盘寿命,并且提高电脑速度

1,修改ramdisk操作

调整/dev/shm目录的大小
1)查看大小
df -h /dev/shm

 2)修改大小
vi /etc/fstab 
tmpfs /dev/shm tmpfs defaults,size=4096M 0 0

size参数也可以用G作单位:size=1G。

如果没有这行,www.linuxidc.com可以自己加入并修改size大小

3)重新挂载
umount /dev/shm 
mount /dev/shm

4)查看修改后的大小
df -h /dev/shm

2,将/tmp目录设置到RamDisk的方法

基本上只要打以下指令,就能将 /tmp 绑定到 /dev/shm

mkdir /dev/shm/tmp
chmod 1777 /dev/shm/tmp
mount --bind /dev/shm/tmp /tmp

※ 注:为何是用 mount --bind 绑定,而不是 ln -s 软连结,原因是 /tmp 目录,系统不给删除。

 

--------------------------------
 

ln -s vs mount --bind

Hell yes. If you execute the ln -s you create a symbolic link, which is aninode pointing to a certain filesystem object, which is why symlinks can traverse filesystems and hard links cannot: hard links do not have their own inode.

If you mount a filesystem with --bind, you create a second mountpoint for a device or filesystem.

If you envision a symlink as a redirect, then envision a --bind mounted filesystem as creating another gateway to data.

Symlinks and bind mounts are a whole different ballgame.

The --bind mount seems a bit more robust to me and it probably is a bit faster than working with a symlink. On the other hand, there are no serious drawbacks to using the symlink, as the performance hit will be small (if it at all exists).

Edit: I've been thinking about this, and the performance hit might be a bit bigger than I originally thought. If you have an application that reads a lot of different files, then every new file that is opened will require an extra read. Some research here suggests that my assumption is correct, so if you have an IO heavy application running there, consider the --bind option to mount above the symlink solution.

The reason it is not common, is probably the fact that a symlink is visible in anls, whereas a bind mount is only visible when looking at /proc/mounts or /etc/mtab (which is what the mount command does, if it is executed without parameters). Other than that, I don't think there are any issues. I'd be interested if there are, though.

Addition: another issue with ln -s is that for some applications, when the path gets dereferenced, it may cause the application to balk if it "expects" certain items to be in specific places.

---------------

我的理解:

ln -s /ori  /avatar  #软连接,一个inode指向另一个inode, ori 和avatar使用的是不同的inode,读写avatar 相当于读写inode

ln  /ori  /avatar    #硬连接, ori 和avatar使用的是同一个inode, 读写删都是针对同一个文件

mount --bind /ori  /avatar  #绑定,首先/avatar 必须预先创建,这时候设/avatar使用的是A inode, /ori的是B inode. 那么在执行这条命令后,/avatar 会变成B inode, (但是A inode 还存在, umount之后, /avatar 会重新变成A inode), 这时候对/avatar 读写相当于是对B inode读写,但是不能删除/avatar -- 否则会报错:Device or resource busy, 这就达到了上面说的"原因是 /tmp 目录,系统不给删除。" 防止误操作把它给删了。但是这时候你是能够删除/ori, 这就囧了,删除之后就不能对/avatar 进行任何读写操作。。。

 

另外一篇文章的

如果我必须一下子说清楚 tmpfs,我会说 tmpfs 就象虚拟磁盘(ramdisk),但不一样。象虚拟磁盘一样,tmpfs 可以使用您的 RAM,但它也可以使用您的交换分区来存储。而且传统的虚拟磁盘是个块设备,并需要一个mkfs 之类的命令才能真正地使用它,tmpfs 是一个文件系统,而不是块设备;您只是安装它,它就可以使用了。总而言之,这让 tmpfs 成为我有机会遇到的最好的基于 RAM 的文件系统。
让我们来看看 tmpfs 更有趣的一些特性吧。正如我前面提到的一样,tmpfs 既可以使用 RAM, 可以使用交换分区。刚开始这看起来可能有点武断,但请记住 tmpfs 也是我们知道的“虚拟内存文件系统”。而且,您可能也知道,Linux 内核的虚拟内存资源同时来源于您的 RAM 和交换分区。内核中的 VM 子系统将这些资源分配到系统中的其它部分,并负责在后台管理这些资源,通常是透明地将 RAM 页移动到交换分区或从交换分区到 RAM 页。
tmpfs 文件系统需要 VM 子系统的页面来存储文件。tmpfs 自己并不知道这些页面是在交换分区还是在 RAM 中;做这种决定是 VM 子系统的工作。tmpfs 文件系统所知道的就是它正在使用某种形式的虚拟内存。
这里是 tmpfs 文件系统另一个有趣的特性。不同于大多数“标准的”文件系统,如 ext3、ext2、XFS、JFS、ReiserFS 和其它一些系统,tmpfs 并不是存在于一个底层块设备上面。因为 tmpfs 是直接建立在 VM 之上的,您用一个简单的 mount 命令就可以创建 tmpfs 文件系统了。
# mount tmpfs /mnt/tmpfs -t tmpfs 
//by me: 当-t tmpfs , mount第一个参数tmpfs 并不是指的实际设备,而是退回成为一个名字,这里你可以随便起名叫abc都可以, 然后mount 或者 fstab 或者 df -l 看一下第一行对应的是abc, 并不起实际意义. 
执行这个命令之后,一个新的 tmpfs 文件系统就安装在 /mnt/tmpfs,随时可以使用。注意,不需运行 mkfs.tmpfs ;事实上,那是不可能的,因为没有这样的命令存在。在mount 命令执行之后,文件系统立即就被安装并且可以使用了,类型是 tmpfs 。这和 Linux 虚拟磁盘如何使用大相径庭;标准的 Linux 虚拟磁盘是块设备,所以在使用它们之前必须用您选择的文件系统将其格式化。相反,tmpfs 一个文件系统。所以,您可以简单地安装它就可以使用了。

 

 

 

 

 

 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多