Linuxが「可能な」CPUの数を検出する方法

Linuxが「可能な」CPUの数を検出する方法

私は8つのコアと1コアあたり2つのスレッドを備えたAMD CPUを持っています。 Linuxは(正確に)これを16「cpus」とマークします。ただし、sysfsは実際には32個の「可能な」CPUを表示し、そのうち16個は存在せず、オフラインです。

$ cat /sys/devices/system/cpu/possible
0-31

$ cat /sys/devices/system/cpu/present
0-15

$ cat /sys/devices/system/cpu/online
0-15

$ cat /sys/devices/system/cpu/offline 
16-31

明らかに、ここに間違ったことはありません。実際には16個の論理CPUが存在し、オンラインです。私にとって明確ではないのは、Linuxが存在しないが存在できる追加の16個の論理CPUを検出する理由です。

私はこれが関連カーネル文書だと思います。https://www.kernel.org/doc/html/latest/core-api/cpu_hotplug.html。ただし、可能なCPUの数を選択する方法についての指示はありません。 (kernel_max私のシステムのCPU番号8191よりはるかに低いです。)

(少し余分な背景情報:この値を解析する必要があるコードがあります。正しいことをするのに十分簡単ですが、明確なドックストリングの説明が必要です。なぜ利用可能なCPUの数は、一般的なデスクトップコンピュータで利用可能なCPUの数を超える可能性があります。 )

ベストアンサー1

カーネルメモリに十分なスペースがあると、CPUは「可能」になります。可能なCPUの数は、起動後にホットスワップ可能なCPUを含むオンラインになることができるCPUの最大数です。

sysfsのこの部分のドキュメントは次のとおりです。sysfsを介してCPUトポロジ情報をエクスポートする方法:

可能:リソースが割り当てられていてオンラインになることができるCPUです(存在する場合)。 [cpu_可能な_マスク]

しかし、より詳細な文書cpu_possible_maskカーネルのCPUホットプラグ:

システムで使用できるCPUのビットマップ。これは、CPUが使用可能になったり削除されたりしたときに増加または減少しないper_cpu変数にいくつかの開始メモリーを割り当てるために使用されます。ブート時間検索フェーズで設定されている場合、マップは静的です。つまり、いつでもビットは追加または削除されません。事前にシステム要件に合わせて正確に調整することで、起動時間メモリを節約できます。

このパラメータは次のように設定できます。コマンドラインオプション。可能であれば、ハードウェアが再起動なしで他のCPU接続をサポートしておらず、システムを休止状態にしてより多くのCPUウェイクアップを使用する予定がない場合は、コマンドラインに渡して少量のカーネルpossible_cpus=16メモリを節約できます。 。一般的なPCやサーバーでは、この量が小さすぎて努力する価値がないかもしれません。

コマンドラインオプションがなければ必要だと思います。ソースコードを読む何が起こっているのか調べてください。カーネルがCPUホットプラグ対応(CONFIG_HOTPLUG_CPU)なしでコンパイルされると、起動時に使用可能なCPUの数だけがチェックされます。prefill_possible_mapソースコードの説明に従ってカーネルにCPUホットプラグ対応がある場合:

  • BIOSがACPI / mptablesで無効になっているCPUを指定すると、そのCPUが使用されます。
  • ユーザーはavailable_cpus = NUM​​でそれを上書きできます。
  • それ以外の場合は、追加のCPUを予約しないでください。

これがコードが何をしているのかを確認しませんでした。

「可能なCPU」の意味はすべてのアーキテクチャに適用されますが、CPUの数を決定する方法はアーキテクチャによって異なります。私の答えはx86を仮定しています。

おすすめ記事