Linux "olası" CPU sayısını nasıl algılar?

Sep 16 2020

Çekirdek başına 8 çekirdekli ve 2 iş parçacığına sahip bir AMD CPU'm var. Linux (doğru) bunu 16 "cpus" olarak gösterir. Ancak, sysfs aslında 32 "olası" cpus gösterir, bunlardan 16 tanesi mevcut değil ve çevrimdışıdır:

$ cat /sys/devices/system/cpu/possible 0-31 $ cat /sys/devices/system/cpu/present
0-15

$ cat /sys/devices/system/cpu/online 0-15 $ cat /sys/devices/system/cpu/offline 
16-31

Açık olmak gerekirse, burada yanlış bir şey yok; gerçekten de mevcut ve çevrimiçi 16 mantıksal CPU vardır. Açıklayamadığım şey, Linux'un neden mevcut olmayan ancak mümkün olmayan ek 16 mantıksal CPU tespit ettiği.

Sanırım bunlar ilgili çekirdek belgeleri: https://www.kernel.org/doc/html/latest/core-api/cpu_hotplug.html. Ancak olası CPU sayısının nasıl seçildiğine dair herhangi bir gösterge göremiyorum. ( kernel_maxSistemimdeki 8191 olan CPU sayısından çok daha düşük olduğunu unutmayın .)

(Biraz ek arka plan: Bu değerleri ayrıştırması gereken bir kodum var. Doğru olanı yapmak basit görünüyor, ancak olası CPU sayısının neden mevcut CPU sayısını aşabileceğini açıklayan net bir dokümantasyon istiyorum. sıradan masaüstü bilgisayar.)

Yanıtlar

2 Gilles'SO-stopbeingevil' Sep 16 2020 at 02:40

Çekirdek belleğinde yer varsa bir CPU "mümkündür". Olası CPU sayısı, önyüklemeden sonra takılı olanlar da dahil olmak üzere çevrimiçi duruma getirilebilecek maksimum CPU sayısıdır.

Sysfs'nin bu bölümünün dokümantasyonu, CPU topolojisi bilgisi sysfs aracılığıyla nasıl dışa aktarılır :

olası: Kaynak tahsis edilmiş ve varsa çevrimiçi duruma getirilebilen CPU'lar. [cpu_possible_mask]

Ama daha detaylı dokümantasyon cpu_possible_maskolduğu Çekirdeği'nde CPU HotPlug :

Sistemde bulunabilecek olası CPU'ların bit eşlemi. Bu, CPU'lar kullanıma sunulduğunda veya çıkarıldığında büyümek / küçülmek üzere tasarlanmamış per_cpu değişkenleri için bazı önyükleme zamanı belleği ayırmak için kullanılır. Önyükleme zamanı keşif aşamasında bir kez ayarlandığında, harita statiktir, yani herhangi bir zamanda hiçbir bit eklenmez veya kaldırılmaz. Önceden sistem ihtiyaçlarınız için doğru şekilde kırpmak, önyükleme zamanı belleğinden tasarruf sağlayabilir.

Bu parametre, komut satırı seçenekleriyle yapılandırılabilir . Muhtemel durumda donanım yeniden olmadan başka CPU takmayı desteklemez ve sisteminizi hazırda bekletme niyetinde ve daha CPU ile uyanmak yapmak, sen ileterek çekirdek bellek az miktarda tasarruf edebilirsiniz olmadığını possible_cpus=16çekirdeğinizdeipfwadm Komut satırı. Tipik bir PC veya sunucuda, miktar muhtemelen çabaya değmeyecek kadar küçüktür.

Komut satırı seçeneklerinin yokluğunda, neler olduğunu anlamak için kaynağı okumanız gerektiğini düşünüyorum . Çekirdek, CPU hotplug desteği ( CONFIG_HOTPLUG_CPU) olmadan derlenirse , önyükleme sırasında kaç CPU'nun bulunduğuna bakar. Çekirdeğin CPU hotplug desteği varsa, prefill_possible_mapkaynak koddaki bir yoruma göre :

  • BIOS ACPI / mptables'da devre dışı bırakılmış CPU'ları belirttiyse bunu kullanın.
  • Kullanıcı, olası_cpus = NUM ​​ile bunun üzerine yazabilir
  • Aksi takdirde ek CPU ayırmayın.

Kodun yaptığı şeyin bu olduğunu doğrulamadım.

"Olası CPU'ların" ne anlama geldiği ilkesinin tüm mimariler için geçerli olduğunu, ancak CPU sayısını belirleme yollarının mimariye özgü olduğunu unutmayın. Cevabımda x86 olduğunu varsayıyorum.