其他资讯
🎣常见问题-13:硬盘无法休眠
00 分钟
2024-4-19
2024-4-30
type
status
date
slug
summary
tags
category
icon
password
硬盘无法休眠的原因很多,这里尝试整理各种会造成 Unraid 硬盘无法休眠的因素提供给大家参考,同时介绍如何使用 Dynamix Cache Directories 插件。
欢迎大家在评论区补充更多的信息。

1. 校验盘的“重建写入”(reconstruct write)功能

如果你有校验盘,并且也开启了“设置 - 硬盘设置”下的“重建写入”(reconstruct write)功能,那么就会造成硬盘无法休眠,具体的说明你可以参考官方的说明:
notion image
如果需要让硬盘休眠,那么设置为“自动”(Auto)即可(但会影响校验速度)。

2. 硬盘内的文件被读写

逻辑很简单,你希望休眠的硬盘,如果它里面的文件被某些应用所读/写,那么硬盘被唤醒自然也就无法休眠了。但是很多情况下,往往用户不知道是什么进程出于什么目的读写了文件/文件夹,从而将硬盘唤醒,因此博主尝试整理各种可能的原因供大家参考。

2.1 使用 Dynamix Cache Directories 插件

在整理原因之前,博主这里先介绍大家如何去使用 Dynamix Cache Directories 插件。
在 Linux 系统中,内核会将最近访问的磁盘缓冲区和其中的文件夹目录保存在内存中,以此来加快系统的运行速度,并清除最近未访问的条目。如果说我们可以“欺骗”内核,使其保持我们的目录条目在内存缓存中,那么此时就不需要去每一个物理硬盘中检索,从而就可以让硬盘休眠。
Unraid 上面有一个叫做 Dynamix Cache Directories 的插件,此插件可以将阵列、缓存池和远程挂载目录中的目录条目信息缓存到在内存中(可以选择缓存哪些特定的目录),因此当 Unraid 上面的进程去读取目录信息的时候就可以尽可能的避免去检索磁盘,从而最大可能保持硬盘休眠。
插件的运作原理就是通过检索物理磁盘上面的目录条目(对应到 Unraid 上面就是 /mnt/disk*/mnt/cache 缓存池),然后让目录信息可以缓存到内存当中,然后再定期地重复这一过程来确保内核不会将这些信息清空。
插件本质上是一个位于 /usr/local/emhttp/plugins/dynamix.cache.dirs/scripts 目录下的脚本文件 cache_dirs ,所以实际上你也可以在命令行手动执行脚本来实现同样的功能,具体相关的参数可以参考这里的🔗链接
notion image
插件介绍
The folder caching (cache_dirs) reads directories continously to keep them in memory. The program does not know whether a directory is already in memory or need to be reread from disk. Therefore it cannot avoid spinning up disks when it happens that the linux memory cache evicts a directory and cache_dirs rescans the directoy. If a large number of files are being kept in memory then it seems inevitably that some diretories get evicted from the cache when the system is under load.
The program by default uses an adaptive mode where it reduces the depth of the directory structure which it tries to keep in memory. When it detects a cache-miss (slow scan time) it will reduce the depth until disks are idle again, but will still be at risk of putting load on the disks for a minute or two until the program gives up and waits for idle disks. The less files the cache needs to hold, the less likely it is that the program spins up disks.
文件夹缓存(cache_dirs)持续读取目录以保持其在内存中。该程序无法知道目录是否已在内存中或需要重新从磁盘读取。因此,当 Linux 内存缓存将一个目录驱逐出去并且 cache_dirs 重新扫描该目录时,它无法避免磁盘启动。如果在内存中保存了大量文件,那么在系统负载较重时,某些目录被驱逐出缓存似乎是不可避免的。
该程序默认使用自适应模式,它会减少尝试保持在内存中的目录结构的深度。当检测到缓存未命中(扫描时间较慢)时,它将减少深度,直到磁盘再次处于空闲状态,但仍然有可能在一两分钟内给磁盘带来负载,直到程序放弃并等待磁盘空闲。缓存需要保持的文件越少,程序启动磁盘的可能性就越小。
插件参数说明
notion image
💡
对于一般用户,我建议在 Included folders 中勾选需要进行缓存的目录即可,其他不需要缓存的请取消勾选,然后将插件设置为启用即可。另外需要补充的是,如果希望缓存的目录是存放在固态硬盘而不是机械硬盘中,那么不需要对这些目录进行缓存,因为固态硬盘没有休眠这一说法。
  1. Folder caching function :开关,设置为 已启用 表示开启插件。
  1. Cache pressure of directories on system :表示对目录进行缓存的强度大小,值为整数,值设置得越大表示缓存的强度越高,所使用的内存数量也越多,默认值为 10 。如果设置为 0 则表示不释放已经被占用的内存,这可能会造成系统没有足够的内存从而导致系统崩溃,根据说明,值设置为 1 可以满足大多数用户的需求。如果说设置了某一个值之后发现硬盘常常被插件读取,或者说插件的日志提示插件经常扫描硬盘,那么尝试将值设置为 1 ;另外,如果插件运行后占用了太多的内存空间,那么可以尝试将值调高来解决这一问题。
  1. Suspend during 'Mover' process :是否在插件运行的时候暂停 Mover 进程,默认值为 Yes ,保持默认即可。
  1. Scan user shares (/mnt/user) :是否扫描 /mnt/user 路径。如果设置为 Yes ,表示除了扫描 /mnt/disk*/mnt/cache 路径外还会同时扫描 /mnt/user 目录,这么做的好处是可以最大化缓存磁盘目录列表到内存中,尽可能降低硬盘被读取的几率,但与此同时也会大大增加 CPU 的负载(CPU 负载可能会翻十倍)。
  1. Included folders :需要缓存的共享文件夹列表信息。你可以在这个选项的下拉列表中选择你希望进行缓存的目录,默认情况下会选择所有的共享文件夹。这里建议只勾选需要缓存的目录信息,不需要的建议不要勾选。
  1. Use Adaptive depth :选择缓存模式,有 AdaptiveFixed 两个选项,建议选择前者。默认 Adaptive (自适应模式),此选项会依据 Maximum level depth (最大文件夹层级)来动态的增加文件夹层级的缓存深度,但不会超出 Maximum level depth 所设定的值。在初始情况下,插件会从目录层级 1 来进行缓存(即最顶层目录),然后一步步的增加缓存的深度,直到缓存目录所花费的时间超过 Timeout during disk-idle period 所设定的值才会停止进一步加深缓存目录的深度。
  1. Minimum level depth (for adaptive depth)Adaptive (自适应)模式下的最小目录层级缓存深度,默认值为 4 。这个选项专门配合 Use Adaptive depthAdaptive 选项进行使用,如果没有选择 Adaptive 模式,那么此设置没有作用。举个例子,/mnt/user/movie 这样的目录结构属于 2 层级别,/mnt/user/movie/china/tv 属于 4 层级。
  1. Maximum level depth :最大文件夹缓存层级。默认值为 unlimited ,表示不限制缓存的文件夹层级深度(设置为 0 也代表没有限制)。
  1. Disk Idle Timer (秒) :当磁盘空闲了这么长时间后,插件使用 Adaptive 模式开始构建缓存,默认值是 60 秒,表示每 60 秒来构建一次缓存目录信息。如果先前已经构建好了,那么相当于访问一遍目录信息,这么做的目的在于“欺骗”系统内核,使其保持我们的目录条目在内存缓存中,避免内核将这些目录条目给清除。
  1. Timeout during disk-idle period (秒) :表示在当前文件扫描层级深度下完成所有目录扫描的最长超时时间,默认值为 150 秒。也就是如果插件在这个时间内无法成功缓存所有文件,那么插件就会停止目录的缓存,此时你可以提高这个设置的值,从而让插件能够完成既定目标目录的缓存。如果禁用 Adaptive (自适应)模式,则始终使用此超时设置。
  1. Timeout during initial startup or less-idle period (秒) :此设置的作用是在第一次进行目录缓存的时候,额外增加多少秒的扫描持续时间,默认值为 30 秒。也就是在插件第一次进行目录缓存的时候,在 Timeout during disk-idle period (秒) 设置的基础上额外增加 30 秒的超时时间,目的在于提高第一次目录缓存的成功率。
  1. Timeout when all directories have been cached (秒) :在所有的既定目录条目都已经被缓存到内存中时,达到多少秒之后停止插件的运行,默认值为 20 秒。这个选项的作用是,当插件实际上已经将所需要缓存的目录条目信息都进行了缓存,在达到这么多秒之后停止插件运作,从而不再对系统造成负载。如果希望在缓存从内存中被删除并且磁盘不处于空闲状态时减少插件对系统的负载,那么可以降低该设置的值;反之如果说希望插件尽可能的将目录条目信息放到缓存中,那么可以增加该设置的值(但会增加系统的负载)。
  1. Minimum interval between folder scans (秒) :文件夹扫描之间的最小间隔。可以根据系统性能的实际情况调整,默认值为 1 秒,适合大多数系统环境。
  1. Maximum interval between folder scans (秒) :文件夹扫描之间的最大间隔。可以根据系统性能的实际情况调整,默认值为 10 秒,适合大多数系统环境。
  1. Run scan of each disk in a separate thread :默认值为 Yes ,表示插件会为每一个磁盘创建单独的线程,每个磁盘将在单独的线程中进行扫描,因此磁盘将同时读取。如果用户共享也被扫描,那么在所有磁盘扫描完成后,用户共享将在单个线程中进行扫描,一次避免冲突。
  1. Memory available to the cache_dirs script (increase if it dies) :允许插件创建目录缓存时所能使用的内存数量,默认值为 50000,单位为 MB ,约 5G 的内存。将值设置为 ulimit 表示不限制内存的用量;如果设置为 -U 0 表示继承 shell 的默认设置。
  1. Logging :选择是否启用或禁用日志记录。日志将记录到 /var/log/cache_dirs.log/var/log/cache_dirs_lost_cache.csv 。请注意,插件的日志存储在 unRAID 的内存中,并且日志不会自动滚动来清空旧的日志信息以此降低内存占用空间。
  1. User defined options :用户自定义参数。插件支持用户自行添加相关的一些参数,如有需要,请参阅在线文档以使用这些选项,或查看位于 /usr/local/emhttp/plugins/dynamix.cache.dirs/scripts/cache_dirs 下的 cache_dirs 脚本。可以通过此功能来让插件避免遍历具有特定名称的所有目录,比如说以下示例避免了 '.Recycle.Bin'、'temp' 和 'log' 文件夹:-a '-noleaf -name .Recycle.Bin -prune -o -name log -prune -o -name temp -prune -o -print' (请注意,-a 参数周围的单引号很重要,当前版本不支持双引号,因此当前无法使用 '-name "*Old" -prune' 进行过滤)。

2.2 将需要经常读写的文件转移到缓存池

如果说创建有缓存池,那么建议可以将 Unraid 系统服务需要经常读写的文件转移到由固态硬盘组成的缓存池中。
例如 Unraid 的 Docker 服务和虚拟机服务会反复读取 docker.imglibvirt.img 文件,此时就可以将这两个文件所在的共享文件夹目录(默认为 system 文件夹)转移到缓存池中,避免机械硬盘被唤醒。
对于其他的文件也是一样的,哪些文件你需要经常读取,那你就将这些文件转移到缓存池里面,Unraid 文件在阵列与缓存池之间转移的方法可以参考:新手教程:详解 Unraid 缓存策略及应用案例unRAID 通用文件传输工具 —— Rsync 命令unBALANCE 文件转移工具使用方法和应用案例介绍
举个实际,Unraid 论坛上面有个硬盘不能休眠的求助帖子里,有一位网友分享了因 docker.img 文件没有转移到缓存池而导致硬盘不能休眠的情况:

3. 其他

待更新

评论