bagaimana cara mendeteksi jika isolcpus diaktifkan?

15

Cara mendeteksi apakah isolcpus diaktifkan dan pada cpus mana, ketika misalnya Anda terhubung untuk pertama kali pada server. Kondisi:

tidak menelurkan proses apa pun untuk melihat di mana ia akan dimigrasi.

Kasus penggunaan adalah bahwa isolcpus=1-7pada core 6 i7, tampaknya tidak mengaktifkan isolcpus saat boot, dan saya ingin tahu apakah itu mungkin dari /proc/, /sysatau internal kernel yang dapat dibaca di userspace, untuk memberikan status aktivasi yang jelas dari isolcpus dan cpu mana yang terkait. Atau bahkan membaca pengaturan aktif penjadwal yang pertama kali diperhatikan oleh isolcpus.

Pertimbangkan uptime sangat besar, yang dmesgtidak lagi menampilkan log boot untuk mendeteksi kesalahan saat startup. Jawaban dasar seperti " lihat kernel cmd line " tidak akan diterima :)

netmonk
sumber
1
Dapat Anda gunakan pidstat -C isolcpus. pidstat berasal dari sysstatpaket.
Timothy Pulliam
2
Mungkin saya bodoh, tetapi saya tidak melihat tautan antara pidstatdan isolcpus. Bisakah Anda menguraikan lebih banyak?
netmonk
Anda mengatakan Anda perlu tahu CPU apa yang menjalankan perintah. Saya tidak tahu apa isolcpusitu, tetapi pidstatdapat memberi tahu Anda apa proses CPU sedang berjalan jika Anda melewati -C process_nameflag. Misalnya pidstat -C topmenghasilkan yang berikut ini. 10:56:52 AM PID %usr %system %guest %CPU CPU Command 10:56:52 AM 3457 0.00 0.00 0.00 0.00 6 top
Timothy Pulliam
2
Ok terima kasih atas balasan Anda. isolcpusadalah parameter kernel yang memaksa penjadwal untuk tidak memigrasi proses apa pun dengan sendirinya jika mereka terisolasi. Contohnya pada server 8 cpu, isolcpus=1-7di baris perintah kernel, akan memaksa semua proses spawned yang bercabang oleh init dan segala jenis perintah di shell untuk berjalan hanya pada CPU0. Untuk menjalankan tugas pada cpu yang terisolasi, Anda harus menjalankannya dengan tasksetcontoh. Jadi sehubungan dengan apa yang saya tanyakan, sepertinya jawaban Anda di luar topik. Terima kasih sudah mencoba menjawab saya
netmonk
1
Sesuatu seperti ini seharusnya tidak sulit ....
user997112

Jawaban:

17

Apa yang Anda cari harus ditemukan di dalam file virtual ini:

/sys/devices/system/cpu/isolated

dan sebaliknya

/sys/devices/system/cpu/present    // Thanks to John Zwinck

Dari drivers/base/cpu.ckita 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_mappersis seperti yang diatur kernel/sched/core.csaat 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;
}

Tetapi seperti yang Anda amati, seseorang dapat memodifikasi afinitas proses, termasuk yang dihasilkan daemon cron,, systemddan sebagainya. Jika itu terjadi, proses baru akan muncul mewarisi topeng afinitas yang dimodifikasi, bukan yang ditetapkan oleh isolcpus.

Jadi di atas akan memberi Anda isolcpusseperti yang Anda minta, tetapi itu mungkin masih tidak membantu.

Andaikata Anda mengetahui bahwa isolcpusitu telah dikeluarkan, tetapi belum "diambil", perilaku yang tidak diinginkan ini dapat diturunkan dengan suatu proses menyadari bahwa ia terikat hanya pada CPU=0, meyakini bahwa ia berada dalam mode monoprosesor secara tidak sengaja, dan membantu mencoba "mengatur berbagai hal benar "dengan mengatur ulang topeng afinitas. Jika itu masalahnya, Anda dapat mencoba dan mengisolasi CPUS 0-5 bukannya 1-6, dan melihat apakah ini berhasil.

LSerni
sumber
1
Diuji pada Centos 7.x, perhatikan bahwa /sys/devices/system/cpu/possibletampaknya bukan 'terbalik' tergantung pada bagaimana Anda mengartikan 'terbalik'. Misalnya jika .../cpu/isolatedkembali 2,4karena mereka telah diisolasi, .../cpu/possibleakan kembali 0-191.
bgura
1
Saya pikir kebanyakan orang ingin /sys/devices/system/cpu/presentyang menunjukkan CPU mana yang ada, daripada /sys/devices/system/cpu/possibleyang menunjukkan CPU mana yang mungkin ada (tetapi mungkin saat ini tidak ada). Pada beberapa sistem mereka sama, tetapi bahkan pada desktop yang cukup mendasar saya periksa, mereka tidak.
John Zwinck
@ JohnZwinck tangkapan yang bagus. mengubah jawaban
LSerni
1
Dengan isolcpus = 0 dan 4 core, saya mendapatkan / terisolasi = 0 dan / sekarang = 0-3.
Stefan Reich
10

Salah satu cara termudah untuk mendeteksi jika isolcpusberkonsultasi procuntuk melihat parameter mana yang diteruskan ke kernel saat runtime.

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 isolcpus=2,3ini dilewatkan sebagai argumen untuk kernel yang sedang berjalan.

Anda juga dapat menggunakan tasksetmenunjuk ke PID 1. Karena PID 1 adalah PID standar untuk tugas pertama yang diluncurkan oleh kernel, kita dapat menganggapnya sebagai indikasi yang cukup baik bahwa itu akan mencerminkan apakah kita telah isolcpusbekerja. Seperti dalam:

$taskset -cp 1
pid 1's current affinity list: 0,1

Membandingkan dengan lscpuperintah 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 dapat dilihat, lscpumenunjukkan 4 CPU / core, sementara tasksethanya menunjukkan 0,1, jadi ini menunjukkan isolcpusbekerja di sini.

Lihat di: Bagaimana memastikan ketersediaan CPU eksklusif untuk proses yang berjalan?

Rui F Ribeiro
sumber
Terima kasih tuan atas jawaban Anda, tetapi saya tidak akan menerimanya. saya menentukan bahwa jawaban yang berbicara tentang baris perintah kernel tidak akan diterima. Saya jelas tahu tentang /proc/cmdlinemana yang merupakan salinan tepat dari isi grub.conffile. Ini bukan yang saya tanyakan! Bagaimanapun, terima kasih!
netmonk
Saya telah menambahkan jawabannya.
Rui F Ribeiro
1
Apakah seseorang yang sebelumnya memodifikasi afinitas processus dengan tasket? bagaimana jika seseorang menetapkan init afinitas ke cpu 0 saja, apakah itu memberi saya informasi tentang aktivasi atau tidak dari cpu isolasi?
netmonk
1

Anda dapat memeriksa Cpus_allowed dan Cpus_allowed_list untuk proses shell saat ini untuk melihat cpus apa yang dipesan

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

untuk mis

Cpus_allowed_list:      0-1, 3-5

berarti bahwa cpu = 2 dicadangkan oleh isolcpuspada server 6 cpus

valentin
sumber
2
Sebenarnya tidak. Ini menunjukkan apa CPU dalam topeng afinitas yang diwarisi oleh proses shell saat ini. Jika ya, katakanlah, sshdan seseorang secara manual membatasi afinitas induk sshdke CPU 1, Anda akan selalu melihat CPU 1, apakah isolcpustelah "diambil" atau tidak. The $$cabang memberikan proses mewarisi nilai-nilai, bukan yang sistem yang asli.
LSerni