更新

  • 2019/04/10 增加定时重启任务以解决内存泄露
  • 2019/03/28 更新 Unity Cache Server 版本到 v6.3.0
  • 2019/01/06 初次发布

介绍

Unity 在 2018/03/20 时推出了新版本的 Unity Cache Server 6.0:

Cache Server 6.0 Release and Retrospective: Optimizing Import – Unity Blog

新版本特性

  • 现代化 - 减少同步阻塞调用,使用现代化的库
  • 集群 - 实现 Node.js 集群,通过配置运行不相关的进程
  • 缓存 - 尝试在写入 socket 时使用缓存以消除 socket 停顿
  • 缓存中的缓存 - 实现内存缓存以减少文件 IO

从发布时使用到现在,半年多,没有遇到大的问题。上个月正好 Unity 2018.3 发布,直接将 Unity Cache Server 升级到了最新版本 6.2.3。

6.2.3 相对于刚发布的版本 6.0,稳定性、性能已经提升了很多,强烈推荐升级。

环境

  • Unity 2018.3.0f2
  • Unity Cache Server 6.2.3
  • CentOS 7.6 1810
  • NodeJS 8.15.0
  • NPM 6.4.1

截止到 2019/01/06 时都为最新版本。

注意:v6.2.5 这个版本包含内存占用过高的重大 Bug 修复:Reduced high memory usage in worker processes (#95) 因此强烈建议升级到比这个版本更高的版本。

内存占用过高会导致整个机器都无法使用,这篇文章介绍了此 Bug 的威力:修复 Jira 无法访问 - 狂飙

安装

NodeJS

distributions/README.md at master · nodesource/distributions

1
2
curl -sL https://rpm.nodesource.com/setup_8.x | bash -
yum install -y nodejs

Unity Cache Server

更新日志:Releases · Unity-Technologies/unity-cache-server

NodeJS 安装后自带 NPM 包管理器。

注意:虽然现在最新的 NodeJS LTS 是 10,但是 Unity Cache Server 要求使用 NodeJS 8 LTS 版本。

1
npm install unity-cache-server -g

配置

Unity Cache Server

1
2
3
4
5
mkdir /opt/unity-cache-server
cd /opt/unity-cache-server

mkdir config
unity-cache-server --save-config config/default.yml

修改配置

1
vi /opt/unity-cache-server/config/default.yml

进程数

建议修改进程数为 1 个以上,能更有效地提升速度。

options: 下面增加 workers: 5,注意这是 Yaml 文件,使用空格进行缩进,workers 前面有 4 个空格。

缓存路径

Cache.options.cache_fs.cachePath 必须使用绝对路径,需要将值从 .cache_fs 改为 /opt/unity-cache-server/.cache_fs

如果未使用绝对路径,启动服务时不会提示任何错误直接退出。

服务

增加专用用户

1
2
adduser unity -s /sbin/nologin
chown -R unity:unity /opt/unity-cache-server

配置服务文件

1
vi /etc/systemd/system/unity-cache-server.service

服务文件内容:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
[Unit]
Description=Unity Cache Server Service
After=network.target

[Service]
Type=simple
User=unity
ExecStart=/bin/unity-cache-server --NODE_CONFIG_DIR=/opt/unity-cache-server/config
Restart=on-abort

[Install]
WantedBy=multi-user.target

运行控制

开机自启动、运行与状态

1
2
3
systemctl enable unity-cache-server
systemctl start unity-cache-server
systemctl status unity-cache-server

检查运行日志

运行以下命令可以以 tail 方式持续实时地显示日志,使用 Ctrl+C 退出:

1
journalctl -u unity-cache-server -f

停止服务

1
systemctl stop unity-cache-server

防火墙

需要将默认端口 8126 放到允许列表中:

1
2
firewall-cmd --zone=public --add-port=8126/tcp --permanent
firewall-cmd --reload

定时重启

虽然 v6.2.5 版本的更新日志中说明修复了占用内存过高的 Bug,但是 v6.3.0 版本在使用的时候依然会出现内存占用过高的问题,由于 Unity Cache Server 并不需要连续运行,而且就算是 Unity 在使用时重启也只会导致当前资源下载失败,然后 Unity 会重新导入资源。

由于 Unity Cache Server 内存泄露导致的问题可以前往 修复 Jira 无法访问 - 狂飙

1
2
3
crontab -e

30 */6 * * * systemctl restart unity-cache-server

使用 cron 定时任务在 00:30 重启服务器,之后每隔 6 小时重启一次。选择这个时间主要是考虑到中午休息的时候并不会有很多人在用,一天 4 次的频率也是考虑到内存增长的实际情况,如果超过 6 小时不清理一次可能内存就占用就会涨得太多了。

测试

Unity/Edit/Preferences/Cache Server

  1. Cache Server Mode 选择 Remote
  2. IP Address 框中输入服务器 IP
  3. 点击 Check Connection 按钮测试

成功的话会显示 Connection successful.

清理

需要手动清理,执行以下脚本删除 180 天或超过 200GiB 的文件。

1
unity-cache-server-cleanup --cache-path /opt/unity-cache-server/.cache_fs --log-level 5 --max-cache-size 214748364800 --expire-time-span 180.00:00:00

升级

1
2
3
4
systemctl stop unity-cache-server
npm update unity-cache-server -g
systemctl start unity-cache-server
systemctl status unity-cache-server