isolcpus'un aktif olup olmadığını nasıl tespit edebilirim?


15

Örneğin bir sunucuda ilk kez bağlandığınızda, izolcpus'un etkinleştirilip etkinleştirilmediğini ve hangi cpus üzerinde algılandığı. Koşullar:

nereye taşınacağını görmek için herhangi bir süreç üretmemek.

Kullanım durumu olmasıdır isolcpus=1-76 çekirdek i7 üzerinde görünüyor açılışta isolcpus aktive değil, ve ben onun mümkünse dan bilmek istiyorum /proc/, /sysya userspace okunabilir herhangi çekirdek internals, isolcpus aktivasyonu net bir statü sağlamak ve hangi cpu söz konusu ise. Ya da ilk kez isolcpus tarafından ilgili olan zamanlayıcının aktif ayarını okuyun.

Çalışma süresinin çok büyük olduğunu dmesgve başlangıçta herhangi bir hatayı tespit etmek için önyükleme günlüğünü görüntülemediğini düşünün . " Çekirdek cmd hattına bak " gibi temel cevaplar kabul edilmeyecektir :)


1
Kullanabilir misin pidstat -C isolcpus? pidstat sysstatpaketten.
Timothy Pulliam

2
Dilsiz im olabilir, ama arasında herhangi bir bağlantı görmüyorum pidstatve isolcpus. Biraz daha ayrıntı verebilir misiniz?
netmonk

Komutun hangi CPU'larda çalıştığını bilmeniz gerektiğini söylüyorsunuz. Ne olduğunu bilmiyorum isolcpus, ancak bayrağı pidstatgeçerseniz bir işlemin hangi CPU üzerinde çalıştığını söyleyebilirim -C process_name. Örneğin pidstat -C topaşağıdakileri üretir. 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
Tamam, cevabınız için teşekkür ederim. isolcpus, zamanlayıcıyı, izole edilmişlerse hiçbir işlemi tek başına geçirmemeye zorlayan bir çekirdek parametresidir. 8 cpu sunucusundaki örnek için isolcpus=1-7, çekirdek komut satırında, init ve kabuktaki her türlü komut tarafından oluşturulan tüm ortaya çıkan işlemleri yalnızca CPU0'da çalışmaya zorlar. Yalıtılmış bir CPU'da bir görev çalıştırmak tasksetiçin, örnek olarak başlatmanız gerekir . Sorduğum şeyle ilgili olarak, cevabınız konu dışı görünüyor. Yine de bana cevap vermeye çalıştığın için teşekkür ederim
Netmonk

1
Böyle bir şey gerçekten zor olmamalı ....
user997112

Yanıtlar:


17

Aradığınız şey bu sanal dosyanın içinde bulunmalıdır:

/sys/devices/system/cpu/isolated

ve tam tersi

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

Dan drivers/base/cpu.cbiz kaynak gösterilen görüyoruz çekirdek değişkendir 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);

ve cpu_isolated_maptam olarak kernel/sched/core.cönyükleme sırasında ayarlanır :

/* 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;
}

Eğer gözlenen Ama, birisi cin doğurduğu olanlar da dahil olmak üzere, proseslerin yakınlık değiştirilmiş olabilirdi cron, systemdböylece ve. Böyle bir durumda, değiştirilen afinite maskesini miras alan yeni süreçler üretilir, tarafından belirlenen işlem değil isolcpus.

Yani yukarıda istediğiniz isolcpusgibi size verecek , ama bu yine de yardımcı olmayabilir.

Bunu öğrenmek olduğunu varsayalım isolcpusbu istenmeyen davranışı, verildikten, ancak "alınan" değil verebilir bazı süreç sadece bağlı olduğu fark edilerek elde edildiği CPU=0yanlışlıkla monoprocessor modundayken inanarak ve yardımsever "set şeylere teşebbüs, sağ "seçeneğini işaretleyin. Bu durumda, 1-6 yerine CPUS 0-5'i izole etmeye çalışabilir ve bunun işe yarayıp yaramadığını görebilirsiniz.


1
Centos 7.x üzerinde test edilmiştir /sys/devices/system/cpu/possible, 'ters' terimini nasıl yorumladığınıza bağlı olarak 'ters' görünmediğine dikkat edin . Örneğin , izole oldukları için .../cpu/isolatedgeri dönerse 2,4, .../cpu/possiblegeri dönecekti 0-191.
bgura

1
Bence çoğu insan /sys/devices/system/cpu/presenthangi CPU'ların var /sys/devices/system/cpu/possibleolabileceğini göstermek yerine hangi CPU'ların var olduğunu gösterir (ancak şu anda mevcut olmayabilir). Bazı sistemlerde aynılar, ancak kontrol ettiğim oldukça basit bir masaüstünde bile değiller.
John Zwinck

@JohnZwinck iyi yakalama. değişiklik cevabı
LSerni

1
İsolcpus = 0 ve 4 çekirdek ile, / izole = 0 ve / present = 0-3 alıyorum.
Stefan Reich

10

Hangi parametrelerin çalışma zamanında çekirdeğe aktarıldığını görmek isolcpusiçin danışmanlık yapmanın daha kolay yollarından biri proc.

Bunun için şunları kullanırsınız:

$cat /proc/cmdline 
BOOT_IMAGE=/boot/vmlinuz-4.8.0-1-amd64 root=/dev/sda1 ro isolcpus=2,3 quiet

Gördüğünüz gibi, bu örnekte isolcpus=2,3çalışan çekirdeğe bir argüman olarak geçildi.

tasksetPID 1'e dikkat çekerek de kullanabilirsiniz. PID 1, çekirdek tarafından başlatılan ilk görev için standart PID olduğundan, isolcpusçalışıp çalışmadığımızı yansıtacağının oldukça iyi bir göstergesi olabilir . De olduğu gibi:

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

lscpuAynı sunucudaki komutla karşılaştırıldığında :

$lscpu | grep CPU.s
CPU(s):                4
On-line CPU(s) list:   0-3
NUMA node0 CPU(s):     0-3

Görüldüğü gibi lscpu4 CPU / çekirdek tasksetgösteriyor, sadece 0,1 gösteriyor, bu yüzden isolcpusburada çalışıyor.

Şuna bir göz atın: Çalışan bir işlem için özel CPU kullanılabilirliği nasıl sağlanır?


Cevap verdiğiniz için teşekkürler efendim, ama kabul etmeyeceğim. Ben çekirdek komut satırı hakkında konuşurken cevap kabul edilmeyeceğini belirtti. Açıkçası dosya /proc/cmdlineiçeriğinin tam kopyası hangisi olduğunu biliyorum grub.conf. Sorduğum bu değil! Yine de teşekkürler!
netmonk

Cevaba ekledim.
Rui F Ribeiro

1
Birisi daha önce işlem kümesinin işlem kümesiyle benzeşimini değiştirdi mi? Birisi yalnızca cpu 0'a yakınlık ayarlarsa, bana isol cpu'nun aktivasyonu hakkında bilgi verir mi?
netmonk

1

Cpus'un ayrılmış olduğunu görmek için geçerli kabuk işlemi için Cpus_allowed ve Cpus_allowed_list'i kontrol edebilirsiniz.

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

örneğin

Cpus_allowed_list:      0-1, 3-5

cpu = 2 isolcpusdeğerinin 6 cpus sunucusunda rezerve edildiği anlamına gelir


2
Aslında hayır. Mevcut kabuk işlemi tarafından devralınan afinite maskesinde hangi CPU'ların olduğunu gösterir . Diyelim ki, sshve ebeveynin benzeşimini sshdCPU 1 ile manuel olarak sınırlasaydı, isolcpus"alınan" olsun veya olmasın her zaman CPU 1'i görürdünüz . $$Dal size süreç miras değerleri, orijinal sistem olanları verir.
LSerni
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.