PIDが400,000を超えると確認されます。理由は何ですか?これは何かが間違っていることを意味しますか?

PIDが400,000を超えると確認されます。理由は何ですか?これは何かが間違っていることを意味しますか?

今日、私のプロセスIDが400,000(例:449624)で非常に高いことを確認しました。私は走っていたときにps -ef | moreこれを見つけました。これは正常ですか、それとも問題があることを示していますか?それ以外の場合、スクリプトは正常に実行されます。

私はRedhat 7.3 x64ビットを使用しています。

私が気づいたもう一つのことは、Redhat 7.2もあり、pidがそれほど高くなく、最新のOSでのみ可能であるということです。なぜですか?これはOSに関連していて正常であることを意味しますか?

kernel_pid_max私のものにはそのようなものはありませんsysctl.conf。私は猫を走り/proc/sys/kernel/pid_max、それを得た458752

答え1

起動時に、カーネルはpid_max使用可能なCPUの数に基づいてデフォルト値を調整します。数値が小さい場合は、一般的な32768が選択されます。そうでない場合、計算は次のようになります(ここに示されている3.10カーネルはRHELに似ていますが、いくつかの変更を除けば最近のLinuxカーネルと同じです)。

include/linux/threads.h:

/*
 *これはプロセスに割り当てられるデフォルトの最大PIDを制御します。
 */
#PID_MAX_DEFAULT定義(CONFIG_BASE_SMALL?0x1000:0x8000)

0x8000 = 32768 は、使用可能な CPU スレッドが 32 未満のシステムで一般的に使用される値です。

それから:

#PIDS_PER_CPU_DEFAULT 1024定義

その後、この値を使用してkernel/pid.c:

int pid_max = PID_MAX_DEFAULT;

そして〜の後:

    /* CPUの数に応じてデフォルト値と最小pid_maxを調整します*/
    pid_max = min(pid_max_max, max_t(int, pid_max,
                PIDS_PER_CPU_DEFAULT * num_possible_cpus()));
    pid_max_min = max_t(int, pid_max_min,
                PIDS_PER_CPU_MIN * num_possible_cpus());
    pr_info("pid_max: デフォルト: %u 最小値: %u\n", pid_max, pid_max_min);

したがって、OPの観点から、これは合計458752/1024 = 448個の使用可能な同時スレッドを意味します。かなり多いです。他のシステムにはCPU/コア/スレッドなどが多くない場合があるため、デフォルト値は低くなりますpid_max

答え2

~からproc出荷書類ビーチ:

32ビットプラットフォームでは、32768はpid_maxの最大値です。 64ビットシステムでは、pid_maxは最大2^22(PID_MAX_LIMIT、約400万)の値に設定できます。

を使用して照会することもcat /proc/sys/kernel/pid_maxできますsysctl

sudo sysctl -a | grep kernel.pid_max

または:

sysctl -n kernel.pid_max

/etc/sysctl.conf値を永久に変更するように変更し、reloadを使用してくださいsysctl -p

答え3

プロセスIDは、pid_tオペレーティングシステム固有のタイプとして表示される任意の値にすることができます。実際、これは通常32ビット符号付き整数です。つまり、最大プロセスIDは2147483647、または現在見ているプロセスIDより約5000倍大きいことを意味します。

これGNUドキュメント説明する:

データ型:PID_t

データpid_t型は、プロセスIDを表すことができる符号付き整数型です。 GNU Cライブラリでは、これはint

実際、カーネルは通常、それより低い制限を適用します。 Linuxシステムでは、によって制御され、/proc/sys/kernel/pid_maxデフォルト値は32768です。システムがLinuxの場合は、ファイルを確認して現在の制限が何であるかを確認できます。

オペレーティングシステムごとに制限が異なる場合があります。たとえば、次のようになります。macOSではPID_MAX99999にハードコードされています。

関連情報