📄 configtuning-disk.html
字号:
。</p></div></div><div class="SECT2"><h2 class="SECT2"><a id="SOFT-UPDATES" name="SOFT-UPDATES">6.12.2. Soft Updates</a></h2><p><span class="CITEREFENTRY"><span class="REFENTRYTITLE">tunefs</span>(8)</span>程序能够用来很好的调整文件系统。这个程序有很多不同的选项,但是现在只介绍 Soft Updates德打开和关闭,这样做:</p><pre class="SCREEN"><samp class="PROMPT">#</samp> <kbd class="USERINPUT">tunefs -n enable /filesystem</kbd><samp class="PROMPT">#</samp> <kbd class="USERINPUT">tunefs -n disable /filesystem</kbd></pre><p>在文件系统被挂载之后不能用 <span class="CITEREFENTRY"><spanclass="REFENTRYTITLE">tunefs</span>(8)</span> 来修改。打开 Soft Updates的最佳时机是在单用户模式下任何分区被被挂载前。</p><div class="NOTE"><blockquote class="NOTE"><p><b>Note:</b> 像 FreeBSD 4.5,在文件系统创建时也可以打开 Soft Updates,通过 <spanclass="CITEREFENTRY"><span class="REFENTRYTITLE">newfs</span>(8)</span> 的 <varclass="LITERAL">-U</var> 选项。</p></blockquote></div><p>Soft Updates彻底的改善了数据描述(meta-data)的性能,主要是文件创建和删除,通过内存缓存。我们建议你在所有的文件系统上使用Soft Updates。应该知道 Soft Updates 的两点:首先, Soft Updates保证了崩溃后的文件系统完整性,但是很可能有几秒钟(甚至一分钟!)之前的数据没有写到物理磁盘。如果你的系统崩溃了你可能会丢失很多工作。第二,SoftUpdates推迟文件系统块的释放时间。如果在文件系统(例如根文件系统)快满了的情况下对系统进行大规模的升级比如<tt class="COMMAND">make installworld</tt>,可能会引起磁盘空间不足从而造成升级失败。</p><div class="SECT3"><h3 class="SECT3"><a id="AEN7947" name="AEN7947">6.12.2.1. Soft Updates的详细资料</a></h3><p>有两种传统的方法来把文件系统的元数据(meta-data)写入磁盘。(Meta-data更新是更新类似inodes或者目录这些没有内容的数据)</p><p>从前,默认方法是同步更新这些元数据(meta-data)。如果一个目录改变了,系统在真正写到磁盘之前一直等待。文件数据缓存(文件内容)在这之后以非同步形式写入。这么做有利的一点是操作安全。如果更新时发生错误,元数据(meta-data)一直处于完整状态。文件要不就被完整的创建要不根本就不创建。如果崩溃时找不到文件的数据块,<span class="CITEREFENTRY"><span class="REFENTRYTITLE">fsck</span>(8)</span>可以找到并且依靠把文件大小设置为0来修复文件系统。另外,这么做既清楚又简单。缺点是元数据(meta-data)更新很慢。例如<tt class="COMMAND">rm -r</tt>命令,从而改变目录下的所有文件,但是每个目录的改变(删除一个文件)都要同步写入磁盘。这包含它自己更新目录,inode表和可能对文件分散的块的更新。同样问题出现大的文件操作上(比如<tt class="COMMAND">tar -x</tt>)。</p><p>第二种方法是非同步元数据更新。这是 Linux/ext2fs 和 *BSD ufs 的 <ttclass="COMMAND">mount -o async</tt>默认的方法。所有元数据更新也是通过缓存。也就是它们会混合在文件内容数据更新中。这个方法的优点是不需要等待每个元数据更新都写到磁盘上,所以所有引起元数据更新大的操作比同步方式更快。同样,这个方法也是清楚且简单的,所以代码中的漏洞风险很小。缺点是不能保证文件系统的状态一致性。如果更新大量元数据时失败(例如掉电或者按了重启按钮),文件系统会处在不可预知的状态。系统再启动时没有机会检查文件系统的状态;inode表更新的时候可能文件的数据块已经写入磁盘了但是相关联的目录没有,却不能用<tt class="COMMAND">fsck</tt>命令来清理(因为磁盘上没有所需要的信息)。如果文件系统修复后损坏了,唯一的选择是使用<span class="CITEREFENTRY"><span class="REFENTRYTITLE">newfs</span>(8)</span>并且从备份中恢复它。</p><p>这个问题通常的解决办法是使用 <span class="emphasis"><i class="EMPHASIS">dirty regionlogging</i></span> 或者 <span class="emphasis"><i class="EMPHASIS">journaling</i></span>尽管它不是一贯的被使用并且有时候应用到其他的事务纪录中更好。。这种方法元数据更新依然同步写入,但是只写到磁盘的一个小区域。过后他们将会被移动到正确的位置。因为纪录区很小,磁盘上接近的区域磁头不需要移动很长的距离,所以这些比写同步快一些。另外这个方法的复杂性有限,所以出现错误的机会也很少。缺点是元数据要写两次(一次写到纪录区域,一次写到正确的区域)。正常情况下,悲观的性能可能会发生。从另一方面来讲,崩溃的时候所有未发生的元数据操作可以很快的在系统启动之后从记录中恢复过来。</p><p>Kirk McKusick,伯克利 FFS 的开发者,用 Soft Updates解决了这个问题:元数据更新保存在内存中并且按照排列的顺序写入到磁盘(``有序的元数据更新'')。这样的结果是,在繁重的元数据操作中,如果先前的更新还在内存中没有别写进磁盘,后来的更新就会捕捉到。所以所有的目录操作在写进磁盘的时候首先在内存中执行(数据块按照它们的位置来排列,所以它们不会在元数据前被写入)。如果系统崩溃了这将导致一个固定的``日志回朔'':所有不知如何写入磁盘的操作都像没有发生过一样。文件系统的一致性保持在30到60秒之前。它保证了所有正在使用的资源被标记例如块和inodes。崩溃之后,唯一的资源分配错误是一个实际是``空闲''的资源的资源被标记为``使用''。<span class="CITEREFENTRY"><span class="REFENTRYTITLE">fsck</span>(8)</span>可以认出这种情况并且释放不再使用的资源。它对于忽略崩溃后用 <tt class="COMMAND">mount-f</tt> 强制挂上的文件系统的错误状态是安全的。为了释放可能没有使用的资源,<spanclass="CITEREFENTRY"><span class="REFENTRYTITLE">fsck</span>(8)</span>需要在过后的时间运行。一个主意是用 <span class="emphasis"><i class="EMPHASIS">后台fsck</i></span>:系统启动的时候只有一个文件系统的<span class="emphasis"><iclass="EMPHASIS">快照</i></span>被记录下来。<ttclass="COMMAND">fsck</tt>可以在过后运行。所有文件系统可以在``有错误''的时候被挂接,所以系统可以在多用户模式下启动。接着,后台<tt class="COMMAND">fsck</tt>可以在所有文件系统需要的时候启动来释放可能没有使用的资源。(尽管这样,不用 Soft Updates的文件系统依然需要通常的<tt class="COMMAND">fsck</tt>。)</p><p>它的优点是元数据操作几乎跟非同步一样快(也就是比需要两次元数据写操作的 <spanclass="emphasis"><i class="EMPHASIS">logging</i></span>更快)。缺点是代码的复杂性(意味着对于丢失用户敏感数据有更多的风险)和高的内存使用量。另外它有些特点需要知道。崩溃之后,文件系统状态会``落后'' 一些。同步的方法用 <tt class="COMMAND">fsck</tt>后在一些地方可能产生一些零字节的文件,这些文件在用 Soft Updates文件系统之后不会存在,因为元数据和文件内容根本没有写进磁盘(可能发生在运行 <ttclass="COMMAND">rm</tt>之后)。这可能在文件系统上安装大量数据时候引发问题,没有足够的剩余空间来两次存储所有文件。</p></div></div></div><div class="NAVFOOTER"><hr align="LEFT" width="100%" /><table summary="Footer navigation table" width="100%" border="0" cellpadding="0"cellspacing="0"><tr><td width="33%" align="left" valign="top"><a href="configtuning-sysctl.html"accesskey="P">Prev</a></td><td width="34%" align="center" valign="top"><a href="index.html"accesskey="H">Home</a></td><td width="33%" align="right" valign="top"><a href="configtuning-kernel-limits.html"accesskey="N">Next</a></td></tr><tr><td width="33%" align="left" valign="top">用 sysctl 进行调整</td><td width="34%" align="center" valign="top"><a href="config-tuning.html"accesskey="U">Up</a></td><td width="33%" align="right" valign="top">调整内核限制</td></tr></table></div></body></html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -