Isolcpusがアクティブ化されているかどうか、およびどのcpusを使用しているかを検出する方法。たとえば、サーバーに初めて接続したとき。条件:
移行先を確認するプロセスを生成しません。
ユースケースは、6コアi7のisolcpus=1-7
がブート時にisolcpusをアクティブ化しないようであり、/proc/
、/sys
またはカーネル内部から可能かどうかを知りたいですisolcpusのアクティブ化のステータスとどのCPUが関係しているかを明確にするために、ユーザー空間で読み取ることができます。または、isolcpusが最初に懸念するスケジューラのアクティブ設定も読み取ります。
稼働時間は非常に大きいため、dmesg
は起動時のエラーを検出するための起動ログを表示しないことを考慮してください。 「look at kernel cmd line "のような基本的な答えは受け入れられません:)
あなたが探しているものはこの仮想ファイル内にあるはずです:
/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;
}
しかし、あなたが観察したように、誰かがデーモン起動プロセス、cron
、systemd
などを含むプロセスのアフィニティを変更した可能性があります。その場合、isolcpus
で設定されたものではなく、変更されたアフィニティマスクを継承して新しいプロセスが生成されます。
上記のようにisolcpus
が要求どおりに表示されますが、それでも役に立たない可能性があります。
isolcpus
が発行されたが「取得」されていないことがわかったとすると、この望ましくない動作は何らかのプロセスによって引き起こされる可能性がありますこれはCPU=0
のみにバインドされていることを認識し、誤ってモノプロセッサモードであると信じ、アフィニティマスクをリセットして「正しいものに設定」しようとするのに役立ちます。その場合は、CPUSを1〜6ではなく0〜5に分離して、これが機能するかどうかを確認します。
isolcpus
がproc
を参照して実行時にカーネルに渡されたパラメーターを確認しているかどうかを検出する簡単な方法の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の可用性を確保する方法
現在のシェルプロセスのCpus_allowedおよびCpus_allowed_listを確認して、予約されているCPUを確認できます
cat /proc/$$/status|tail -6
例えば
Cpus_allowed_list: 0-1, 3-5
cpu = 2が6 cpusサーバーのisolcpus
によって予約されたことを意味します