iostat(8)
命令的功能来测试系统的各种变化。这个命令将使用户获得关于系统 IO 的宝贵信息。sysctl
变量vfs.vmiodirenable
vfs.vmiodirenable sysctl(8)
变量可以被设置为 0(关闭)或 1(打开)。默认情况下,它被设置为1。这个变量控制系统对目录的缓存方式。大多数目录都很小,在文件系统中只使用一个片段(通常为 1K ),在缓冲区缓存中通常为 512 字节。如果关闭这个变量,缓冲区缓存将只缓存固定数量的目录,即使系统有大量的内存。当打开时,这个 sysctl(8)
允许缓冲区缓存使用虚拟机页面缓存来缓存目录,使所有的内存都可以用于缓存目录。然而,用于缓存目录的最小核心内存是物理页大小(通常是 4K )而不是 512 字节。如果系统正在运行任何操作大量文件的服务,建议保持该选项的启用。这些服务可能包括网络缓存、大型邮件系统和新闻系统。保持这个选项通常不会降低性能,即使浪费了内存,但人们应该通过实验来发现问题。vfs.write_behind
vfs.write_behind sysctl(8)
变量的默认值是 1 (on)。这告诉文件系统在收集完整的集群时发出媒体写入,这通常发生在写入大的顺序文件时。这可以避免在 I/O 性能无益的情况下用脏缓冲区使缓冲区缓存饱和。然而,这可能会拖延进程,在某些情况下应该关闭。vfs.hirunningspace
vfs.hirunningspace sysctl(8)
变量决定了在任何给定的实例中,有多少未完成的写 I/O 可以被排到磁盘控制器的系统中。默认值通常是足够的,但在有许多磁盘的机器上,可以尝试把它提高到4或5兆字节。设置太高的值,超过缓冲区缓存的写入阈值,会导致糟糕的集群性能。不要任意设置这个值,因为更高的写入值可能会增加同时进行的读取的延迟。sysctl(8)
值。不建议修改这些值,因为虚拟机系统在自动调整自己方面做得很好。vm.swap_idle_enabled
vm.swap_idle_enabled sysctl(8)
变量在有许多活跃的登录用户和大量空闲进程的大型多用户系统中非常有用。这样的系统往往会对自由内存储备产生持续的压力。通过 vm.swap_idle_threshold1
和 vm.swap_idle_threshold2
打开这个功能并调整交换滞后(以空闲秒为单位),比正常的分页算法更快地降低与空闲进程相关的内存页的优先级。这给了分页守护程序一个帮助。只有在需要时才打开这个选项,因为这样做的代价是尽早对内存进行预分页,而不是晚分页,这会消耗更多的交换空间和磁盘带宽。在一个小系统中,这个选项的影响是可以确定的,但是在一个已经在进行适度分页的大系统中,这个选项允许虚拟机系统轻松地将整个进程放入和取出内存。hw.ata.wc
hw.ata.wc
sysctl(8)
变量来检查系统上的默认情况。如果 IDE 写缓存被关闭,可以在 /boot/loader.conf
中把这个只读变量设置为 1,以便在启动时启用它。SCSI_DELAY
(kern.cam.scsi_delay
)SCSI_DELAY
内核配置选项可以用来减少系统启动时间。默认值是相当高的,可能会在启动过程中造成 15 秒的延迟。把它减少到 5 秒通常对现代硬盘有效。应该使用 kern.cam.scsi_delay
启动时间可调。调谐器和内核配置选项接受以毫秒而不是秒为单位的值。tunefs(8)
。这个程序有许多不同的选项。要打开和关闭软更新,请使用:tunefs(8)
来修改。在单用户模式下,启用软更新的好时机是在任何分区被挂载之前。make installworld
,会导致文件系统的空间耗尽,更新失败。inodes
或目录。有两种传统的方法来将文件系统的元数据写回磁盘。fsck(8)
会识别出这一点,并通过将文件长度设置为 0 来修复文件系统。此外,这个实现是清晰和简单的。缺点是,元数据的改变很慢。例如,rm -r
按顺序触及一个目录中的所有文件,但每个目录的变化都会同步写入磁盘。这包括对目录本身的更新,对 inode
表的更新,以及可能对文件分配的间接块的更新。类似的考虑也适用于使用 tar -x
解开大型层次结构。mount -o async
挂载的 UFS 文件系统的默认做法。由于所有的元数据更新也要通过缓冲区缓存,它们将与文件内容数据的更新混在一起。这个实现的好处是不需要等待每个元数据的更新被写入磁盘,所以所有引起大量元数据更新的操作都比同步情况下快得多。这个实现仍然是清晰和简单的,所以代码中出现错误的风险很低。缺点是不能保证文件系统的一致状态 如果在更新大量元数据的操作中出现故障,比如断电或有人按下复位按钮,文件系统将被留在不可预测的状态中。当系统再次启动时,没有机会检查文件系统的状态,因为文件的数据块可能已经被写入磁盘,而节点表或相关目录的更新却没有。因为磁盘上没有必要的信息,所以不可能实现 fsck(8)
来清理由此产生的混乱。如果文件系统已经被破坏得无法修复,唯一的选择就是重新格式化并从备份中恢复。fsck(8)
识别这种情况,并释放不再使用的资源。在文件系统崩溃后,用 mount -f
强行挂载文件系统的脏状态是安全的。为了释放可能未使用的资源,fsck(8)
需要在以后的时间运行。这就是后台 fsck(8)
的想法:在系统启动时,只记录文件系统的快照,之后再运行 fsck(8)
。然后,所有的文件系统都可以“dirty”挂载,所以系统的启动在多用户模式下进行。然后,后台 fsck(8)
被安排在所有需要这样做的文件系统上,以释放可能未使用的资源。不使用软更新的文件系统仍然需要常规的前台 fsck(8)
。fsck(8)
之后仍然存在的情况下,这些文件在软更新中根本就不存在,因为元数据和文件内容都没有被写入磁盘。在更新被写入磁盘之前,磁盘空间不会被释放,这可能发生在运行 rm(1)
之后的一段时间。当在一个没有足够自由空间容纳所有文件的文件系统上安装大量数据时,这可能会导致问题。