VR道を往く!

VRとかUnityとかそういう話中心に。

Unity Cache Serverを使う。 CentOS6/7でのサービス作成の話

f:id:kaninabe:20160522001949p:plain

Unityのアセットインポートって結構時間かかりますよね…。
多数のファイルをうっかりインポート始めてしまったために数時間作業を中断するはめに…という経験のある人もいるかと思います。

そんな時役立つのがUnity Cache Server。Editor上で一度インポートしたアセットのデータをキャッシュしてくれるサーバプログラムです(Unity Pro限定)。

Unity - マニュアル: キャッシュサーバー (チームライセンス)

Proライセンスを持っていてある程度の規模のプロジェクトを回している人は大抵使っているのではと思います。

Cache Serverのプログラムをネットワークのどこかのマシン(サーバ)で動かしておき、 Unity EditorでCache Serverの設定をしている状態でアセットのインポートをすれば、そのインポートデータが自動的にサーバにキャッシュされます。 その後同じアセットをインポートする際、インポート処理を行う代わりにキャッシュデータを勝手にダウンロードしてくれるので、インポート時間の節約になるのです。 例えば開発チームのメンバー間で同じプロジェクトを共有して作業する場合、 またマルチプラットフォーム向けの開発をしていてSwitch Platformを頻繁に行う場合などに非常に効果があるわけです。

さて、今回はこのCache ServerプログラムをCentOS6と7のサーバマシン上でサービスとして動かす手順をまとめてみたいと思います。 Unityの話というよりはCentOS(RedHatlinux)でのサービス作成方法の話ですね。

Cache Serverの入手・実行(サーバ上の操作)

とりあえずCache Serverをサーバ上にダウンロードして実行する所から始めます。
ダウンロード場所が少し分かりにくいですが、ダウンロードページの「追加ダウンロード」を押すとリンクが出てきます。

f:id:kaninabe:20160522003451p:plain Unity - Update

パッチリリースのページにもあります。Windows向けとMac向けで2つリンクがありますがどちらも内容は同じ?

f:id:kaninabe:20160522011811p:plain Unity - Unity QA - Patch Releases

こうしてダウンロードしたプログラムをサーバ上で動かすことで利用できます。 サーバはいわゆるサーバ専用機でなくても、作業するマシンから参照可能なネットワーク上にあり、 ディスク・メモリに余裕のあるマシンなら大丈夫です。 極端な話、作業するマシン上で動かしてもかまいません。 ただしマニュアルページにも書いてありますが、 ファイルシステムの関係上WindowsではなくMacLinuxを使うべしとのことです。 今回はCentOSなのでOKですね。

zipファイルを解凍してできたディレクトリにRunLinux.shというシェルスクリプトが用意されているので、 シェル上でこれを実行するだけでOKです。

Cache Serverの利用(Unity Editor上での操作)

f:id:kaninabe:20160522002043p:plain

実際に作業するUnity Editor上では、(WindowsではEdit、MacではUnityの下から)Preferencesダイアログを開き、Cache Serverタブを選択。 「Use Cache Server」にチェックを付け、「IP Address」にサーバのアドレスを入れます。 もし正しくサーバプログラムが動いており、ネットワーク越しにアクセス可能であれば[Check Connection]ボタンを押した時にConnection Successfulと出ます。

この設定が完了した状態でアセットのインポートが起きた場合に、サーバ上へインポート済みデータがキャッシュされるようになります。 ある少し大きめのファイルをインポートする際、1回目はインポートに少し時間がかかりますが、 2回目以降はキャッシュを利用するためインポート時間が短縮されているかと思います。

CentOS6でのCache Serverのサービス作成

さて、基本的には上記のRunLinux.shをnohupコマンドを使うなどしてバックグラウンドで走らせれば利用可能になるですが、 この状態だとサーバプログラムが稼働しているかの確認や、プログラムの停止などが少し面倒だし、 サーバを再起動するなどした場合に、Cache Serverもいちいち立ち上げ直す必要があります。 このようにずっと立ち上げておくタイプのプログラムはサービスとして登録しましょう。 起動・停止や自動起動の設定などが簡単にできるようになります。 では、Cache Serverのプログラムをサービスに登録していきたいと思います。

まず前準備として、Cache Serverプログラムを解凍してできるディレクトリを/opt/CacheServerとして配置します。 また、/opt/CacheServer以下にキャッシュデータを置くものとし、 そのためにCacheServer以下のディレクトリ所有者をサービスを実行するユーザ(ここでは仮にunitysrvとします)に変更しておきます。

# unzip CacheServer-5.3.4p6.zip
# mv CacheServer /opt/
# chown -R unitysrv:unitysrv /opt/CacheServer/

CentOS6上でサービスを作成するには、/etc/init.d以下に起動・停止を行うシェルスクリプト(initスクリプト)を記述します。 ラッキーなことに以下のページにスクリプト例がありました。

Cache server installation on CentOS | Unity Community

これを少し修正して以下のようにしました。

#!/bin/sh

### BEGIN INIT INFO 
# Provides: unity_cache_server
# Required-Start $network $remote_fs
# Required-Stop: $network $remote_fs
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Unity Cache Server.
# Description: Unity Cache Server provides fast importing
# of assets that have already been processed by any member of the team.
### END INIT INFO

if [ -f /etc/init.d/functions ]; then
    # Source function library.
 . /etc/init.d/functions
else
    echo_success () { echo -n " [ OK ] "; }
    echo_failure () { echo -n " [FAILED] "; }
fi

if [ -f /etc/sysconfig/network ]; then
        # Source networking configuration.
        . /etc/sysconfig/network

        # Check that networking is up.
        [ X\${NETWORKING} = Xno ] && exit 0
fi

##
# UnityCacheServer startup script
##

################################################################################
## EDIT FROM HERE
################################################################################

# Installation prefix
PREFIX="/opt/CacheServer"
# Username to run as
CSUSER="unitysrv"

CACHEDIR=$PREFIX/cache5.0
LEGACYCACHEDIR=$PREFIX/cache

# Arguments
ARGS="--path $CACHEDIR --legacypath $LEGACYCACHEDIR"

################################################################################
## STOP EDITING HERE
################################################################################

# The path that is to be used for the script
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

PROG="unity_cache_server"
DAEMON_APP=$PREFIX/RunLinux.sh
DAEMON="nohup $DAEMON_APP $ARGS > /dev/null 2> /dev/null &"
RETVAL=0
PID=""

getpid() {
    PID=`ps ax | grep $PREFIX | grep -v grep | awk '{print $1}'`
}

start () {
    getpid
    if [ $PID ]; then
        echo $"$PROG (pid $PID) is already running."
        return 0
    fi

    echo -n $"Starting $PROG: "
    su -l $CSUSER -c "$DAEMON"
    RETVAL=$?
    if [ $RETVAL -eq 0 ]; then
        echo_success
        echo
    else
        echo_failure
        echo
        exit 1
    fi
}

stop () {
    getpid
    if [ ! $PID ]; then
        echo $"$PROG is not running."
        return 0
    fi
    echo -n $"Stopping $PROG: "
    su -l $CSUSER -c "kill $PID"
    RETVAL=$?
    if [ $RETVAL -eq 0 ]; then
        echo_success
    else
        echo_failure
    fi
    echo
}

restart () {
    stop
    start
}

dostatus() {
    getpid
    if [ $PID ]; then
        echo $"$PROG (pid $PID) is running."
    else
        echo $"$PROG is not running."
    fi
}

# See how we were called.
case "$1" in
  start)
    start
    ;;
  stop)
    stop
    ;;
  status)
    dostatus
    ;;
  restart)
    restart
    ;;
  *)
    echo "Usage: unity_cache_server {start|stop|status|restart}"
    exit 1
esac

exit $RETVAL

このファイルを/etc/init.d/unity_cache_serverとして保存し、 実行権限を与えてサービスをスタートします。

# chmod +x /etc/init.d/unity_cache_server
# service unity_cache_server start
Starting unity_cache_server:                               [  OK  ]

OKと出れば起動成功です。
これでさらにchkconfig --addで自動起動設定を追加。chkconfig --listで確認してランレベル2、3、4、5がonになっていれば大丈夫です。

# chkconfig --add unity_cache_server
# chkconfig --list unity_cache_server
unity_cache_server      0:off   1:off   2:on    3:on    4:on    5:on    6:off

CentOS7でのサービス作成

CentOS7ではサービスの登録はsystemdを使います。 CentOS6の場合のようなシェルスクリプトを書くのではなく、 ディレクトリ/etc/systemd/systemに次のような設定ファイルを配置することでサービスを定義します。

[Unit]
Description=Cache Server for Unity
After=syslog.target network.target

[Service]
Type=simple
ExecStart=/opt/CacheServer/RunLinux.sh --path /opt/CacheServer/cache5.0 --legacypath /opt/CacheServer/cache 
WorkingDirectory=/opt/CacheServer
KillMode=process
Restart=always
User=unitysrv
Group=unitysrv

[Install]
WantedBy=multi-user.target

この内容の設定ファイルを/etc/systemd/system/unity_cache_server.serviceという名前で保存します。 設定ファイルの詳細なフォーマットは省略しますが、要はExecStartで指定したコマンドを実行してくれます。 CentOS6のシェルスクリプトに比べて非常にシンプルに記述できるのでいい感じですね!

さて、ではサービスの登録・スタートを行います。 systemctl enableでサービス登録、systemctl startでサービススタートです。

# systemctl enable unity_cache_server.service
# systemctl start unity_cache_server.service

systemctl statusで稼働状態を確認しましょう。「Active: active (running)」と出ていればOKです。

# systemctl status unity_cache_server.service
● unity_cache_server.service - Cache Server for Unity
   Loaded: loaded (/etc/systemd/system/unity_cache_server.service; enabled; vendor preset: disabled)
   Active: active (running) since Tue 2016-05-17 23:50:49 JST; 30s ago
 Main PID: 2078 (node)
...

これでサーバマシンを再起動した時にCache Serverも自動的に立ち上がるようになります。 さらに設定ファイル内のRestartを適当に設定しておけばプログラムが不正終了しても プログラムを立ち上げ直してくれます。

# ps ax | grep CacheServer
 2078 ?        Ss     0:00 /opt/CacheServer/builds/linux64/bin/node /opt/CacheServer/main.js --path /opt/CacheServer/cache5.0 --legacypath /opt/CacheServer/cache
 2167 pts/0    R+     0:00 grep --color=auto CacheServer
# kill 2078
# ps ax | grep CacheServer
 2168 ?        Ss     0:00 /opt/CacheServer/builds/linux64/bin/node /opt/CacheServer/main.js --path /opt/CacheServer/cache5.0 --legacypath /opt/CacheServer/cache
 2174 pts/0    R+     0:00 grep --color=auto CacheServer

Cache Serverのプロセスをkillしても再び立ち上がっていますね。

これでUnityのキャッシュサーバがいつでも使えます!!