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