web-dev-qa-db-ja.com

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

Isolcpusがアクティブ化されているかどうか、およびどのcpusを使用しているかを検出する方法。たとえば、サーバーに初めて接続したとき。条件:

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

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

稼働時間は非常に大きいため、dmesgは起動時のエラーを検出するための起動ログを表示しないことを考慮してください。 「look at kernel cmd line "のような基本的な答えは受け入れられません:)

15
netmonk

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

/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に分離して、これが機能するかどうかを確認します。

17
LSerni

isolcpusprocを参照して実行時にカーネルに渡されたパラメーターを確認しているかどうかを検出する簡単な方法の1つ。

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

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

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

PID 1を指すtasksetを使用することもできます。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は0,1しか表示していないため、isolcpusがここで機能していることがわかります。

以下をご覧ください 実行中のプロセスに対して排他的なCPUの可用性を確保する方法

10
Rui F Ribeiro

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

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

例えば

Cpus_allowed_list:      0-1, 3-5

cpu = 2が6 cpusサーバーのisolcpusによって予約されたことを意味します

1
valentin