Helix Coreサーバ管理者ガイド: 基本 (2019.1)

データベースへのクエリを制限する

Helixサーバグループには、相互に関連するmaxresultsmaxscanrowsmaxlocktimeという値があります。それぞれデフォルトでは、unsetに設定されていますが、superユーザは、p4 groupコマンドを用いて特定グループに対してこれらの値を制限することができます。

MaxResultsは、コマンド実行中にバッファリングされるデータの量を制限することにより、サーバがメモリを過剰に使用しないようにします。制限されたグループのユーザは、そのグループのMaxResultsの制限値より多くデータベース行をバッファリングするようなコマンドを実行することはできません。(ほとんどのサイトでは、MaxResultsを各ユーザのクライアントワークスペースで想定されるファイルの最大数よりも大きく設定する必要があります。)

MaxResultsと同様に、MaxScanRowsもサーバへ過度の要求がなされるような特定のユーザコマンドを制限します。(通常、1回の操作でスキャンされる行の数は、ディポ内のファイルの平均リビジョン数をMaxResultsに積算した数とほぼ等しくなっています。)

最後に、MaxLockTimeを使用して、特定のコマンドによってデータベースが長時間ロックされないようにします。ミリ秒単位の数値でMaxLockTimeを設定し、データベースのロックを許容する最大時間を指定します。

これらの制限を設定するには、p4 groupのフォーム内の当該フィールドに数値を入力します。1人のユーザが複数のグループに登録されている場合、それらのグループのMaxResults(またはMaxScanRowsもしくはMaxLockTime)制限値の最大値(unlimitedを含むがデフォルトのunset設定を除く最大値)がそのユーザのMaxResults(またはMaxScanRowsもしくはMaxLockTime)値とみなされます。

maxresults、maxscanrowsおよびmaxlocktimeの動作

管理者として、グループrocketdevのメンバーの操作を20,000ファイル以下に、さらにスキャンを100,000リビジョン以下に、そしてデータベーステーブルを30秒以上ロックしないように制限するものとします。

Group:        rocketdev
MaxResults:   20000
MaxScanRows:  100000
MaxLockTime:  30000
Timeout:      43200
Subgroups:
Owners:
Users:
        bill
        ruth
        sandy

ここで、クライアントビューが無制限、loose(「ゆるい」)に設定されているルースが

$ p4 sync

とコマンド入力すると、ディポにファイルが20,000以上ある場合、このsyncコマンドは拒否されます。この制限を回避するには、ルースのクライアントビューを限定するか、あるいはクライントビューで全ファイルが必要であるようなら、次のようにファイルを小セットに分けて同期させます。

$ p4 sync //depot/projA/...
$ p4 sync //depot/projB/...

いずれの方法でも、サーバを極端に負荷の大きい1つのコマンド処理に専念させることなく、ルースは目的のファイルを自分のワークスペースに同期させることができます。

次のように、ルースが全ファイルの全リビジョンをスキャンするようなコマンドを試行したと仮定します。

$ p4 filelog //depot/projA/...

このとき、ファイル数が20,000より少なく、リビジョン数が100,000より多い場合(例えば、projAのディレクトリにファイルが1,000存在し、その各ファイルにリビジョンが20未満で、それぞれに50を超えるブランチが存在するとき)、MaxResultsの制限は適用されませんが、MaxScanRowsの制限が適用されます。

また、どちらの制限が有効であるかにかかわらず、30,000ミリ秒のMaxLockTimeを超えてデータベースをロックするようなコマンドの実行は許可されません。

特定のグループについて、結果として処理される行数(またはスキャンされるデータベースの行数、もしくはデータベースロック時間を示すミリ秒)の制限を解除するには、そのグループのMaxResultsMaxScanRows、またはMaxLockTimeの値をunlimitedに設定します。

これらの制限はユーザに不便を強いることになる可能性があるため、特定の操作がサーバの動作を遅くしているのでない限りは使用しないでください。Helixサーバアプリケーションの中には大規模な処理を行うものもあるため、通例MaxResultsの値を10,000より小さくすることはありません。また、MaxScanRowsは50,000より小さくせず、MaxLockTimeの値は1,000から30,000(1秒から30秒)の範囲内に設定します。

Helixサーバコマンドで影響を受けるファイル数などの詳細については、コマンドラインで以下を実行してください。

$ p4 help maxresults
$ p4 help maxscanrows
$ p4 help maxlocktime

複数グループに含まれるユーザを対象とする場合のMaxResults、MaxScanRowsおよびMaxLockTime

前述のように、ユーザが複数のグループに登録されている場合、所属するすべてのグループのMaxResultsの制限値のうち最大値がそのユーザに適用されます。

デフォルト値unsetは数値上の制限ではありませんMaxResultsunsetに設定されているグループに属するユーザであっても、他のグループに所属していればそのグループのMaxResults(またはMaxScanRowsもしくはMaxLockTime)値の最大値によって制限されます。

ユーザのコマンドが実際に無制限になるのは、そのユーザがどのグループにも属さないとき、あるいは、そのユーザが属するすべてのグループのMaxResultsunlimitedに設定されている場合に限られます。