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