システムレベルでのCおよびJavaプログラムのCPUおよびメモリ使用量を制限します。

システムレベルでのCおよびJavaプログラムのCPUおよびメモリ使用量を制限します。

私はCとJava用のオンラインコードエディタを作成しています。ユーザーは無限ループを作成する可能性が高いです。システムレベル設定でこれらのプロセスのCPUとメモリ使用率を制限する方法はありますか?

私のバックエンドは、ユーザーからコードを受け取り、コンパイルして実行するnodejsプロセスです。特定のCPUとメモリ制限を超えた場合は、プロセスを終了したいと思います。

ベストアンサー1

はい、2つの主な方法は、setrlimit(2)および(Linuxの場合)制御グループです。

主な利点setrlimitは、単純さと移植性(POSIXで指定されているように)です。fork次に制限を設定してRLIMIT_ASからRLIMIT_CPUコードexecを設定します。欠点はプロセス固有であるため、コードがまだ制限を超えている可能性があることです(フォークするすべてのプロセスは同じ制限を持ちますが、共有されるわけではありません)。失敗RLIMIT_NPROCするように設定することもできますfork(もちろん、分岐が必要なコードはテストできません)。

制御グループの主な利点は、プロセスとすべての子プロセスを一緒に処理できることです。つまり、組み合わせの制限があります。欠点は、移植性がなく(Linuxのみ)、複雑性が高いことです。システムが制御グループを管理している場合は、systemd と対話する必要があります。 cgroupの最良の紹介は次のとおりです。LWNのNeil BrownのControl Groupシリーズ

別のアプローチは、(少なくともKVMの場合)ホストのマイナープロセスになるようにVMでコードを実行することです。より重いが、多くの分離機能を提供します。

また、注意事項としてたくさん信頼できないランダムなコードを実行すると、無限ループよりも心配する方が多くなります。たとえば、誰かがスパムボットをアップロードしたくないと思います。既存の実装を調べることをお勧めします。しかし、私が知っている限り、その実装はオープンソースではありません。

おすすめ記事