400,000以上のPIDが表示されるのはなぜですか?何かが間違っていることを示していますか?


13

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

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

私が気づいたもう1つのことは、Redhat 7.2もあり、新しいOS上ではpidがそれほど高くないことです。どうしてですか?OSに関連した正常なものですか?

私はそれを持っていないkernel_pid_max私にsysctl.conf。私は猫を走った/proc/sys/kernel/pid_maxと私は見ます458752


あなたは持っていないkernel_pid_maxあなたにsysctl.confそれがあるべきためkernel.pid_max
JRFerguson

プロセスIDが大きいということは、マシンが起動してから多くのプロセスを開始したことを意味します。プロセスが開始されるたびに、カーネルは、最後に使用したものよりも大きい次の使用可能なプロセスIDを割り当て、最大値に達するとロールオーバーします。
chepner

回答:


19

ブート時に、カーネルpid_maxは使用可能なCPUの数に応じてデフォルトを調整します。数が少ない場合、通常の32768が選択されます。それ以外の場合、計算は次のように実行されます(ここでは3.10カーネルがRHELに似ていることを示していますが、いくつかのバリエーションは最近のLinuxカーネルでも同じです)。

include/linux/threads.h

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

0x8000 = 32768は、32 CPUスレッド未満のシステムで使用される通常の値です。

以降:

#define PIDS_PER_CPU_DEFAULT 1024

これらの値は次で使用されkernel/pid.cます。

int pid_max = PID_MAX_DEFAULT;

そして、後

    / * cpusの数に基づいてデフォルトおよび最小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


1
例:SuperServer 7089P-TR4Tには224個のコアがあるため、448個のスレッドがあります。
AB

16

documentatonproc

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値を永続的に変更するように変更し、でリロードしsysctl -pます。


7

プロセス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としてハードコードされているようです。


3
Linuxには、pidが31ビットのスペースを満たすことができないという基本的なAPIの理由があります。(符号ビットに加えて)上位2ビットは、堅牢なfutexおよびPI futexインターフェイスの特別な目的のために予約されています。512M pidスペースの場合、残りは29ビットのみです。
R .. GitHub STOP HELPING ICE

1
@R .:もちろん、それはLinuxにも当てはまります。しかし、この答えを書いたとき、質問はLinuxを指定していなかったので、Unixについても答えました。私の知る限り、POSIX標準にはpidに特定のサイズを必要とするものはありません。今は不要に思えますpid_tが、64ビットサイズの将来のシステムを想像できます。
ダニエル・プライデン

確かにそれはすべて真実です。
R .. GitHub停止ヘルプICE
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.