2013-11-22 18 views
21

CR4.PCIDE'yi denetlemek için bir çekirdek modül yazdım, bu ayarlanmadı. Linux neden TLB geçersiz kılma ve önbellek kirliliği nedeniyle performans yavaşlamasını azaltmak için bu özelliği kullanmıyor?Linux, TLB için x86 CPU'nun PCID özelliğini kullanıyor mu? Değilse neden?

+0

http://forum.osdev.org/viewtopic.php?f=1&t=29935 –

+4

2017 yılı notu: 4.14'ten beri Linux kullanmıyor, ama biraz sıradışı bir şekilde. [Detaylara bakınız] (https://kernelnewbies.org/Linux_4.14), paragraf 1.8. PCID ile daha hızlı TBL yıkama. –

+1

Sadece '1.10' bulundu. Hi-Angel cevabının üstünde PCID ile daha uzun ömürlü TLB Girişleri, ancak çok faydalıdır. – firo

cevap

22

Güncelleme: Bu detaylar için bakınız the other answer geç 2017 ve erken 2018 yılında Meltdown and Spectre attacks nedeniyle 4.15 süre değişmiştir.

Not: Bir Linux geliştiricisi Intel'in "Süreç Bağlam tanımlayıcıları" için

değilim 4096 kimlikleri bir sınırı var. Bu, 4096'dan fazla süreç olduğunda bunları yönetmeniz gerekir (örneğin "en az kullanılmış" bir şey yapmalısınız, böylece şu anda kimliği olmayan bir işlemin yürütülmesi gerekiyorsa, Kimliğin diğer süreç ve yeniden kullanılır.

İçine giren diğer şey, çoklu CPU sistemlerinde "TLB shootdown" dur. Bunlar biraz pahalı olabilir, bu yüzden insanlar onları önlemek için hileler yaparlar. Örneğin, bir işlem sadece bir iş parçacığına sahipse, yalnızca bir CPU üzerinde çalışabilir ve diğer CPU'lara bir IPI göndermeye gerek olmadığını (kesintiye uğratıp "TLB vuruşu" yapmasını isteyerek) gerek olduğunu bilirsiniz. PCID'leri kullanmaya başladığınızda, diğer CPU'ların hala TLB girişlerine sahip olmadığından emin olamazsınız ve "TLB shootdown" dan kaçınmak için bu hileleri yapamazsınız. Aynı zamanda (teorik olarak, PCID desteğinden dolayı) PCID'den aldığınız performansın, TLB'nin vurulmasından ve ID yönetiminin genel giderlerinden dolayı kaybettiğiniz performanstan daha az olabileceği ve net bir zarara neden olabileceği anlamına gelir.

Çoğunlukla söylüyorum, PCID için destek eklemenin biraz karmaşık olması (CR4'te bir bayrak ayarlayabilmeniz ve bunu unutmanız gibi değil). Uygulamanın en etkili yolunu belirlemek için bazı araştırmalar (deneyler, prototipler, kıyaslama) yapmak zorundasınız. Büyük/karmaşık/eski bir çekirdek için (Linux gibi), kazara başka bir şeyi rahatsız etmemek için dikkatli olmanız gerektiğinden daha da karmaşıklaşır. Diğer bir şey ise, bu özelliğin nispeten yeni olmasıdır (yalnızca doğru bir şekilde hatırlamıyorsam birkaç yıldan beri var) ve pek çok CPU tarafından desteklenmiyor (örneğin, biraz daha eski ve AMD'den herhangi bir şey). Temel olarak, "zamana karşı faydalar" (veya sınırlı sayıda CPU'larda küçük bir performans artışı için yeterli zamanın olmaması) anlamına geldiğini varsaymak isterim.

+0

16 Kimlik sınırı nereden geliyor? Üzgünüm, anlamadım. –

+1

Yanlış hatırladım (16 ID değil) - Kontrol ettim ve aslında 4096 ID var (CR3'te 12 bitlik bir alan olduğu için). Cevabımı değiştirdim/düzeltdim. – Brendan

+2

İlk cümlede özetlemelisiniz: ** hayır ** :-) –

11

Evet! Linux Kernel'in son sürümlerinde PCID desteği var. Bu soru sorulduğunda, bu destek mevcut değildi, ancak 4.14 kernel ile başlayan 2017 sonuna doğru eklenmiştir. Orijinal yama tartışmasının bazılarını in this LKML chain takip edebilirsiniz.

Bu değişiklik aslında sınırlı bir sayı olduğu için ya da sık kullanılan bir şekilde atamaya çalıştığından, her işlem için benzersiz bir PCID'yi ilişkilendirmez, ancak her CPU için bir PCID önbelleği kullanır, böylece birden çok çalışan işlem bir Verilen CPU, TLB floş yükünü önlemek için PCID mekanizmasını kullanabilecektir. Bu, a series of vulnerabilities,'un dağıtıldığı çekirdek belleğini okumaya izin vermeyen kullanıcı kodunun kullanılmasına olanak sağladığı için, bu son zamanlarda daha alakalı hale geldi. Bu yamalar, kullanıcı düzeyinde TLB girdileri herhangi bir çekirdek çağrısında geçersiz kılınabileceğinden, önemli bir performans etkisine sahip olabilir. PCID desteği ile, kullanıcı seviyesi TLB girişleri korunur, çünkü etki azaltılır.Henüz

Değil, ama bir şey de olabilir gibi görünüyor: PCID destek yayımlanan çekirdeklerinde mümkün değilken


bu cevabın eski bir sürümü bir anda, aşağıda bulunan Eserleri. LKML'de around here başlayan konuya bakın. Özellikle, diğerleri arasında, çapraz çekirdekli TLB shootdown sorunlara çözüm var önerilmektedir:

ise duran PCID için TLB shootdown alma, sadece floş tüm girişleri bu PCID için ve CPU'yu mm'nin cpu_vm_mask_varından çıkarın, için geçerli olmayan bir mm için hiçbir zaman birden fazla shootdown IPI'sı almayacağız, ancak, örn. ile ilgilenirken TLB uzun ömürlülüğü 'un avantajlarından faydalanmaya devam edeceğiz. Görevlerin alındığı boru iş yükleri ile aynı CPU üzerinde çalışır.

Ayrıca, adres uzayı tanımlayıcıları uzun diğer Linux mimarileri üzerinde kullanılmış olduğu bu iş parçacığı öğrenebileceğiniz.