web-dev-qa-db-ja.com

Sun Grid Engine(SGE)のh_rssとh_vmemの違いは何ですか?

私が理解している限り、

  • mem_freeを指定して、メモリの空きのあるホストでジョブを送信できます= mem_free
  • h_vmemは、ジョブが消費できるメモリのハード制限です。ジョブがh_vmemに到達すると、ジョブがクラッシュしますか?ホストのh_vmemを合計物理メモリの近くに設定すると、ジョブがスワップの使用を開始せず、サーバーの速度が低下する可能性があると思います。

次に、h_rssとは何ですか? h_vmem.と同じ定義のようです

または、h_vmemを誤って解釈していますか? h_vmemは、必要な最小メモリ(mem_free)よりも必要となる可能性がある追加メモリを予約するために使用されますか?ただし、メモリを超えてもクラッシュしないので、ジョブはh_vmemを超える可能性があります。

h_vmemの2番目の解釈が正しい場合、私は、ジョブがホストで送信されるためには、そのジョブはmem_freeh_vmemの両方を満たす必要があると思います(与えられたh_vmemはINFINITYではありません)。

そして、私の最初のh_vmemの解釈が正しい場合、私は、ジョブがホストで送信される場合、そのジョブはmem_freeのみを満たし、h_vmemを満たす必要はないと推測します。利用可能なスペースを予約するだけで、利用可能なスペースがない場合は問題ありませんか?

3
GP92

リソースが消費可能かどうか、およびシステムでどれだけ予約できるかは、構成可能です。既存の値のいずれかを使用することも、自分で新しい値を作成することもできます。

とにかく設定しても害はありませんが、mem_freeはデフォルトでは使用できません。つまり、ジョブの開始時にシステムで利用可能なメモリ容量が必要ですが、10 GBの空きメモリを必要とする10個のジョブをすべて、11 GBの空きメモリを搭載したサーバーで同時に開始できます。それらすべてが実際に10GBを使用している場合、問題が発生します。

他の違いは強制に帰着します。 rss(物理メモリ使用量)は強制されません。 vmem(仮想メモリ使用量)です。残念ながら、Linuxは物理メモリの使用を強制する良い方法を提供していません(cgroupは問題ありませんが、rss ulimitは最近のカーネルでは実際には何もしません)。

一方、vmemを消費可能なリソースとして扱う正しい方法はありませんであることを認識することは非常に重要です。 -fsanitize=addressデバッグオプション(clangまたはgcc5 +で利用可能)を使用してCで「hello world」をコンパイルすると、20TBの仮想メモリが使用されますが、5MB未満の物理メモリが使用されます。 JavaおよびGoのようなガベージコレクションされたランタイムは、メモリの断片化を減らすために、物理メモリとして反映されない大量のvmemも割り当てます。すべてのchromeタブ私の8 GBラップトップでは、セキュリティサンドボックスの一部として2 TBの仮想メモリを使用します。これらはすべて、プログラムが実行するのにまったく妥当なことであり、下限を設定すると、完全に正常に動作するプログラムが機能しなくなります。同様に、消費可能な制限を設定するとシステム上の20TBのvmemは無意味です。

何らかの理由でh_vmemを使用する必要がある場合、h_バリアントとs_バリアントの違いは、制限を超えるプロセスを強制終了するために使用される信号です-h_はSIGKILLでプロセスを強制終了します(例kill -9)に対して、s_はプロセスが処理できるシグナルを使用します(正常に動作するジョブが正常にシャットダウンするか、正常に動作しないジョブがシグナルを無視できるようにします)。最善のアドバイスは、vmemの制限が本質的に破られているので最初に泣き、次にh_vmemをs_vmemよりわずかに高く設定して、ジョブが有用なエラーメッセージで終了する機会を与えることです。

私のアドバイスは、クラスター管理者がh_rssを消費可能に構成し、ジョブテンプレートでh_rssとmem_freeの両方を設定し、h_vmemを完全に回避し、メモリが不足してシステムが乱用されないようにすることです。実施メカニズムが必要な場合、それは複雑ですが、ジョブをメモリcgroupに配置し、memory.limit_in_bytesまたはmemory.soft_limit_in_bytesを設定するようにジョブマネージャを設定できます。後者の場合、システムがメモリ不足にならない限り、cgroupは予約を超えることができます。これにより、これらのプロセスに代わってファイルをキャッシュするカーネルの機能が向上し、すべてのユーザーのパフォーマンスが向上しますが、システムがメモリ不足になると、OOMキラーが見回す時間がないというリスクがあります。プロセスが制限を超えたcgroupから強制終了する場合、代わりに試行された割り当ては失敗します。

3
Adam Azarchs

わかりました。実行サーバーで実行中のジョブプロセスの/proc/<pid>/limitsを確認することで、この答えを見つけました。

  • h_rss=10Gを使用してジョブを送信すると、制限内でMax Resident Setの値が10737418240バイト(10G)に設定されます。 (OSのデフォルト値は無制限です)したがって、プロセスはこれ以上メモリを使用できません。また、h_rssは消耗品ではありません。

  • h_vmem=50Gを使用してジョブを送信すると、制限内でMax Resident Setの値はnlimitedに等しくなります。したがって、それは50Gを超えて継続できます。ただし、それは消費可能であるため、ホストのh_vmem50Gによって削減されます。

    これは、次のコマンドを実行して確認できます。

    • qhost -h <hostname> -F h_vmem、ここでh_vmemは現在のh_vmem値を示し、
    • qconf -se <hostname>、complex_valuesのh_vmemは、割り当てられたh_vmem値を示します。
4
GP92