0. はじめに
Perforce P4(*1) はgitやSubversionなどと並んでソースコードやバイナリファイルの管理に活用されています。このミドルウェアをNetApp ONTAPの機能であるFlexCacheと組み合わせることで、リモート拠点からのアクセスの高速化だけでなくインフラコストの削減や運用工数の削減を実現できます。もちろんPerforce単体機能で実現できる部分もありますが、外部ストレージ機能と組み合わせることで使い勝手が広がります。
この組み合わせのメリットについて簡単に知りたい方は簡単にまとめたAWSブログがあるのでご確認ください。
https://aws.amazon.com/jp/blogs/news/perforce-and-fsxn-deliver-storage-efficiency-for-large-scale-development/
ここではメリットや連携方法について具体的に解説します。
*1 以降、Perforce、もしくはP4と短縮して表現します。
1. 連携させるメリット・デメリット
1.1. メリット
前出のAWSブログでは以下の3つのメリットについて記載しました。
a. データ量の削減とストレージコストの削減
b. Perforceサーバの負荷軽減 (ストレージオフロード)
c. リモート拠点やクラウドとのデータ連携が楽になる
これに加えて、少し細かい話になりますが以下のメリットもあります。
d. P4 プロキシサーバのキャッシュ領域の容量溢れを気にする必要がなくなる
キャッシュストレージはデータが溢れそうになると、アクセス頻度の低いデータをキャッシュから自動的に削除して空きを作ります。
e. P4 プロキシサーバのキャッシュ領域の拡大・縮小が簡単になる
キャッシュ領域にブロックストレージのを使うと拡大は容易ですが、縮小はあまりやりたくない作業であることは想像できるかと思います。ここにNASを活用すれば、その容量の拡大・縮小は無停止で非常に簡単です。
1.2. デメリット
a. 両拠点にNetApp ONTAPストレージが必要になる。(コストに影響する)
すでにオンプレでONTAPストレージを使っている方は、これは大きなデメリットにならないかもしれません。リモート拠点にキャッシュとして最低限の容量のストレージを準備するだけで良いからです。キャッシュには保守の切れそうな古い機種を転用しても良いでしょう。あるいはVMware ESXiやLinux KVM上で動作するSDS版のONTAPもあるので、ハードウェアアプライアンスを買わずに利用できます。
クラウドを利用する場合はAmazon FSx for NetApp ONTAP(以降、FSx for ONTAP)をキャッシュとして活用できます。
2. 構成のポイントと設定手順
2.1. 構成図
以下のような環境を作成しました。FSx for ONTAPがキャッシュストレージになる構成です。

オンプレミスのP4 コミットサーバ(別名、マスタサーバ)のディポ領域(=バージョン管理されるファイルの格納場所)にONTAPストレージを設置し、リモート拠点にもONTAPを設置します。そしてこのストレージ間でキャッシュ設定をして、P4 プロキシがONTAPキャッシュボリュームをマウントすることで、データ転送しなくてもオンプレにあるすべてのデータが参照できる状態になります。
この状態でP4 クライアントからP4 プロキシサーバにデータ読み出しのリクエストがあると、P4 プロキシサーバは自身のキャッシュ領域にデータがあると思ってP4 コミットサーバにデータを取りに行かず、自身でNFSマウントした領域からデータを読み出します。読み出しを受けたキャッシュのONTAPは、裏でオリジンONTAPにデータを取りに行ったあとにP4 プロキシにデータを渡すため、結果としてPerforce P4間の通信が削減され、P4 コミットサーバの負荷が軽減されます。
2.2. ストレージのキャッシュ設定
Perforceのインストールと設定をする前に、まずストレージの設定を終わらせる必要があります。ここではオンプレミスのFAS2820 (ONTAP Version 9.15.1)に作成されたボリュームをNFS Export設定した後に、そのボリュームをFSx for ONTAPにキャッシュする設定を入れます。そして最後にキャッシュボリュームをNFS Exportすればストレージの準備は完了です。
2.2.1. 前提条件
以下の7項目をクリアすればほぼ間違いなくキャッシュ設定は成功するのて、事前に確認してみてください。
- オンプレとAWSのVPCの間でインターネットVPN/Direct Connectなどを使って通信できるようにする
- 接続先のVPCにFSx for ONTAPが起動していて、SSH接続ができる状態になっている
(AWSコンソールからクイック作成でFSxを作ると、SSHアクセス用のfsxadminユーザのパスワードが設定されない状態になっているので注意してください。スタンダード作成を選べばfsxadminのパスワードを設定可能です。) - オンプレONTAPとFSx for ONTAPそれぞれに存在するインタークラスタLIF同士がtcp/11104とtcp/11105で疎通できる
※ インタークラスタLIFの有無とそのIPアドレスは、ONTAPにSSHログインして「net int show -role intercluster」コマンドを実行すると確認できます。
FsxId01bbdf5e15791c3a5::> net int show -role intercluster
(network interface show)
Logical Status Network Current Current Is
Vserver Interface Admin/Oper Address/Mask Node Port Home
----------- ---------- ---------- ------------------ ------------- ------- ----
FsxId01bbdf5e15791c3a5
inter_1 up/up 172.29.1.237/24 FsxId01bbdf5e15791c3a5-01
e0e true
inter_2 up/up 172.29.1.169/24 FsxId01bbdf5e15791c3a5-02
e0e true
2 entries were displayed.
※ FSx for ONTAPのインタークラスタLIFは、FSx作成時に指定した仮想ネットワークサブネットにかならず存在します。
SE-ST-2820-03::*> net int show -role intercluster
(network interface show)
Logical Status Network Current Current Is
Vserver Interface Admin/Oper Address/Mask Node Port Home
----------- ---------- ---------- ------------------ ------------- ------- ----
SE-ST-2820-03
inter_1 up/up 10.103.8.23/16 SE-ST-2820-03-01
e1a true
inter_2 up/up 10.103.8.24/16 SE-ST-2820-03-02
e1a true
2 entries were displayed.
※ もしオンプレONTAPにインタークラスタLIFが作成されていない場合は、net int createコマンドでインタークラスタLIFを2個(1ノードあたり1個)作成する必要があります。
SE-ST-2820-03::*> net int create -vserver SE-ST-2820-03 -role intercluster -lif inter_1 -service-policy default-intercluster -address 10.103.8.23 -netmask 255.255.0.0 -home-port e1a -home-node SE-ST-2820-03-01
SE-ST-2820-03::*> net int create -vserver SE-ST-2820-03 -role intercluster -lif inter_2 -service-policy default-intercluster -address 10.103.8.24 -netmask 255.255.0.0 -home-port e1a -home-node SE-ST-2820-03-02
コマンドの引数に何を指定すればよいか迷った場合は「?」を入力すると、候補が存在するものは候補が表示されます。
net int create -vserver ?
net int create -vserver SE-ST-2820-01 -home-node ?
net int create -vserver SE-ST-2820-01 -home-node SE-ST-2820-03-01 -home-port ?
net int create -vserver SE-ST-2820-01 -home-node SE-ST-2820-03-01 -home-port e1a ?
何の引数を与えればわからない場合も「?」を指定します。
4. エクスポートポリシーでNFSアクセス元のIPからのアクセスを許可している
FsxId01bbdf5e15791c3a5::> export-policy rule show
Policy Rule Access Client RO
Vserver Name Index Protocol Match Rule
------------ --------------- ------ -------- --------------------- ---------
p4cache3 default 1 any 0.0.0.0/0 any
p4cache3 fsx-root-volume-policy
1 any 0.0.0.0/0 any
2 entries were displayed.
SE-ST-2820-03::*> export-policy rule show
Policy Rule Access Client RO
Vserver Name Index Protocol Match Rule
------------ --------------- ------ -------- --------------------- ---------
p4origin default 1 any 0.0.0.0/0 any
設定が入っていない場合は、以下の流れで設定します。
- 設定するvserver名の確認
- export-policyとexport-policy ruleの設定状況の確認
- 「default」のポリシーにルールを追加 (172.29.0.0/16から全NASプロトコルを許可)
- 不要なルールの削除 (0.0.0.0/0のルールの削除)
FsxId01bbdf5e15791c3a5::> vserver show
Admin Operational Root
Vserver Type Subtype State State Volume Aggregate
----------- ------- ---------- ---------- ----------- ---------- ----------
p4cache3 data default running running p4cache3_ aggr1
root
FsxId01bbdf5e15791c3a5::> export-policy show
Vserver Policy Name
--------------- -------------------
p4cache3 default
p4cache3 fsx-root-volume-policy
2 entries were displayed.
FsxId01bbdf5e15791c3a5::> export-policy rule show
Policy Rule Access Client RO
Vserver Name Index Protocol Match Rule
------------ --------------- ------ -------- --------------------- ---------
p4cache3 default 1 any 0.0.0.0/0 any
p4cache3 fsx-root-volume-policy
1 any 0.0.0.0/0 any
2 entries were displayed.
FsxId01bbdf5e15791c3a5::> export-policy rule create -policyname default -vserver p4cache3 -protocol any -clientmatch 172.29.0.0/16 -rorule any -rwrule any
FsxId01bbdf5e15791c3a5::> export-policy rule show
Policy Rule Access Client RO
Vserver Name Index Protocol Match Rule
------------ --------------- ------ -------- --------------------- ---------
p4cache3 default 1 any 0.0.0.0/0 any
p4cache3 default 2 any 172.29.0.0/16 any
p4cache3 fsx-root-volume-policy
1 any 0.0.0.0/0 any
3 entries were displayed.
FsxId01bbdf5e15791c3a5::> export-policy rule delete -vserver p4cache3 -policyname default -ruleindex 1
5. NFSプロトコルがONになっている
FsxId01bbdf5e15791c3a5::> nfs show
Vserver: p4cache3
General Access: true
v3: enabled
v4.0: enabled
4.1: enabled
UDP: enabled
TCP: enabled
RDMA: enabled
Default Windows User: -
Default Windows Group: -
SE-ST-2820-03::> nfs show
Vserver: p4origin
General Access: true
v3: enabled
v4.0: enabled
4.1: enabled
UDP: enabled
TCP: enabled
RDMA: enabled
Default Windows User: -
Default Windows Group: -
※ NFSプロトコルがOFFの場合は、vserver nfs on -vserver SVM_NAMEで有効化できます。
6. インタークラスタLIF間でPING疎通ができる
オンプレONTAPのとFSx for ONTAPの間でpingを実行して、すべてのIPと疎通できることを確認します。
以下ではFlexCache通信を行うインタークラスタLIF間の全ての組み合わせでpingを実行しています。
FsxId01bbdf5e15791c3a5::> net ping -vserver FsxId01bbdf5e15791c3a5 -lif inter_1 -destination 10.103.8.23
(network ping)
10.103.8.23 is alive
FsxId01bbdf5e15791c3a5::> net ping -vserver FsxId01bbdf5e15791c3a5 -lif inter_1 -destination 10.103.8.24
(network ping)
10.103.8.24 is alive
FsxId01bbdf5e15791c3a5::> net ping -vserver FsxId01bbdf5e15791c3a5 -lif inter_2 -destination 10.103.8.23
(network ping)
10.103.8.23 is alive
FsxId01bbdf5e15791c3a5::> net ping -vserver FsxId01bbdf5e15791c3a5 -lif inter_2 -destination 10.103.8.24
(network ping)
10.103.8.24 is alive
SE-ST-2820-03::> net ping -vserver SE-ST-2820-03 -lif inter_1 -destination 172.29.1.237
(network ping)
172.29.1.237 is alive
SE-ST-2820-03::> net ping -vserver SE-ST-2820-03 -lif inter_1 -destination 172.29.1.169
(network ping)
172.29.1.169 is alive
SE-ST-2820-03::> net ping -vserver SE-ST-2820-03 -lif inter_2 -destination 172.29.1.237
(network ping)
172.29.1.237 is alive
SE-ST-2820-03::> net ping -vserver SE-ST-2820-03 -lif inter_2 -destination 172.29.1.169
(network ping)
172.29.1.169 is alive
このping確認の際、ついでにエンドツーエンドのMTU値も確認するとよいでしょう。レイテンシの低い近距離での接続であれば影響が見えにくいのですが、遠距離になるとストレージのMTUを小さくしないと性能が半分以下になることがあります。DFフラグを立てたpingを相互に実行することでパケット分割せずに通信できるパケットサイズを確認し、オンプレONTAPとFSxそれぞれのMTU設定を変更すると本来の性能を出せるようになります。
FsxId01bbdf5e15791c3a5::> net ping -vserver FsxId01bbdf5e15791c3a5 -lif inter_1 -verbose true -show-detail true -destination 10.103.8.23 -packet-size 1500 -disallow-fragmentation true
SE-ST-2820-03::> net ping -vserver SE-ST-2820-03 -lif inter_1 -verbose true -show-detail true -destination 172.29.1.237 -packet-size 1500 -disallow-fragmentation true
引数の意味は以下に記載がありますが、
https://docs.netapp.com/us-en/ontap-cli/network-ping.html#parameters
-pachet-size と-disallow-fragmentation の引数は必ず付けてください。
また、-packet-size 1500と指定するとほぼ間違いなく疎通できないため、徐々に値を小さくしてpingが通るサイズを探ります。
こちらでテストした際には-packet-size 1260 程度で通ることを確認しましたが、オンプレとAWSの間にTransitGatewayが存在すると1140程度まで下げないと疎通できないこともありました。
最小MTU値を確認後、ストレージ側でMTUを設定します。
pingはICMPですがFlexCache通信はTCPのため、pingのpacket-sizeよりもTCPヘッダーの20バイト分引き算した値を設定します。
FsxId01bbdf5e15791c3a5::> broadcast-domain show
(network port broadcast-domain show)
IPspace Broadcast Update
Name Domain Name MTU Port List Status Details
------- ----------- ------ ----------------------------- --------------
Default Fsx 9001
FsxId01bbdf5e15791c3a5-02:e0e complete
FsxId01bbdf5e15791c3a5-01:e0e complete
FsxId01bbdf5e15791c3a5::> broadcast-domain modify -broadcast-domain Fsx -ipspace Default -mtu 1220
FsxId01bbdf5e15791c3a5::> broadcast-domain show
(network port broadcast-domain show)
IPspace Broadcast Update
Name Domain Name MTU Port List Status Details
------- ----------- ------ ----------------------------- --------------
Default Fsx 1220
FsxId01bbdf5e15791c3a5-02:e0e complete
FsxId01bbdf5e15791c3a5-01:e0e complete
また、FSxからpingしたときとオンプレからpingしたときで疎通できるMTU値が異なることがあるため、必ず双方向でトライして小さいほうに合わせます。
オンプレ側も同様に設定します。
インタークラスタLIFが動作するポートを「net int show -role intercluster」で確認後、そのポートが所属するブロードキャストドメインを「broadcast-domain show」で確認してください。
SE-ST-2820-03::> net int show -role intercluster
(network interface show)
Logical Status Network Current Current Is
Vserver Interface Admin/Oper Address/Mask Node Port Home
----------- ---------- ---------- ------------------ ------------- ------- ----
SE-ST-2820-03
inter_1 up/up 10.103.8.23/16 SE-ST-2820-03-01
e1a true
inter_2 up/up 10.103.8.24/16 SE-ST-2820-03-02
e1a true
2 entries were displayed.
SE-ST-2820-03::> broadcast-domain show
(network port broadcast-domain show)
IPspace Broadcast Update
Name Domain Name MTU Port List Status Details
------- ----------- ------ ----------------------------- --------------
Cluster Cluster 9000
SE-ST-2820-03-01:e0c complete
SE-ST-2820-03-01:e0d complete
SE-ST-2820-03-02:e0c complete
SE-ST-2820-03-02:e0d complete
Default Default 1500
SE-ST-2820-03-01:e0M complete
SE-ST-2820-03-02:e0M complete
bd_9000 9000
SE-ST-2820-03-01:e1a complete
SE-ST-2820-03-02:e1a complete
SE-ST-2820-03::> broadcast-domain modify -broadcast-domain bd_9000 -ipspace Default -mtu 1220
D broadcast-domain show
(network port broadcast-domain show)
IPspace Broadcast Update
Name Domain Name MTU Port List Status Details
------- ----------- ------ ----------------------------- --------------
Cluster Cluster 9000
SE-ST-2820-03-01:e0c complete
SE-ST-2820-03-01:e0d complete
SE-ST-2820-03-02:e0c complete
SE-ST-2820-03-02:e0d complete
Default Default 1500
SE-ST-2820-03-01:e0M complete
SE-ST-2820-03-02:e0M complete
bd_9000 1220
SE-ST-2820-03-01:e1a complete
SE-ST-2820-03-02:e1a complete
オンプレ環境ではローカル環境からのNFS通信にはMTU9000を使い、クラウドと連携するFlexCache通信には低いMTUを指定したいこともあると思います。物理ポートが余っていれば、インタークラスタLIFを別の専用の物理ポートに移動して、ブロードキャストドメインも分離することで異なるMTU値を共存させることができます。
MTUを変更しただけでは動作中のインタークラスタLIFの通信に設定は反映されません。
TCP通信はMTU値をもとにTCP MSS値を決定し、TCP 3way handshake中にお互いのTCP MSS値を交換します。そのためすでにTCP接続が確立されている場合は後から変更ができないため、インタークラスタLIFのIPのdown -> upを行うことでTCP接続を再確立させ、反映させます。
ちなみにFSxのインタークラスタLIFはユーザによるdown -> upの操作ができない為、オンプレ側で実施します。
(FSx <-> FSx間でこの値を変更する場合は、FSxのテイクオーバー・ギブバックが行われるような操作をすることで反映させることが可能です。例:スループットキャパシティを上げる or 下げる、など)
SE-ST-2820-03::> net int show -role intercluster
SE-ST-2820-03::> net int modify -vserver SE-ST-2820-03 -lif inter_1 -status-admin down
SE-ST-2820-03::> net int show -role intercluster
SE-ST-2820-03::> net int modify -vserver SE-ST-2820-03 -lif inter_1 -status-admin up
SE-ST-2820-03::> net int show -role intercluster
SE-ST-2820-03::> net int modify -vserver SE-ST-2820-03 -lif inter_2 -status-admin down
SE-ST-2820-03::> net int show -role intercluster
SE-ST-2820-03::> net int modify -vserver SE-ST-2820-03 -lif inter_2 -status-admin up
SE-ST-2820-03::> net int show -role intercluster
7. オンプレONTAPのバージョンが古すぎない
FSx for ONTAPは比較的新しいバージョンに自動的にアップデートされますが、オンプレONTAPが余りにも古すぎるとエラーになることがあります。基本的にフルサポートの残っているONTAPバージョン同士であれば問題ないのですが、もしエラーになる場合はオンプレONTAPをアップグレードしてみると改善されるかもしれません。
2.2.2. FlexCacheの設定
全体の流れとしては以下となります。
- インタークラスタLIFのIPを使ったクラスタピアの作成
- SVMピアの作成
- オンプレストレージのオリジンボリュームを指定してキャッシュボリュームを作成
- NFSクライアントからNFS Exportされているか確認
実際の設定手順はここでは記載しませんが、以下の公式ドキュメントに丁寧に書かれているので迷うことは少ないかと思います。
https://docs.aws.amazon.com/ja_jp/fsx/latest/ONTAPGuide/create-flexcache.html
FlexCacheの設定が終わったあとは、FSx for ONTAPでボリューム一覧とジャンクションパス(=マウントパス)を確認し、
FsxId01bbdf5e15791c3a5::> vol show -vserver p4cache3 -fields junction-path
vserver volume junction-path
-------- ------------------- --------------------
p4cache3 fas2820_tools_cache /fas2820_tools_cache
p4cache3 p4_depot_cache /p4_depot_cache
p4cache3 p4_depot_cache2 /p4_depot_cache2
p4cache3 p4cache3_root /
p4cache3 vol1 /vol1
5 entries were displayed.
キャッシュの関係性を確認し、
FsxId01bbdf5e15791c3a5::> flexcache show -vserver p4cache3
(volume flexcache show)
Vserver Volume Size Origin-Vserver Origin-Volume Origin-Cluster
------- ----------- ---------- -------------- ------------- --------------
p4cache3
p4_depot_cache
800GB p4origin p4_depot_origin
SE-ST-2820-03
p4cache3
p4_depot_cache2
300GB p4origin p4_depot_origin2
SE-ST-2820-03
p4cache3
fas2820_tools_cache
100GB p4origin tools SE-ST-2820-03
3 entries were displayed.
キャッシュボリュームのJunction-path(ストレージ内部のパス)で表示された領域が、NFSクライアントのLinuxから見えるか確認します。
(showmount -eの引数のIPは、FSxのNFS/SMBアクセス用のIPを指定します。)
[root@ip-172-29-1-247 ~]# showmount -e 172.29.1.240
Export list for 172.29.1.240:
/fas2820_tools_cache (everyone)
/p4_depot_cache (everyone)
/p4_depot_cache2 (everyone)
/ (everyone)
/vol1 (everyone)
[root@samba ~]# showmount -e 10.103.8.25
Export list for 10.103.8.25:
/p4_depot_origin (everyone)
/p4_depot_origin2 (everyone)
/ (everyone)
/tools (everyone)
/vol1 (everyone)
ちなみにPerforceサーバがマウントに使うストレージのIPアドレスを確認するには、「net int show -role data」を実行します。
FsxId01bbdf5e15791c3a5::> net int show -role data
(network interface show)
Logical Status Network Current Current Is
Vserver Interface Admin/Oper Address/Mask Node Port Home
----------- ---------- ---------- ------------------ ------------- ------- ----
p4cache3
iscsi_1 up/up 172.29.1.77/24 FsxId01bbdf5e15791c3a5-01
e0e true
iscsi_2 up/up 172.29.1.187/24 FsxId01bbdf5e15791c3a5-02
e0e true
nfs_smb_management_1
up/up 172.29.1.240/24 FsxId01bbdf5e15791c3a5-01
e0e true
SE-ST-2820-03::> net int show -role data
(network interface show)
Logical Status Network Current Current Is
Vserver Interface Admin/Oper Address/Mask Node Port Home
----------- ---------- ---------- ------------------ ------------- ------- ----
p4origin
data1 up/up 10.103.8.25/16 SE-ST-2820-03-01
e1a false
Perforceには、ここまでの作業で作成された以下のNFS共有を設定をします。
P4 コミットサーバがマウントするオリジンボリューム:
SVM: p4origin
Volume: p4_depot_origin
マウント用IP: 10.103.8.25
P4 プロキシサーバがマウントするキャッシュボリューム:
SVM: p4chache3
Volume: p4_depot_cache
マウント用IP: 172.29.1.240
2.3. P4 コミットサーバとP4 プロキシサーバのセットアップ
2.3.1. Perforce P4のバイナリダウンロード
以下からダウンロードが可能です。
Perforce社:
https://www.perforce.com/products/helix-core/free-version-control
東陽テクニカ社:
https://ss.toyo.co.jp/s/helix-core/download
Perforceサーバの実行ファイルのp4d or p4d.exeは、設定によってP4 コミットサーバ、P4 マスタサーバ、P4 エッジサーバ、P4 レプリカサーバなどの様々な役割を果たします
P4 プロキシの実行ファイルのp4p or p4p.exeは、P4 プロキシサーバ専用のバイナリです
東陽テクニカ社のナレッジは以下から検索できます。
https://ss.toyo.co.jp/s/helix-core
2.3.2. P4 コミットサーバのセットアップ手順
手順は以下のAWSブログが参考になりますが、
https://aws.amazon.com/jp/blogs/news/perforce-helix-core-on-aws-part2/
手元にあるEC2インスタンスにクイックにインストールしたい人向けに簡易手順を記載します。
P4 コミットサーバのセットアップは、バイナリをダウンロードして実効権限をつけ、p4dプロセスに引数を与えて起動するだけです。(Linux版の場合)
Linux版P4 コミットサーバの起動例
- ダウンロードしたバイナリのp4dを任意のパスにコピー
- 実効権限の付与 (chmod 755 ./p4d)
- p4dのルートパスの作成 (mkdir /mnt/p4d_root01)
- ディポ用パスの作成 (mkdir /mnt/p4d_root01_depot01)
- ディポ用のオリジンストレージのNFSマウント
(mount -t nfs 10.103.8.25:/p4_depot_origin /mnt/p4p_root01_depot01) - P4 コミットサーバの起動
./p4d -p 1666 -r /mnt/p4d_root01/ -J journal -L /mnt/p4d_root01/p4d.log -v filesys.bufsize=10000000
※ 起動の引数について
「-p」
p4dのListenするIPとポート。P4 プロキシサーバやP4 エッジサーバ、P4Vなどからこのポートにアクセスを受ける。
「-r」
P4 コミットサーバのルートパス。この下にPerforceのデータベースファイルやDBのジャーナルログなどが生成されるので、サイズが大きくなることが予想される場合や性能が求められる場合は外部ストレージをマウントする。(この領域は冗長性のあるストレージをFC/iSCSIでマウントすると良い)
「-J」
P4 コミットサーバのDBのジャーナルファイルのファイル名。デフォルトでは$P4ROOT(=ここでは「-r」の引数の「/mnt/p4d_root01」)の下に、-Jの引数の文字列(=journal)のファイル名で生成される。
「-L」
P4 コミットサーバのログ出力先
「-v filesys.bufsize=」
その他オプション。
これ以外のp4dの引数は以下のマニュアルに記載されています。
https://help.perforce.com/helix-core/server-apps/p4sag/current/Content/P4SAG/appendix.p4d.html
p4dの「-v」の引数は、以下の一覧表のうち「Server」に該当するものが利用可能です。
https://help.perforce.com/helix-core/server-apps/cmdref/current/Content/CmdRef/configurables.alphabetical.html

P4 エッジサーバやP4 スタンバイサーバなどを構築する場合は、P4 コミットサーバの構築はもっと複雑な手順になります。
2.3.3. P4 プロキシサーバのセットアップ手順
P4 プロキシサーバもP4 コミットサーバと同様に、バイナリをダウンロードして実効権限をつけ、コマンドの引数でp4pプロセスを起動するだけです。(Linux版の場合)
Linux版P4 プロキシサーバの起動例
- ダウンロードしたバイナリのp4pを任意のパスにコピー
- 実効権限の付与 (chmod 755 ./p4p)
- p4pのルートパスの作成 (mkdir /mnt/p4p_root01)
- キャッシュデータ格納用のパスの作成 (mkdir /mnt/p4p_root01_cache)
- キャッシュストレージのNFSマウント
(mount -t nfs 172.29.1.240:/p4_depot_cache /mnt/p4p_root01_cache) - P4 プロキシサーバの起動
./p4p -p 1667 -t 10.103.8.68:1666 -c -R /mnt/p4p_root01/ -r /mnt/p4p_root01_cache -L /mnt/p4p_root01/p4p_root01.log -v lbr.proxy.case=3 -v filesys.bufsize=10000000 -v lbr.bufsize=10000000 -v 1
※ 起動の引数について
「-p」 p4pのListenするIPとポート (P4 クライアントからのアクセスを受け待ちするポート)
「-t」 P4 コミットサーバのIPとポート
「-c」 P4 コミットサーバとP4 プロキシサーバ間でネットワーク圧縮をしない
「-R」 p4pのルートディレクトリ
「-r」 p4pのキャッシュ格納先ディレクトリ
「-L」 p4pログ出力先
「-v lbr.proxy.case=3」 大文字・小文字判定をする設定(Windows版のP4 プロキシサーバを使う場合に要設定)
「-v lbr.bufsize=」 サーバ上のバージョン化ファイルのアーカイブに対する読み書き操作のバッファサイズ
「-v filesys.bufsize=」 P4 プロキシサーバのファイルI/Oのバッファサイズ
P4 プロキシのセットアップ手順は以下にあり、引数も解説されています。
https://help.perforce.com/helix-core/server-apps/p4sag/current/Content/P4SAG/chapter.proxy.html
「-v」の引数は、以下の一覧表のうち「Proxy」に該当する場合に利用可能なオプションとなります。
https://help.perforce.com/helix-core/server-apps/cmdref/current/Content/CmdRef/configurables.alphabetical.html#

p4dやp4pの実行ユーザに関する注意事項が以下に記載されています。
https://help.perforce.com/helix-core/server-apps/p4sag/current/Content/P4SAG/install-linux-non-package-unprivileged-user.html
2.4. 設定のポイント
2.4.1. P4 コミットサーバとストレージ
P4 コミットサーバは「/mnt」などのパスの下にONTAPストレージをNFSマウントして、このマウントパスをPerforceのディポ領域としてあとから設定する必要があります。もし開発しているプロジェクトが複数あってバージョン管理も分けたい場合には、プロジェクトごとにストレージにボリュームを作成して/mntの下に別名でマウントしても良いでしょう。
ここではP4 コミットサーバにマウントしたNFS領域をリポジトリとして使えるようにするための「ディポ」の設定を紹介します。視覚的にわかりやすくするためP4VとP4AdminというGUIツールを使って説明します。
P4Admin / P4Vのバイナリは以下からダウンロードできます。
Perforce社 https://www.perforce.com/products/helix-core-apps/helix-visual-client-p4v
東陽テクニカ社 https://ss.toyo.co.jp/s/helix-core/download
インストール終了後にP4Vを起動すると、P4 コミットサーバのIPとポート番号を入力する画面が表示されます。

接続先のP4 コミットサーバのIPとポートを入力したあとに、「User:」の欄は右側の「New...」から最初のユーザを作成します。

次に、「Workspace:」欄も「New...」からワークスペースを作っておきます。
ここまでの作業が終わると、別のGUIであるP4Adminを起動してP4 コミットサーバにログインできるようになります。
ちなみにP4Vの操作については以下の動画が参考になるので、字幕を日本語に変更してご覧ください。
Touring the P4V Interface
https://youtu.be/LFd3aWmMEtY?list=PLH3pq2J85xsOReRaoj_94072IWx6-E5EY
ここからは本題のディポの設定作業となります。
P4Vと一緒にインストールしたP4Adminを起動して先ほど作成したユーザとパスワードでログインしたあとに、以下の画面で「File」-> 「New」 -> 「Depot」を選択します。

「Storage location for vesioned files」の欄でデータ格納場所を指定します。

この例では「/mnt/test_depot/...」というパスを入力していますが、この作業をする前にP4 コミットサーバ側で「/mnt/test_depot」の下にNFSストレージのマウントを済ませておく必要があります。
この欄の、「/mnt/test_depot/...」の...部分が気になると思いますが、このピリオド3つはBashでいうところの*(アスタリスク)と同じようなもの、と覚えておくと良いかもしれません。
そしてこの画面を「Apply」→「OK」で閉じれば、これ以降はディポ名をつかってユーザはPerforce内でデータにアクセスできるようになります(P4 クライアントにはマウントパスは隠ぺいされます)。このような仕組みによって1台のPerforceは複数のストレージを使い分けることができます。
ちなみに「Depot type」には様々な種類(local, stream, spec, remote, archive, unload, graphなど)がありますが、簡単な検証や動作確認をするだけであれば「local」を選択すると無難です。
以上で最低限のP4 コミットサーバの設定は終了です。
2.4.2. P4 プロキシサーバとストレージ
前章「2.2. P4 コミットサーバとP4 プロキシサーバのセットアップ」に記載した内容で網羅できているので、ここでは特に注意することはありません。
2.4.3. 追加で必要な設定
2.4.3.1. ユーザの作成
もしadminユーザ以外の一般ユーザを作成する必要があれば、P4AdminのGUIの「File」→「New...」→「User...」からユーザを追加します。

作成されたユーザがP4Vを使ってP4 コミットサーバもしくはP4 プロキシサーバにアクセスしようとすると、初回はワークスペースの作成が必要になります。どのディポを使うか、そしてそのデータを自身のPCのどこにダウンロードしてくるかなどを設定します。
P4Adminを使ったユーザやグループの追加については以下が参考になります。
Perforce Helix Core Admin's Guide: How to Add Users and Groups in Helix Core
https://youtu.be/GH7gYeiyLLY?list=PLH3pq2J85xsOReRaoj_94072IWx6-E5EY

2.4.3.2. 並列処理のチューニング for P4 コミットサーバ
デフォルトではPerforceは並列度の低いモードで動作します。「net.parallel.max」という設定がデフォルトでは「0」のため、データのダウンロードやアップロードは1つのP4 クライアントは2並列で行えず、シリアル処理になります。
https://help.perforce.com/helix-core/server-apps/cmdref/current/Content/CmdRef/configurables.alphabetical.html#net.parallel.max

設定できる範囲は0~100で、0もしくは1は並列処理がOFFになります。アクセスしてくるクライアントマシンが少ない環境であればこの値は大きくしても問題ありませんが、クライアントが数十台規模になるとサーバがパンクするためデフォルトでは無効化されているようです。P4 コミットサーバのCPUコアが多い場合には、「net.parallel.max」をCPUコアと同じか2倍程度まで増やすことで効率的に動作するようになる可能性があります。
この「net.parallel.max」オプションはp4d起動時のコマンドで指定しても良いのですが、ここではコマンドから設定してみたいと思います。以下はP4 CLIをインストールしたWindows端末やLinux端末から実施でき、永続的な設定となります。
Linux $ p4 -u admin -p 10.103.8.68:1666 configure set net.parallel.max=16
「-u」は、初回に作成したPeforceのスーパーユーザーを指定します。
「-p」は、P4 コミットサーバのIPとポート番号です。
ついでに自動的に並列処理が動作するように、以下の設定も入れます。
Linux $ p4 -u admin -p 10.103.8.68:1666 configure set net.parallel.threads=4
Linux $ p4 -u admin -p 10.103.8.68:1666 configure set net.parallel.submit.threads=4
「net.parallel.max」に加えて上記threadsの設定が入っていると、クライアントとサーバがお互いに並列処理をサポートしていると自動的に並列で処理が行われます。もしこの設定が入っていないと、P4 CLIなどで手動で並列処理を指定しない限りはシリアル処理になるため、ストレージまで大きな負荷が落ちてきません。
これ以外に、ディポの圧縮設定をOFFにすることでも性能が向上しますが、設定方法は前出のAWSブログに記載したのでご確認ください。
2.4.3.3. 並列処理のチューニング for P4V
P4Vを使うと、バージョン管理したいファイルのシンク(サーバからのダウンロード)とサブミット(サーバへのアップロード)の操作が可能です。もちろんP4 CLIでもできますが、ここではP4Vを使った場合の注意点を記載します。
P4Vを利用したシンクは、前出のP4 コミットサーバの「net.parallel.threads」の値が2以上であれば並列処理されます。しかしサブミットは「net.parallel.submit.threads」が2以上の値でもP4Vはシリアル処理します。これはP4Vのデフォルト設定が原因ですが、P4Vの設定を変更することでサブミットも並列処理されるようになります。
これは検証でかなりハマったのでご注意ください。
3. テスト結果
3.1. テスト環境
P4 コミットサーバ
RockyLinux 8.9 4コア 8GB, 10Gbps, 200GB (オンプレ仮想Linuxマシン)
クラウド接続用のネットワーク回線
インターネットVPN回線 1Gbps Nuro光 Biz Standard (実効帯域 800~900Mbps)
P4 プロキシサーバ
Red Hat Enterprise Linux 9.4
c5n.xlarge, 4コア 10.5GB, 25Gbps, EBS 60GB (gp3, 10000iops, 1000Mbytes/s)
P4 クライアント(P4V)
Windows Server 2016
c5n.xlarge, 4コア 10.5GB, 25Gbps, EBS 60GB (gp3, 10000iops, 1000Mbytes/s)
ONTAPストレージ (オンプレオリジンストレージ)
FAS2820 4TB NL-SAS x12本、10Gbps NIC
FSx for ONTAP (クラウドキャッシュストレージ)
スループットキャパシティ:512MBytes/s
IOPS:10000
Performance Tier:1TB
3.2. テストパターン
AWS上に立てたP4Vから、5パターンのシンク(ダウンロード)操作をしてみました。
- オンプレのP4 コミットサーバにアクセス
- AWS上のP4 プロキシサーバにアクセス (EBSをキャッシュ領域として利用) - 1回目
- AWS上のP4 プロキシサーバにアクセス (EBSをキャッシュ領域として利用) - 2回目
- AWS上のP4 プロキシサーバにアクセス (FSxのキャッシュストレージを活用) - 1回目
- AWS上のP4 プロキシサーバにアクセス (FSxのキャッシュストレージを活用) - 2回目
このパターンのうち、3.と5.が高速になる想定です。
3.3. テスト結果
テスト結果は以下となりました。
| テストパターン | 転送レート(ビット) | ボトルネック |
|---|---|---|
| 1 | 400~800 Mbps | インターネットVPN回線 |
| 2 | 300~700 Mbps | インターネットVPN回線 |
| 3 | 3000~5800 Mbps | EC2インスタンスのEBS帯域幅 ? |
| 4 | 500~800 Mbps | インターネットVPN回線 |
| 5 | 3000~4200 Mbps | FSx fo ONTAPのスループット容量 ? |
今回はP4 プロキシサーバとP4Vにc5n.xlargeを使ったため、キャッシュが効いている状態ではEBS帯域幅のボトルネックがあったと推測できます。
※ c5n.xlargeインスタンスのEBS帯域幅とNetwork性能
https://aws.amazon.com/jp/blogs/aws/new-c5n-instances-with-100-gbps-networking/

また、FSx for ONTAPも第一世代の512MBytes/sで作成したので、ビット換算で4Gbps程度の性能となりました。
https://docs.aws.amazon.com/ja_jp/fsx/latest/ONTAPGuide/performance.html

ちなみに、ここからさらに性能を上げるための対処方法とメリデメについて検討してみました。
テストパターン3の対処方法 - ストレージキャッシュを使わない場合
- P4 プロキシサーバのEC2インスタンスを大きなものにして、EBS帯域幅を広げる
この検証ではgp3のEBSの性能は十分に設定してあるにもかかわらず、インスタンスのEBS帯域幅ネックになっているようでした。c5n.9xlargeなどの大きなインスタンスにするとEBS帯域幅は7Gbpsまで増やすことができます。しかし不要なvCPUやメモリなども増えてしまい、コストが急上昇する点に注意が必要です。 - EBSを使わずに、インスタンスストアをキャッシュ領域に使う
EBS帯域幅がネックなのであれば、インスタンスストアを活用することで小さなインスタンスを使って性能を出すことができるようになります。m5dn系のインスタンスストアは割当たる容量が少ないため、

i3en系のインスタンスを利用すると安くて高速なP4 プロキシサーバを立てることができます。

ただし、頻繁にP4 プロキシサーバをシャットダウンする場合には運用が手間になるかもしれません。
(起動時にインスタンスストアのフォーマットとマウントの作業が必要なため。)
テストパターン5の対処方法 - ストレージキャッシュを活用する場合
- FSx for ONTAPのスループット容量を増速する
第一世代のFSx for ONTAPは128~2048MBytes/s、第二世代は386~6144MBytes/sの間で性能を変更できます。そのためEBS帯域幅が狭いインスタンスでもネットワーク帯域幅が大きければ性能を出しやすくなります。m5nやc5nといったインスタンスとFSx for ONTAPのストレージキャッシュと組み合わせることで低コストのまま性能を向上させることができるでしょう。
4. まとめ
今回はP4 コミットサーバとP4 プロキシサーバの連携手順からチューニングポイント、サイジングのコツなどを記載しました。もしリモート拠点が海外になる場合は、P4 プロキシサーバではなくてP4 エッジサーバとの連携が必要になることもありますが、その検証も終わっているので機会があればどこかで共有したいと考えています。
この内容がPerforceをこれから使ってみたい方や、リモート拠点とのデータ連携に課題を抱えている方の参考になれば幸いです。




