广告
返回顶部
首页 > 资讯 > 后端开发 > Python >特种文件系统(3)
  • 744
分享到

特种文件系统(3)

文件系统特种 2023-01-31 02:01:09 744人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

9.3 tmpfs前几天闲来无事翻微薄,有人写道:“曾经偷情被游街,如今二奶喊干爹;曾经撞人忙救人,如今撞人再杀人;曾经私情偷着干,如今淫乱存U盘;曾经献血为扶伤,如今慈善越重洋;曾经相好牵肚肠,如今小三炫富忙;曾经摩托都挺酷,如今地铁都追

9.3 tmpfs

前几天闲来无事翻微薄,有人写道:“曾经偷情被游街,如今二奶喊干爹;曾经撞人忙救人,如今撞人再杀人;曾经私情偷着干,如今淫乱存U盘;曾经献血为扶伤,如今慈善越重洋;曾经相好牵肚肠,如今小三炫富忙;曾经摩托都挺酷,如今地铁都追尾;曾经县长做皮卡,如今少年开宝马;曾经精英成右派,如今牛逼全二代。”不禁感慨万千,这世道真是变了。

曾经内存比金子都贵,现在已经白菜价了。有时候我们在设计系统时,如果磁盘已经忙不过来了,完全可以让内存帮帮忙。不但不会有什么损失,整体执行效率几乎会有一个数量级的提升。tmpfs就是让你这么干的一个好帮手。

9.3.1 背景

在开始展开对tmpfs的论述之前,先要介绍一下RamDisk。

RamDisk是将一部分固定大小的内存当作分区来使用。相对于传统的硬盘文件访问来说,这可以极大的提高在其上进行的文件访问速度。这是一种非常古老的技术,最早可以追溯到上个世纪80年代初,我们耳熟能详的MS-DOS在其2.0版本就加入了对RamDisk的支持。自然,这么先进的linux也会不甘寂寞的,这种技术是直接编译进内核的。

对于RamDisk的读写与读写普通磁盘分区,从本质上说是没有任何区别的。不过需要注意的是:RamDisk中的数据是保存在物理内存中的,即便较为先进的实现可以将不常使用的数据交换出去,但也是要占很大一部分内存空间的。而且一旦系统断电,RamDisk中的任何数据都会随之灰飞烟灭。

不过内存与硬盘在速度的上的较量是不言而喻的,稍微懂点计算机技术的人都清楚这个问题。只要合理的利用RamDisk时可以得到很大的速度提升的。比如使用RamDisk来做WEB缓存可以极大的提高页面加载速度。

但是随着需求的不断增加以及人们在不知足中的不断探索中,RamDisk的缺点越来越明显。典型的就是非常浪费物理内存空间。因为只要你设定的RamDisk有多大,那么它就要占用多大的物理内存,即便你一个字节都没用。所有RamDisk都需要进行格式化,如果你选择了一个错误的文件系统,还会造成一定的内存浪费。虽然内存已经不是粒粒如金,但是怎么也得跟大白菜一个价,而硬盘还远不如大白菜值钱呢。必须得改进,应该更高效的利用内存,不能死扣书本,什么时间换空间,空间换时间,这玩意就快要跟封建迷信没什么区别了。一个好的算法,空间性能和时间性能都很好。

另外,在不断的生产实践中,人们发现,大量的临时文件其实很影响程序的性能。于是开始有人把程序产生的临时文件放入RamDisk来提高整体性能。其实还是拿Web服务器说,大量的缓存文件就可以看作是一种临时文件。因为临时文件有一个特性就是它是临时的,即便丢了,也无大碍。

鉴于上述的一些需求,终于在Linux 2.4内核中,引入了一个全新的文件系统——tmpfs,来满足大家对“时空”双重性能的渴望。

9.3.2 tmpfs文件系统

tmpfs类似于RamDisk,它既可以使用内存,也可以使用交换分区。tmpfs文件系统使用虚拟内存(我们后面简称VM)子系统的页面来存储文件,tmpfs自己不需要知道这些页面是在物理内存中还是在交换分区中,一切由VM说了算。所以,tmpfs跟普通的用户进程差不多,使用的只是某种形式的虚拟内存。

tmpfs的实现与很多人所理解的完全不同,它跟其它文件系统如:ext3、ext2、ReiserFS等是完全不一致的,它们在Linux中都被称为块设备(即读写大块数据的设备,与之相对应的是字符设备,如键盘、鼠标等)。而tmpfs是直接建立在VM之上的,你用一个简单的mount命令就可以创建tmpfs文件系统了,不需要什么格式化。事实上就是十分想要格式化你也做不到,因为地球上就不存在类似mkfs.tmpfs这样的命令。

你或许想知道你刚刚挂接的tmpfs文件系统到底有多大。这个问题的答案有点意外:不知道!tmpfs刚被挂接时只有很小的空间,但是随着文件的复制和创建,tmpfs文件系统驱动程序会分配更多的VM,并按照需求动态地增加文件系统的空间。当有文件被删除时,tmpfs文件系统驱动程序会动态的减少文件系统并释放VM资源。循环利用,按需分配。因为毕竟VM比磁盘金贵些,还是慎用为妙。

说道速度,虽然它使用的是VM,但是人家也是内存,毕竟蜗牛也是牛啊。所以用快如闪电来形容一点都不为过。典型的tmpfs文件系统会完全驻留在物理内存中,读写几乎可以说是不用眨眼睛的。即使用了交换分区,性能仍然是卓越的,只要VM比较空闲了,一部分tmpfs的文件就会被移动到物理内存中,而且不常用的文件,也会被自动交换出去,腾出更多地方给用户进程。显然tmpfs遵循着VM子系统的整体调度策略,相对于RamDisk拥有更好的整体协调性和灵活性。

不过说到底,tmpfs还是一个基于内存的文件系统,不要指望这种文件系统会提供什么持久性支持,想想都是错误。因为在这个领域看来,那是没有任何意义的功能。而且人家名字也起的好——tmpfs——就是告诉你,别把这儿当安家立业的世外桃源,这里只是一个驿站,风景虽然恬意,但是想留宿,门都没有。

9.3.3 tmpfs实战

我一直有一个习惯,就是总不甘于就事论事,一定要把大家往“坑”里带,所以接下来的内容大家要注意,“坑”已挖好,就等你来了。

1.使用tmpfs

即便tmpfs使用起来可以用轻松加愉快来形容,不过我总是要唐僧几句,讲讲如何使用tmpfs的,乃至在实际中要遇到的问题。

要使用tmpfs最基本的就是要把它挂接到文件系统的某一个节点。只需要使用下面这个简单的命令:

#mount tmpfs/tmp –t tmpfs

这个时候/tmp目录就开始使用tmpfs文件系统了。所有使用/tmp目录作为临时目录的程序都会得到很好的速度提升。简单吧?不过注意,问题很快就会出现。最典型的问题就是用光了VM,虽然不能直接扔给大家一句:“后果自负”。但是你还真得处理好这个后果。

首先,tmpfs是根据需要动态增大或减少内存的事实就让人有一个疑惑:如果tmpfs文件系统增大到耗尽了所有VM,结果会是怎样?问题到了这个地步,真的很麻烦。早期内核,比如2.4.4以前的内核,直接宕机,只能重启了事。虽然2.4.6以后的内核做了调整,不过问题仍然严重,只是不至于宕机罢了。那么会是什么样一个结果呢?不能再向tmpfs中写入数据这个自然不在话下,系统还会变得很慢,让你认为它跟宕机差不多了,因为其它程序分配不到内存了。这个时候你让管理员来给你收拾烂摊子,估计也就是重启了事。好了,有人马上会说,你说的都是2.4的内核问题,如今的2.6乃至3.0就不是这样了。的确,但是也好不到那里去。因为内核有一个内建的最后防线,用来在没有可用内存的时候来释放内存。那么它是根据什么来释放内存呢?答案是谁用的内存多,就干掉谁。你马上就会说,显然tmpfs占用内存多啊?不过马上你就会很失望,tmpfs不能被干掉。因为它是内核的一部分,并不是用户进程,而且也没有什么好办法可以让内核找出是哪个进程占满了tmpfs文件系统。所以,内核会错误地***它能找到的最大的占用内存的程序,通常就是X服务器。如果你碰巧在使用它,你的X服务器就会被终止,可是引起问题的真凶并没有得到法办。如果碰巧你还在跟利用X提供的图形功能跟刚刚追到女朋友聊天约会,此时对方刚刚发来见面地点还没来得及看,你是不是会很抓狂呢?

其实tmpfs的设计者们早就想到了这个问题,于是提供了一个参数,让你来设定tmpfs最大占用量。可以使用如下命令:

# mount tmpfs /tmp -t tmpfs –o size=64m

这个命令告诉内核,/tmp所挂接的的tmpfs最多只能使用64MB的内存。在实际使用中,这个上限未必够用,或者仍然会导致VM被用光。比较好的方法是利用top工具,来监控一下你的系统在高峰期的内存用量。注意,交换分区要一同算在内。那么高峰期的余量就可以考虑成为tmpfs的上限值。不过最好这个上限值再稍微小那么一点,这样可以给你的系统留出一些余量,来应对一下突发事件。

除了容量限制,还可以通过使用nr_inodes=x参数限制一下索引节点数量,可以理解为限制了最大的文件数量。这个x可是是一个简单的整数,后面还可以跟一个k、m或g来制定千、百万或十亿个索引节点。

2.绑定挂接

前面说过,我喜欢把人往“坑”里带,那么现在这个“坑”就在这里了,至于你跟不跟我来,你说了不算!

为什么我说这是一个“坑”呢?因为绑定挂接跟tmpfs没有半毛钱关系,引入这个话题其实是为了能够更加灵活的运用tmpfs,而且通过这个例子,大家可以举一反三,在其它文件系统上同样可以运用绑定挂接这个技术,至少会给自己带来一些方便。有句广告语不是说过嘛:他好,我也好!

那么什么是绑定挂接呢?我无法用一句话清晰明了的概括出来,不过我可以用一个它的行为来描述一下。就是可以通过mount命令的一个参数,将一个已经挂接的文件系统全部或部分挂接到另外一个挂接点上。这里有一个特性(注意,开始挖坑了),任何挂接在绑定挂接文件系统内部的挂接点的文件系统都不会随之挂接。是不是很绕口(显然“坑”很深)?那么我举一个例子说明一下。

我自己的目录是/home/jagen,使用命令“mount --bind / /home/jagen”将系统根目录绑定挂接到了我自己的目录。现在访问我自己的目录跟访问根目录没有任何区别。注意,我自己的目录的访问权限已经跟根目录是相同的了,千万不要自作多情的拿权限开涮,这是没有任何意义的。一般对于根目录的划分是/boot采用一个分区,/usr采用一个分区,/home采用一个分区,/var采用一个分区,其它的采用一个分区。如果时这么分配的磁盘分区的,那么在进行绑定挂接后,我的目录中/home/jagen/usr这个目录就是空的,其它类推。只有分配给“/”根的这个分区内容被真正挂接到了我的目录(这回应该能从“坑”里爬出来了吧?)。

绑定挂接tmpfs的实例是这样操作的,见下面命令:

#mkdir/dev/shm/tmp

# chmod 1777/dev/shm/tmp

# mount --bind/dev/shm/tmp /tmp

这里解释一下,/dev/shm目录就是大多数发行版提供的一个默认的tmpfs文件系统,这是POSIX标准所规定,因为POSIX标准的共享内存就是利用tmpfs所实现的。不过目前大家常用的还是System V的共享内存,POSIX的共享内存不是很流行。这只是当前的情况,将来会怎么样,我是说不清楚。既然/dev/shm就是现成的tmpfs,那么就在它下面创建一个新的tmp目录。注意要修改权限使得所有用户都能访问,因为这是LBS对/tmp的强制规范。最后使用绑定挂接,将/dev/shm/tmp这个tmpfs绑定挂接到/tmp上,这样所有使用/tmp目录作为临时目录的程序都会受益于tmpfs所提供的超高性能。另外,这样操作有一个好处就是,/dev/shm是由发布版本厂商所提供的标准tmpfs,它的最大容量限制一般可以被认为是最为优秀的,直接拿来用总比自己动手分析要容易得多。

再针对绑定挂接多说几句。绑定挂接对于程序员来说,是非常实用的一个小帮手。我们假设这样一个场景。在一些特定开发场景,为了测试一些新功能,必须修改某个系统文件。但是这个系统文件又是放在只读文件系统上(只读只是相对的,只是修改这个文件非常麻烦罢了),或者这个文件虽然可写,但是对自己没什么把握,不敢直接修改。那么就可以利用mount --bind绑定挂接一个新的文件系统,你所有的修改都只是操作这个新的文件系统,老的是不会被改动的。当操作完毕,umount一下,就完全恢复了。即便弄出问题,重新启动一下,就没有任何问题了。

3.应用加速

淘宝,作为一个业内最著名的互联网公司,Web页面是我们对外提供服务的标准接口之一。我想在做的任何一个人,无不关心Web页面的显示速度。那么就多叨唠先叨唠几句用tmpfs来加速web页面。

说到web,apache略显老态龙钟,这个时代已经是Nginx大行其道的时代,那就看看如何加速nginx吧。还记得前面说过的,使得/tmp目录成为tmpfs的方法吧。不过在实际使用中,我们可能不太想改变/tmp的性质,毕竟还有很多其他程序也要用。那么我们就单独创建一个/nginx_tmp目录好了。至于是不是这样,你自己决定就行,然后在它上面挂接tmpfs。可以利用/dev/shm,也可以自己设定大小,随你。然后在修改nginx.conf文件,添加如下内容:

client_body_temp_path/nginx_tmp/client_body_tmp;

prox_temp_path /nginx_tmp/proxy_temp;

fastcgi_temp_path/nginx_tmp/fastcgi_temp;

在Web领域,另外一个常用工具当推squid了。这个服务所面临的问题是,当访问量过大时,会急剧增加Linux系统的负载(Linux的系统负载值可以简单理解为是系统进程调度队列中,处于等待状态的进程数量)。如果利用tmpfs,可以有效降低系统负载。一个参考值就是从12降到了0.3,很是可观。具体的操作也非常简单,如何挂接tmpfs我不再复述,都是一样的。修改squid.conf,这个文件的路径一般是/etc/squid/squid.conf。修改内容只有一行,如下:

cache_dir ufs/squid_tmp 256 16 256

这里对一些参数进行一下解释:

lufs,缓存存储机制,常用的就是ufs机制。不过依赖于操作系统的不同,可以选择不同的存储机制,具体可以参考squid的使用手册

l/squid_tmp,指定的缓存路径,在这里就是一个tmpfs文件系统

l第一个256,制定缓存目录的大小,这是squid能使用的缓存上限,可以根据实际情况酌情设定

l16和第二个256,针对ufs机制,squid在缓存目录下创建二级目录树。它们分别制定了第一级和第二级目录的数量。默认就是16和256,你可以根据实际情况,酌情设定

前面讲的基本上都是静态页面的加速,虽然有涉及到fastcgi,但是并不能说明全部问题。我再列举一个动态页面加速的例子,利用tmpfs如何加速PHP。对于java,道理类似。tmpfs针对php优化主要是提高session文件的访问效率,这个只要修改一下php.ini文件即可。然后php程序本身所产生的缓存文件或临时文件,直接在程序中修改就好了。

除了了加速Web之外,还可以加速一些软件,典型比如sqlite和BDB。这两个可以算是当今比较流行的桌面级数据库

SQLite顾名思义,是一种SQL的数据库,拥有优化的SQL引擎和数据存储引擎,虽然被成为桌面级数据库,但是性能并不逊色于任何企业级DBM,结合tmpfs可以利用它作为临时表,存放一些临时数据很好用。虽然SQLite本身支持内存数据库,但是对于一个老且运行可靠的系统来说,不用修改任何代码不是一个更好的主意吗?

至于BDB,也就是BerkeleyDB,系出名门,现在已经被oracle收编旗下。BDB是一个典型的NoSQL数据库,性能惊人,支持Key-Value存储。最典型的应用就是搜索引擎的网络爬虫。结合tmpfs使用,会得到更多意想不到的效果。

当然,对于这些应用要注意的是,不能乱用tmpfs造成内存紧张,而且一旦关机所有数据都要灰飞烟灭。不过有一些笨办法可以处理在系统正常关机下的数据转存问题,在后续章节中会有详细介绍。另外也可以自行定义一些持久化策略,使得tmpfs文件系统中的内容能够被保存下来。因为在服务器系统设计中,有一个很重要的原则就是I/O越少,性能越高,合理利用tmpfs可以有效降低系统I/O次数,因而提高性能。


--结束END--

本文标题: 特种文件系统(3)

本文链接: https://www.lsjlt.com/news/185585.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 特种文件系统(3)
    9.3 tmpfs前几天闲来无事翻微薄,有人写道:“曾经偷情被游街,如今二奶喊干爹;曾经撞人忙救人,如今撞人再杀人;曾经私情偷着干,如今淫乱存U盘;曾经献血为扶伤,如今慈善越重洋;曾经相好牵肚肠,如今小三炫富忙;曾经摩托都挺酷,如今地铁都追...
    99+
    2023-01-31
    文件系统 特种
  • Linux的文件系统(3)
    本章学习目标: 掌握Linux下文件目录的属性 掌握Linux下的权限管理 掌握如何切换用户身份及权限委派       3.1文件系统简介 文件系统(File system)泛...
    99+
    2023-01-31
    文件系统 Linux
  • linux 的文件系统 (3)
    上篇博文已经讲解了 如何对磁盘进行分区。接下来我们就在分区上创建文件系统。linux 下用 mkfs 来创建文件系统         用法 :            mkfs  -t  文件系统类型  设备名称   创建 ext3 文件系统...
    99+
    2023-01-31
    文件系统 linux
  • WinXP系统强制删除视频文件的3种方法
         在使用xp系统的时候我们都知道xp系统有个视频文件预览功能的效果,可以让我们查看我们下载的视频能否播放,但是有时这个功能会导致我们无法删除视频文件,当出现这个问题该如何解决?下面小...
    99+
    2023-06-07
    WinXP系统 强制删除视频文件 视频文件 系统 WinXP 方法
  • 使用bash shell删除目录中的特定文件的3种方法
    我是一名Linux新用户。现在我需要清理一个下载目录中的文件,其实我就是想从~/Download/文件夹删去除了以下格式的文件外所以其它文件: 1.*.iso - 所有的iso格式的文件。 2.*.zip ...
    99+
    2022-06-04
    种方法 文件 目录中
  • java中删除文件/文件夹的3种方法
    1、通过io删除文件 public static void deleteFileByIO(String filePath) { File file = new File(...
    99+
    2023-08-31
    java 开发语言
  • WinXP打开系统服务的3种方法图文教程
    Wubdiws的系统服务是一种应用型的程序,不过这种应用型的程序都是在后运行,并不会图形化显示出来让大家看到,不过却有很多软件程序的运行必须依赖这些系统服务。 如果相应的系统服务没有运行可能会引起一些系统小问题,所以就必...
    99+
    2023-06-07
    WinXP 打开系统服务 图文 系统 教程 方法
  • RHCE盘点(3)—— Linux文件系
    在操作系统中,任何东西都可以看作是文件,文件是操作系统逻辑组织的基本单元。对于Unix和Linux文件系统而言,文件系统层次标准(FHS)是其组织规范的主要参考。对文件目录结构稍有了解的人都知道,文件系统通常由根目录(/)出发,不断延伸出一...
    99+
    2023-01-31
    文件 RHCE Linux
  • python中3种调用可执行文件.exe
    方法一、os.system()  会保存可执行程序中的打印值和主函数的返回值,且会将执行过程中要打印的内容打印出来import os main = "project1.exe" r_v = os.system(main)  print...
    99+
    2023-01-31
    可执行文件 python exe
  • shell按行读取文件的3种方法
    方法有很多,下面写出三种方法:写法一: #!/bin/bashwhile read linedoecho $linedone < filename(待读取的文件) 写法二: #!/bin/bashca...
    99+
    2022-06-04
    种方法 文件 shell
  • java获取word文件页数的3种方式
    doc、docx页码跟系统字体,渲染方式有关,需要预览,或则转成pdf才能知道最终页数。 pdf页码是个属性,可以直接读取,获取比较容易。 poi获取 import java.io.File;import java.io.FileInput...
    99+
    2023-09-08
    word java
  • ubuntu系统添加环境变量3种方法
    说明: 工作中,我们自己编译安装的软件,在系统中是无法在全局目录下自动识别的,只能进入到相关目录下才能运行,如在命令行下运行编译安装的php程序,就得 /usr/local/LAMP/php/bin/...
    99+
    2023-09-01
    linux
  • 3种不用重装的办法解决压缩Vista系统文件夹导致崩溃情况
    4月11日18点前发布的Vista优化大师3.56中加入了一个系统盘系统文件夹压缩的功能,部分用户使用后导致了系统的崩溃,Vista之家特别在此做出解决方案。 一、重新下载:4月11日18点之前下载的用户,请重新下,也同...
    99+
    2023-05-24
    Vista 系统 文件夹 崩溃 系统文件 情况 办法
  • 如何理解Fedora Core 6支持的特定系统文件及各种操作方法
    如何理解Fedora Core 6支持的特定系统文件及各种操作方法,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Fedora Core系统在国内得到了用户充分的...
    99+
    2023-06-16
  • Linux下几种文件系统的简单介绍
    这篇文章主要讲解了“Linux下几种文件系统的简单介绍”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Linux下几种文件系统的简单介绍”吧!ExtExt 是最为流行的 Linux 文件系统,...
    99+
    2023-06-16
  • uhe理解Linux系统中的文件名和文件种类以及文件权限
    本篇内容主要讲解“uhe理解Linux系统中的文件名和文件种类以及文件权限”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“uhe理解Linux系统中的文件名和文件种类以及文件权限”吧!Linux文...
    99+
    2023-06-12
  • SpringBoot 常用读取配置文件的 3 种方法!
    我们在SpringBoot框架进行项目开发中该如何优雅的读取配置呢?或者说对于一些List或者Map应该如何配置呢? 本篇主要解决如下几个问题: Spring Boot有哪些常用的读取配置文件方式? 1)使用 @Value 读取配置文件 2...
    99+
    2023-08-17
    java 数据库 mysql 面试 服务器
  • Spring Boot读取Yml配置文件的3种方法
    简述: 项目开发中难免要读取配置文件,本文结合开发经验介绍几种使用过的读取配置文件的方法。 1.基础用法,使用注解@Autowired注入Environment类 这种方式比较常见,就像注入service或者dao一样,声明一个Env...
    99+
    2023-09-03
    spring boot java spring Powered by 金山文档
  • Win8系统3种转到开始屏幕的方法
      Win8系统的开始屏幕是默认开机启动后显示的第一界面,而且这也是展示Metro应用的主要位置。可以说开始屏幕是Win8系统的一大特色,那么我们有几种方式可以转到开始屏幕界面呢?   三种转到开始屏幕的方...
    99+
    2022-06-04
    转到 屏幕 方法
  • Linux系统设置PATH环境变量(3种方法)
    1、在Windows 系统下,很多软件安装都需要配置环境变量,比如 安装 jdk ,如果不配置环境变量,在非软件安装的目录下运行javac 命令,将会报告找gqqMzvbe不到文件,类似的错误。 2、那么什么是环境变量?...
    99+
    2022-06-04
    Linux设置PATH环境变量 Linux PATH环境变量
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作