isolcpusが有効になっていることをどのように検出しますか?

isolcpusが有効になっていることをどのように検出しますか?

たとえば、サーバーに初めて接続するときに isolcpus が有効になっているか、どの CPU にあるかを検出する方法などがあります。状況:

移行する場所を確認するためのプロセスは作成されません。

ユースケースは、6コアi7で起動するとisolcpusが有効になっていないようです。カーネル内でも可能なものでも、isolcpus=1-7isolcpusのアクティブ化の明確な状態に関連するCPUを提供できるかどうか疑問に思います。ユーザー空間で読むことができます。あるいは、isolcpusが最初に焦点を当てるスケジューラのアクティビティ設定を読んでください。/proc//sys

稼働時間が高すぎるdmesgため、起動時にエラーを検出するために起動ログが表示されなくなることを検討してください。基本的な答えは「カーネルコマンドラインの表示「受け取れません:)

答え1

あなたが探しているものはこのダミーファイルにあります:

/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プロセッサモードにあると誤って信じ、好みマスクをリセットして「エラー修正」を試みるいくつかのプロセスによってフォークされます。この場合、CPUS 1-6の代わりに0-5を分離して動作していることを確認できます。

答え2

このような場合を検出する最も簡単な方法の1つは、実行時にどのパラメータがカーネルに渡されるかを確認すること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実行中のカーネルにパラメータとして渡されます。

tasksetPID 1へのポインタを使用することもできます。 PID 1は、カーネルが開始した最初のジョブの標準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

ご覧のとおり、lscpu4つのCPU /コアが表示され、taskset0、1のみが表示されるため、isolcpusここではすべてが正しく機能していることを示しています。

見てください:実行中のプロセスに対して排他的なCPU可用性を保証する方法は?

答え3

確認できますCPU_許可そしてCPU_allowed_list現在のシェルプロセスを確認して、どのCPUが予約されているかを確認してください。

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

例えば

Cpus_allowed_list:      0-1, 3-5

CPU = 2がisolcpus6つのCPUサーバー用に予約されていることを意味します。

関連情報