Linuxは、特定のしきい値に達した後に重く長時間実行されるバックグラウンドプロセスを終了しますか?

Linuxは、特定のしきい値に達した後に重く長時間実行されるバックグラウンドプロセスを終了しますか?

非常に長い間実行されている非常に重い(メモリ/ CPU集約型)プロセスを開始すると、しばらくすると、OSはランダムにそのプロセスを終了しますか?
つまり、オペレーティングシステムがバックグラウンドプロセスの実行を停止する制限はありますか?
これらの制限を設定できますか?それらはどこで定義されていますか?

答え1

はい、実際にはそのような制限があります。彼らが電話するリソース制限(r限界)。さまざまな制限があります。 CPU時間、メモリ、オープンファイル数など

カーネルは、プロセスが異なる制限を超えると、プロセスに異なるシグナルを送信します。プロセスが正しく反応しない場合は終了します。

各rlimitには2つの値があります。最初は電流制限です。 2番目は最大制限です(設定できる最大制限です)。ルート(より正確にはCAP_SYS_RESOURCE有能なユーザー)のみが最大制限を増やすか、現在の制限を最大制限より大きく設定できます。

制限を操作するgetrlimit()システムコールがあります。setrlimit()

デフォルトでは、ほとんどのリソース制限には大きな値が含まれているため、制限はありません。もちろん、カーネル設計の制限、利用可能なRAM、ディスクの利用可能なスペースなどにより、実質的な制限がある。

答え2

これらのポリシーを実装する方法はいくつかありますが、基本的に存在しない理由は非常に明白です。システムが最大の可能性を発揮するように設計されているからです。例え:時速200kmの走行車を購入し、燃料タンクが100リットルの場合、速度を100km / hに制限し、タンクが停止したときに停止するソフトウェアで制御することを望まないでしょう。 2/3が空です。 「長時間」運転した場合でも車両を停止してください。

「長期実行」の普遍的な定義はありません。 40分は長い時間ですか? 8時間はどうですか? 24時間? 3日? 1週間、1か月または1年か。このうち、あまり珍しいことはありません。

rasenが言及したリソース制限に関して、これは「該当するポリシーを実施する」主な手段です。実際にこれを行う方法を尋ねていないので、これを説明するのに時間を無駄にしません。しかし、制限事項について質問しました。 CPUとメモリはありません。これはgetrlimit/ setrlimitsystemcalls のマニュアルページから得られたものです:

getrlimit() および setrlimit() システムコールは、それぞれリソース制限を取得して設定します。各リソースには、rlimit構造で定義された関連ソフト制限とハード制限があります[...]RLIM_INFINITY値は、リソースに制限がないことを示します。(getrlimit()によって返された構造とsetrlimit()に渡された構造)。

したがって、これをプログラムで確認するのは比較的簡単です。

#include <stdio.h>
#include <sys/resource.h>
#include <errno.h>
#include <string.h>
#include <stdint.h>

int main (void) {
    struct rlimit rl;
    int resources[] = {
        RLIMIT_CPU,
        RLIMIT_DATA,
        RLIMIT_AS,
        RLIMIT_RSS
    };
    char labels[][16] = { "CPU", "Data", "Virtual", "Resident" };
    int rlen = sizeof(resources) / sizeof(int);
    printf("RLIM_INFINITY is %lu\n", (uint64_t)RLIM_INFINITY);
    for (int i = 0; i < rlen; i++) {
        if (getrlimit(resources[i], &rl) != 0) {
            fprintf(stderr,"!!%s\n", strerror(errno));
            return -1;
        }
        printf("%8s soft: %lu hard: %lu\n",
            labels[i],
            (uint64_t)rl.rlim_cur,
            (uint64_t)rl.rlim_max
        );
    }
    return 0;
}                            

直接コンパイルして試してgcc -std=gnu99みることができます。これはカーネルに直接問い合わせるので、最も明示的な情報源です。誰かが意図的にシステムに制限を設定しない限り、次の結果が表示されます。

RLIM_INFINITY is 18446744073709551615
     CPU soft: 18446744073709551615 hard: 18446744073709551615
    Data soft: 18446744073709551615 hard: 18446744073709551615
 Virtual soft: 18446744073709551615 hard: 18446744073709551615
Resident soft: 18446744073709551615 hard: 18446744073709551615

プログラマ以外の方のために明確に説明すると、「RLIM_INFINITY」の値は「無限大」または無制限を示すための値です(コンピュータは無限大を数値で表現できないためです)。 RLIMITフィールドは、マニュアルページに要約されて説明されています。

RLIMIT_CPU: CPU タイムアウト (秒)。

RLIMIT_DATA:プロセスデータセグメント(初期化データ、初期化されていないデータ、ヒープ)の最大サイズ。

RLIMIT_AS:プロセス仮想メモリ(アドレス空間)の最大サイズ(バイト単位)。

RLIMIT_RSS:プロセスの常駐セット(RAMに常駐する仮想ページ数)の制限(ページ単位)を指定します。

top(CPU、DATA、VIRT、RSS)で見られる実際の使用量値に対応します。

繰り返しますが、通常のLinuxシステムではプロセスごとのCPUまたはメモリに制限はありません。しかし、このように設定することができます。

関連情報