Apa yang Anda cari harus ditemukan di dalam file virtual ini:
/sys/devices/system/cpu/isolated
dan sebaliknya di
/sys/devices/system/cpu/present // Thanks to John Zwinck
Dari drivers/base/cpu.c kita melihat bahwa sumber yang ditampilkan adalah variabel kernel 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);
dan cpu_isolated_map persis seperti yang diatur oleh kernel/sched/core.c saat boot:
/* 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;
}
Tapi seperti yang Anda amati, seseorang dapat memodifikasi afinitas proses, termasuk proses yang dimunculkan daemon, cron , systemd dan seterusnya. Jika itu terjadi, proses baru akan muncul dengan mewarisi topeng afinitas yang dimodifikasi, bukan yang ditetapkan oleh isolcpus .
Jadi di atas akan memberi Anda isolcpus seperti yang Anda minta, tetapi itu mungkin tetap tidak membantu.
Misalkan Anda mengetahui bahwa isolcpus telah dikeluarkan, tetapi belum "diambil", perilaku yang tidak diinginkan ini bisa diturunkan oleh beberapa proses menyadari bahwa itu terikat hanya CPU=0 , percaya itu dalam mode monoprosesor karena kesalahan, dan membantu mencoba untuk "memperbaiki keadaan" dengan mengatur ulang topeng afinitas. Jika demikian, Anda dapat mencoba dan mengisolasi CPUS 0-5 alih-alih 1-6, dan lihat apakah ini berhasil.
Salah satu cara yang lebih mudah untuk mendeteksi if isolcpus sedang berkonsultasi dengan proc untuk melihat parameter mana yang diteruskan ke kernel pada waktu proses.
Untuk itu, Anda akan menggunakan:
$cat /proc/cmdline
BOOT_IMAGE=/boot/vmlinuz-4.8.0-1-amd64 root=/dev/sda1 ro isolcpus=2,3 quiet
Seperti yang Anda lihat, dalam contoh khusus ini isolcpus=2,3 diteruskan sebagai argumen ke kernel yang sedang berjalan.
Anda juga dapat menggunakan taskset menunjuk ke PID 1. Karena PID 1 adalah PID standar untuk tugas pertama yang diluncurkan oleh kernel, kita dapat mengambil indikasi yang cukup bagus bahwa ini akan mencerminkan apakah kita memiliki isolcpus bekerja. Seperti di:
$taskset -cp 1
pid 1's current affinity list: 0,1
Bandingkan dengan lscpu perintah di server yang sama:
$lscpu | grep CPU.s
CPU(s): 4
On-line CPU(s) list: 0-3
NUMA node0 CPU(s): 0-3
Seperti yang bisa dilihat, lscpu menunjukkan 4 CPU/core, sedangkan taskset hanya menampilkan 0,1, jadi ini menampilkan isolcpus bekerja di sini.
Lihat:Bagaimana cara memastikan ketersediaan CPU eksklusif untuk proses yang sedang berjalan?
Anda dapat mencentang Cpus_allowed dan Cpus_allowed_list untuk proses shell saat ini untuk melihat cpu apa yang dicadangkan
cat /proc/$$/status|tail -6
misalnya
Cpus_allowed_list: 0-1, 3-5
berarti cpu=2 dicadangkan oleh isolcpus pada server 6 CPU