您的当前位置:首页正文

swap和tmpfs

2021-02-14 来源:爱go旅游网
简介:文件系统是Linux系统的重要组成部分,文件系统的配置和使用对整个系统的运行有着重要的影响。本文介绍了一些Linux系统上对文件系统的配置技巧,达到节省能耗并目的,有的技巧还可以提高系统的性能。虽然文件系统的节能成效比起CPU和显示器的节能来显得比较轻微,但是积少成多,绿色的地球将靠我们一点一滴来完成。

本文假设用户的主要文件系统驻留在硬盘之上。硬盘是系统中相对于CPU、内存等设备来说活动时间比较少的部件。如果硬盘处于空闲状态时,耗电量是很少的;而在启动进行读写的时候,耗电量会大大增加。所以通过文件系统节能的核心思想就是,尽量减少磁盘I/O,使硬盘更多的处于空闲状态。对atime的处理

根据POSIX的规定,Linux以及Unix等系统都要为系统中的所有文件记录文件的最后访问时间,叫做atime。对于某些应用来说,atime是很重要的信息。比如一些邮件程序会通过邮件文件的atime来判断此邮件是否已读;一些备份和清理程序会根据文件在多长时间内没有被访问,来决定是否对文件进行清理和归档。

但是对于大部分应用来说,atime信息并不重要,而系统更新atime所带来的开销却是巨大的。因为系统每访问一次某个文件,就要对这个文件更新一个新的atime时间值。我这里所说的访问,并不是从用户角度来看的打开一个文件,而是系统底层的每一次open和read等操作。设想一下,我们每对文件进行一次读操作,都要引起一个对磁盘的写操作,即使我们要读的内容已经存在于内存的PageCache中,还是要对磁盘进行一个写操作。这样引起的开销确实是巨大的,这些写操作会使磁盘更多的处于忙碌状态,这对系统性能(因为磁盘在完成一个写操作的时候会暂时阻止其他的写操作)以及电量消耗都是不利的。

所以,如果用户可以确定自己的应用不会使用到文件的atime信息,则可以禁止atime的更新。对于整个文件系统,mount命令的noatime选项可以使整个文件系统下的文件都不会进行atime的更新。可以使用如下命令:mount-oremount,noatime/

也可以将noatime选项写在/etc/fstab文件里。

如果不想对整个文件系统禁止atime更新,而只是想针对某些文件或目录禁止,则可以通过chattr命令来完成,如下面的命令:chattr-R+A/some/dir

可以对某个目录及其下面的所有文件禁止atime更新。

除了noatime,还有两个和atime相关的文件系统选项。一个是nodiratime,此选项只针对目录禁止进行atime更新(注意noatime对文件和目录都生效,是nodiratime的超集)。这样就可以使ls这样的命令不会更新目录的atime值。

对于某些用户某些应用,atime信息可能是必要的,比如本节一开始提到的邮件程序和备份工具。如果完全禁止atime更新会使这些程序无法正常工作。针对这种情况,Linux在内核2.6.20中添加了一个新的mount选项relatime(relativeatime的意思)。relatime的意思是访问文件时,仅在atime早于文件的更改时间时对atime进行更新。在内核2.6.24中,又对relatime进行了扩展,在访问文件时,当atime已经超过某个时间(例如一天)没有更新,就对atime进行更新。这个扩展的意思就是调整atime的更新粒度。

目前relatime还没有被广泛的应用,因为许多Linux发行版的内核版本和mount命令还没有支持这个选项。如果你的系统支持relatime,可以使用如下命令启用:mount-oremount,relatime/

回页首调节PageCache和VM系统调节PageCache

在Linux的内核中,对文件的读写提供一个页面缓冲的机制(PageCache)。PageCache存在于内存中,当要读取一个磁盘文件的内容时,内核首先在PageCache中进行查找,如果要读取的内容已经存在PageCache中,则无需在对磁盘发起实际的读操作。同样在需要写文件时,写操作也只是将内容存放于PageCache中,而PageCache中的更改内容由内核进程pdflush周期性的写回磁盘。在默认情况下,pdflush进程每5秒钟醒来一次,进行数据写回操作。这个写回时间值定义在参数/proc/sys/vm/dirty_writeback_centisecs中。如果在这5秒钟之间,发生电源故障或者系统崩溃,可能会引起数据丢失。如果用户的电源供应比较可靠,或者丢数据丢失的风险不是非常在意,可以适当的提高这个数据写回时间。使用如下命令查看系统当前的写回时间值:cat/proc/sys/vm/dirty_writeback_centisecs500

此时间值的单位为1/100秒。使用如下命令可以更改此值:echo2000>/proc/sys/vm/dirty_writeback_centisecs

这样,就可以使pdflush进程20秒才醒来一次,从而减少对磁盘的访问频率。

还有一个参数/proc/sys/vm/dirty_expire_centisecs控制一个更改过的页面经过多长时间后被认为是过期的、必须被写回的页面,其默认值是3000(单位也是1/100秒)。用户也可以适当的增加此值,使页面更长时间的驻留在内存中。如下命令:echo4000>/proc/sys/vm/dirty_expire_centisecs

pdflush进程处理的另一种情况是当可用内存量降低的时候,会将一些缓冲页面写回磁盘,释放内存。这个行为是受/proc/sys/vm/dirty_background_ratio参数控制的,此参数的默认值为10,意思是当所有被更改页面总大小占工作内存超过10%时,pdflush会开始写回工作。用户可以增加这个比例,以增加页面驻留在内存的时间。此参数的更改方法同上面两个参数。

Swap分区或文件

在默认情况下,Linux内核并不是只有在物理内存不够用的时候才进行交换,而是为了保证尽量大的磁盘缓冲以及其他一些原因,会尽可能的将非活动的进程及内存页面交换出内存,放在磁盘上的交换分区中。这种默认行为使得在还有大量内存可用的情况下,就会发生交换操作,而释放出的物理内存并没有被利用起来,显然这些交换操作是不必要的。为了减少因交换引起的磁盘读写,在用户内存足够大的时候,可以考虑禁用swap分区。

回页首使用“笔记本模式”(laptopmode)

在2.6.6以后,Linux内核在I/O系统上支持一种“笔记本模式”。在“笔记本模式”下,内核更智能的使用I/O系统,它会尽量使磁盘处于低能耗的状态下。“笔记本模式”会将许多的I/O操作组织在一起,一次完成,而在每次的磁盘I/O之间是默认长达10分钟的非活动期,这样会大大减少磁盘启动的次数。为了完成这么长时间的非活动期,内核就要在一次活

动期时完成尽可能多的I/O任务。在一次活动期间,要完成大量的预读,然后将所有的缓冲同步。在非活动期间,写操作会被阻挡在内存中(读操作如果无法在Cache中满足,则无法阻挡,因为用户无法忍受这么长时间的延迟)。“笔记本模式”会根据需要设置上节介绍的参数来达到适当的目的。

使用如下命令查看“笔记本模式”是否启用:cat/proc/sys/vm/laptop_mode0

0表示没有启用,可以使用如下命令启用:echo5>/proc/sys/vm/laptop_mode

回页首配置syslog

Linux使用syslog记录内核和各种应用程序的日志信息。Linux系统里存在一个Daemon进程syslogd或sysklogd来完成syslog的功能。默认设置下,syslogd在每次记录一条日志后,都会使用同步(sync)操作强制将页面缓存同步到磁盘上。这样做是为了保证日志信息得到最大的保护,即使系统崩溃或电源故障,日志信息可以最大可能的被写到了磁盘上。但是在个人电脑等对日志信息要求不是如此严格的系统上,这些sync操作很耗费磁盘I/O,同时耗费更多的电量。如果想禁止syslog的这种sync行为,需要修改syslog配置文件/etc/syslog.conf,在不想进行sync操作的项目前添加一个“-”(减号)。如将下面这一行:

*.info;mail.none;authpriv.none;cron.none

/var/log/messages

改为:

*.info;mail.none;authpriv.none;cron.none

-/var/log/messages

对于不是特别重要的日志信息,都可以采用以上方法禁止sync行为。

用户也可以根据自己的需要,将/etc/syslog.conf里不必要的日志项去掉,甚至可以将syslogd停掉,以节省磁盘I/O。

回页首使用tmpfs

tmpfs(temporaryfilesystem)是一种基于内存的文件系统,类似于虚拟磁盘ramdisk,但还是有很大不同。传统的ramdisk是一个块设备,而tmpfs是一个文件系统,并不是块设备,只是安装它,就可以使用。tmpfs一开始使用很小的空间,但随着文件的复制和创建,tmpfs文件系统会分配更多的内存,并按照需求动态地增加文件系统的空间。而且,当tmpfs中的文件被删除时,tmpfs文件系统会动态地减小文件系统并释放内存资源。但是tmpfs中的内容会在文件系统卸载后丢失。

用户可以将tmpfs应用于/tmp目录,这样在系统运行时产生的临时文件,以及对这些临时文件的读写都只发生在内存里,而不会引起任何的磁盘I/O。

如要使用最大为100M的tmpfs在/tmp目录上,可以将以下这行添加到/etc/fstab中:tmpfs

/tmp

tmpfs

size=100m,mode=1777

00

因篇幅问题不能全部显示,请点此查看更多更全内容