isolcpusがアクティブ化されているかどうかを検出する方法


15

isolcpusがアクティブで、どのcpusであるかを検出する方法。たとえば、サーバーに初めて接続したとき。条件:

移行先を確認するプロセスを生成しません。

ユースケースはisolcpus=1-7、6コアi7で、ブート時にisolcpusをアクティブ化しないようです。isolcpusのアクティブ化の明確なステータスを提供するために、から/proc//sysまたはユーザー空間で読み取ることができるカーネル内部が可能かどうかを知りたいです。どのCPUが関係しているか。または、isolcpusが最初に懸念するスケジューラのアクティブ設定を読み取ることもできます。

稼働時間は非常に大きいためdmesg、起動時にエラーを検出するための起動ログを表示しないことを考慮してください。「カーネルコマンドラインを見てください」のような基本的な答えは受け入れられません:)


1
あなたは使用することができますpidstat -C isolcpus。pidstatはsysstatパッケージからのものです。
ティモシープーリアム2017年

2
馬鹿げているかもしれませんが、pidstatとの間にリンクはありませんisolcpus。もう少し詳しく説明してもらえますか?
netmonk 2017年

コマンドが実行されているCPUを知る必要があると言います。何なのかisolcpusはわかりませんpidstatが、-C process_nameフラグを渡すと、プロセスが実行されているCPUを確認できます。たとえばpidstat -C top、以下を生成します。 10:56:52 AM PID %usr %system %guest %CPU CPU Command 10:56:52 AM 3457 0.00 0.00 0.00 0.00 6 top
ティモシープーリアム2017年

2
お返事ありがとうございます。isolcpusカーネル・パラメーターであり、分離されている場合、スケジューラーがプロセス自体をマイグレーションしないように強制します。たとえば、8つのCPUサーバーisolcpus=1-7でのカーネルコマンドラインでは、initによって生成されたすべてのプロセスと、シェル内の任意の種類のコマンドがCPU0でのみ実行されます。分離されたCPUでタスクを実行するには、例を使用してタスクを起動する必要がありますtaskset。だから私が求めていることに関して、あなたの答えはトピックから外れているようです。とにかく私に答えてくれてありがとう
netmonk 2017年

1
このようなことは本当に難しいことではありません...
user997112

回答:


17

あなたが探しているものはこの仮想ファイル内にあるはずです:

/sys/devices/system/cpu/isolated

そしてその逆

/sys/devices/system/cpu/present    // Thanks to John Zwinck

drivers/base/cpu.c我々はソースが表示されたことを確認すると、カーネル変数でありますcpu_isolated_map

static ssize_t print_cpus_isolated(struct device *dev,
    n = scnprintf(buf, len, "%*pbl\n", cpumask_pr_args(cpu_isolated_map));
...
static DEVICE_ATTR(isolated, 0444, print_cpus_isolated, NULL);

そして、cpu_isolated_mapまさにkernel/sched/core.cブート時に設定されるものです:

/* Setup the mask of cpus configured for isolated domains */
static int __init isolated_cpu_setup(char *str)
{
    int ret;

    alloc_bootmem_cpumask_var(&cpu_isolated_map);
    ret = cpulist_parse(str, cpu_isolated_map);
    if (ret) {
            pr_err("sched: Error, all isolcpus= values must be between 0 and %d\n", nr_cpu_ids);
            return 0;
    }
    return 1;
}

あなたが観察されるように。しかし、誰かが、デーモン、生成されたものも含め、プロセスの親和性を変更している可能性がありcronsystemdそうでと。その場合、新しいプロセスは、によって設定されたものではなく、変更されたアフィニティマスクを継承して生成されisolcpusます。

したがって、上記はisolcpus要求どおりに表示されますが、それでも役に立たない可能性があります。

あなたがそれを見つけると仮定するとisolcpus、この不要な振る舞いは、発行されていますが、「とら」されていませんでしたいくつかのプロセスは、それだけにバインドされていることを実現することによって導出されCPU=0、それが誤ってモノプロセッサモードであると信じ、そして親切に「セットものにしようと、アフィニティマスクをリセットすることにより、「正しい」。その場合は、1〜6ではなく0〜5のCPUを分離して、これが機能するかどうかを確認します。


1
Centos 7.xでテストされて/sys/devices/system/cpu/possibleいますが、「リバース」の解釈方法によっては、「リバース」ではないように見えることに注意してください。たとえば、孤立していたために.../cpu/isolated戻る場合は2,4.../cpu/possibleが返され0-191ます。
bgura

1
ほとんどの人は/sys/devices/system/cpu/present/sys/devices/system/cpu/possibleどのCPUが存在する可能性があるか(現在は存在しない可能性があるか)を示すのではなく、どのCPUが存在するかを示すことを望んでいると思います。一部のシステムではそれらは同じですが、私がチェックしたかなり基本的なデスクトップであっても、同じではありません。
John Zwinck

@JohnZwinckグッドキャッチ。回答の修正
LSerni

1
isolcpus = 0および4コアでは、/ isolated = 0および/ present = 0-3になります。
ステファンライヒ

10

かどうかを検出する簡単な方法の一つisolcpusコンサルティングているprocランタイムでカーネルに渡されたパラメータを参照してください。

そのためには、以下を使用します。

$cat /proc/cmdline 
BOOT_IMAGE=/boot/vmlinuz-4.8.0-1-amd64 root=/dev/sda1 ro isolcpus=2,3 quiet

ご覧のとおり、この特定の例でisolcpus=2,3は、実行中のカーネルに引数として渡されました。

また、tasksetpointed to PID 1を使用することもできます。PID1は、カーネルによって起動される最初のタスクの標準PIDであるため、作業しているかどうかを反映するかなり良い指標と見なすことができますisolcpus。のように:

$taskset -cp 1
pid 1's current affinity list: 0,1

lscpu同じサーバーでのコマンドとの比較:

$lscpu | grep CPU.s
CPU(s):                4
On-line CPU(s) list:   0-3
NUMA node0 CPU(s):     0-3

ご覧のとおり、lscpuは4つのCPU /コアをtaskset表示しisolcpusていますが、0,1しか表示していないため、このショーはここで機能しています。

でに見て:実行中のプロセスのための排他的なCPUの可用性を確保するためにどのように?


回答してくれてありがとうございます、しかし私はそれを受け入れません。カーネルコマンドラインについての回答は受け付けないことを指定しました。私は明らか/proc/cmdlinegrub.confファイルの内容の正確なコピーがどれであるかを知っています。これは私が尋ねたものではありません!とにかくありがとうございました !
netmonk 2017年

答えを追加しました。
Rui F Ribeiro 2017年

1
以前にプロセスセットとタスクセットの親和性を変更した人は何ですか?誰かが初期アフィニティをcpu 0のみに設定した場合、それはisol cpuのアクティブ化または非アクティブ化に関する情報を私に与えますか?
netmonk 2017年

1

現在のシェルプロセスのCpus_allowedおよびCpus_allowed_listを確認して、どのCPUが予約されているかを確認できます。

cat /proc/$$/status|tail -6

例えば

Cpus_allowed_list:      0-1, 3-5

cpu = 2がisolcpus6 CPUサーバーで予約されたことを意味します


2
実は違う。現在のシェルプロセスによって継承されたアフィニティマスクにどのCPUがあるかを示します。たとえばでsshあり、親のアフィニティを手動でsshdCPU 1に制限した場合、isolcpus「取得」されたかどうかに関係なく、常にCPU 1が表示されます。$$枝は、あなたのプロセス継承した値ではなく、元のシステムのものを提供します。
LSerni 2017年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.