之前我写过一篇文章来吐槽 Nextcloud 的性能问题。当时我是尝试在群晖上试用 Nextcloud。考虑到我使用的群晖服务器的 CPU 性能比价差,因此我尝试在 Unraid 上部署 Nextcloud。但是性能差的问题仍然没有改观。不过近期在 Unraid 发布了 6.12.0 版本以后这个问题得到了很大的改观。
问题出在 shfs 这个进程上。在 Unraid 中,这个进程负责将分散在各个 Disk 上的文件夹内容聚合成一个统一的目录库,这意味着如果我们要访问任何文件都需要通过 shfs 来查找文件,这也使得 shfs 成文高吞吐率场景下的一个性能瓶颈。之前我经常可以看到 shfs 的 CPU 占用飙升到 100% 甚至 200%。在新版的 Unraid 中提供了 exclusive access 的特性。 Exclusive 的是排他性,独占的意思。Exclusive Access 是指固定将一个目录放在一个 Disk 中,这样我们在访问这个目录下的文件时,就不需要通过 shfs 来检索目录,而是可以直接访问磁盘上的目录系统,从而降低开销。
另一方面,Exclusive 也意味着这个目录无法有效的利用磁盘阵列提供的存储池,而只能利用单磁盘空间。因此,Nextcloud 的数据文件夹是不能使用 Exclusive Access 的。不过好在数据文件的访问其实并不是主要瓶颈,造成 Nextcluod 卡顿的主要原因在对容器挂载的配置文件(也就是 appdata)里面的众多小文件的高频读写。
另一个需要指出的是,在 Unraid 中,尽管缓存有多个 SSD,但是这些 SSD 会预先通过 Raid 机制聚合成一个统一的缓存磁盘,对于 Shfs 来说这个缓存池就是一个单一的磁盘,因此对缓存池的访问可以启用 Exclusive Access
要是用 Exclusive Access,首先需要再 Settings --> Global Share Settings 下打开(如下图,将 Permit exclusive shares 设置为 yes)。

但是在共享目录使用时,Exclusive Access 的含义是比较模糊的。因为 Share 的管理界面并不会提供一个可以由用户可以直接控制的选项来为具体的 Share 开启 Exclusive Access。事实上,Exclusive Access 是否会起作用是系统根据目录的状态来自动确定的。如前文所述,Exclusive Access 作用的前提是数据只位于一个磁盘中。因此,在 Permit exclusive shares 启用的前提下,如果某个 Share 的文件只可能位于一个磁盘中,那么 Exclusive Access 将自动启用。
要实现 Share 的文件只属于一个磁盘中,需要满足一下条件:
在本文的场景中,我们需要在 appdata 这个共享目录上启用 Exclusive Access,就可能需要进行必要的 Mover 操作。如果你看到 appdata 的 Share settings 页面中显示了如下 Exclusive access: no 的文字,进行如下操作:
上面的这套操作,能够极大改善 Nextcloud 在 Unraid 上的表现。其他的应用也会有很大的改观(例如 Jellyfin 的打开和搜索速度会有质的提升)。
之前我写过一篇文章来吐槽 Nextcloud 的性能问题。当时我是尝试在群晖上试用 Nextcloud。考虑到我使用的群晖服务器的 CPU 性能比价差,因此我尝试在 Unraid 上部署 Nextcloud。但是性能差的问题仍然没有改观。不过近期在 Unraid 发布了 6.12.0 版本以后这个问题得到了很大的改观。
问题出在 shfs 这个进程上。在 Unraid 中,这个进程负责将分散在各个 Disk 上的文件夹内容聚合成一个统一的目录库,这意味着如果我们要访问任何文件都需要通过 shfs 来查找文件,这也使得 shfs 成文高吞吐率场景下的一个性能瓶颈。之前我经常可以看到 shfs 的 CPU 占用飙升到 100% 甚至 200%。在新版的 Unraid 中提供了 exclusive access 的特性。 Exclusive 的是排他性,独占的意思。Exclusive Access 是指固定将一个目录放在一个 Disk 中,这样我们在访问这个目录下的文件时,就不需要通过 shfs 来检索目录,而是可以直接访问磁盘上的目录系统,从而降低开销。
另一方面,Exclusive 也意味着这个目录无法有效的利用磁盘阵列提供的存储池,而只能利用单磁盘空间。因此,Nextcloud 的数据文件夹是不能使用 Exclusive Access 的。不过好在数据文件的访问其实并不是主要瓶颈,造成 Nextcluod 卡顿的主要原因在对容器挂载的配置文件(也就是 appdata)里面的众多小文件的高频读写。
另一个需要指出的是,在 Unraid 中,尽管缓存有多个 SSD,但是这些 SSD 会预先通过 Raid 机制聚合成一个统一的缓存磁盘,对于 Shfs 来说这个缓存池就是一个单一的磁盘,因此对缓存池的访问可以启用 Exclusive Access
要是用 Exclusive Access,首先需要再 Settings --> Global Share Settings 下打开(如下图,将 Permit exclusive shares 设置为 yes)。

但是在共享目录使用时,Exclusive Access 的含义是比较模糊的。因为 Share 的管理界面并不会提供一个可以由用户可以直接控制的选项来为具体的 Share 开启 Exclusive Access。事实上,Exclusive Access 是否会起作用是系统根据目录的状态来自动确定的。如前文所述,Exclusive Access 作用的前提是数据只位于一个磁盘中。因此,在 Permit exclusive shares 启用的前提下,如果某个 Share 的文件只可能位于一个磁盘中,那么 Exclusive Access 将自动启用。
要实现 Share 的文件只属于一个磁盘中,需要满足一下条件:
在本文的场景中,我们需要在 appdata 这个共享目录上启用 Exclusive Access,就可能需要进行必要的 Mover 操作。如果你看到 appdata 的 Share settings 页面中显示了如下 Exclusive access: no 的文字,进行如下操作:
上面的这套操作,能够极大改善 Nextcloud 在 Unraid 上的表现。其他的应用也会有很大的改观(例如 Jellyfin 的打开和搜索速度会有质的提升)。