GNU/Linux >> Belajar Linux >  >> Linux

bagaimana cara mendeteksi jika isolcpus diaktifkan?

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


Linux
  1. Bagaimana Mendeteksi Jika Shell Dikendalikan Dari Ssh?

  2. Bagaimana Cara Mendeteksi Bash>=4.0?

  3. Bagaimana cara mendeteksi perubahan alamat IP secara terprogram di Linux?

  1. Bagaimana cara mendeteksi peluncuran program di Linux?

  2. Bagaimana cara mendeteksi dan mengetahui suatu program mengalami kebuntuan?

  3. Bagaimana cara melihat ukuran paket pip yang diinstal?

  1. Bagaimana cara mendeteksi Virtualisasi menggunakan Sys::Detect::Virtualization Perl script?

  2. Bagaimana Mendeteksi Kebocoran Memori?

  3. Bagaimana saya bisa melihat keluaran dmesg saat berubah?