vmsplice aşırı hızlı
- Bazı programlar, veriyi borular üzerinden daha hızlı taşımak için
vmsplice adlı bir sistem çağrısı kullanır
vmsplice kullanılmadığında Linux borularının beklenenden daha yavaş olduğu fark edildi
- Morse kodunu hızlı biçimde kodlayıp çözen bir program yazılıyor ve bunun için borular kullanılıyor
İdeal koşullarda veri yazma
- Aşağıdaki program, sistem çağrısı olmadan veriyi kopyalar
- AVX-512 kullanarak 167 GB/s hızda çalışır
- AVX-512 devre dışı bırakılıp AVX2 ve SSE2 ile test edildiğinde de aynı hız (167 GB/s) elde edildi
- Vektörleştirme kullanıldığı sürece 167 GB/s hızına ulaşılabiliyor
Gerçekte boruya veri yazma
- Boruya veri yazan bir program yazılıp ölçüldüğünde 17 GB/s hız elde edildi
- Bu, bir arabelleğe yazmaktan 10 kat daha yavaş
- Profilleme sonuçlarına göre zamanın büyük kısmı
write çağrısında harcanıyor
pipe_write fonksiyonunda bellek sayfaları ayırmak çok zaman alıyor
- Verinin kopyalanması CPU süresinin yalnızca %20'sini kaplıyor, ama yine de
__memset_avx512_unaligned_erms'den iki kat daha yavaş
vmsplice yardımı
vmsplice, kullanıcı alanındaki arabelleği çekirdeğe kopyalamak yerine taşır
vmsplice kullanıldığında 210 GB/s hıza ulaşılabiliyor
vmsplice, write sistem çağrısının pahalı kısımlarını baypas eder
Sonuç
- Boruya yazmak, ham belleğe yazmaktan 10 kat daha yavaş
- Bunun nedeni, arabelleği kilitlemenin maliyeti ile SIMD bağlamını kaydedip geri yüklemenin maliyetidir
splice ve vmsplice, bu maliyetlerden kaçınıp veriyi verimli şekilde taşır
GN⁺ özeti
- Bu yazı, Linux borularında performansı en üst düzeye çıkarmak için
vmsplice kullanmayı açıklıyor
vmsplice, veriyi çekirdek alanına kopyalamadan doğrudan taşıyarak performansı ciddi biçimde artırıyor
- Morse kodu kodlama/çözme gibi yüksek hızlı veri işleme programlarında faydalı
- Benzer işlevlere sahip diğer projeler arasında
splice ve sendfile bulunuyor
1 yorum
Hacker News görüşleri
JMP'ninRETile değiştirilmemesinin nedeni CONFIG_RETHUNK seçeneğiRET'inJMP __x86_return_thunkile değiştirildiğini görebilirsinizFonksiyonun başındaki ve sonundaki NOP komutları, ftrace'in izleme komutları ekleyebilmesini sağlıyor
Bir kullanıcının yan projesi, dosya tanımlayıcıları için ring buffer sağlayan bir sistem çağrısı öneriyor
Linux pipe'ına "yavaş" demek, Toyota Corolla'ya "yavaş" demek gibi
Modern CPU'larda
rep movsb, en hızlı vektörleştirilmiş sürüm kadar hızlıAVX512 çok güç tüketiyor ve CPU frekans ölçeklemesini tetikliyor
Hacker News'in "hug of death" etkisi yeniden yaşanıyor
io_uringkullanan bir sürümü görmek ilginç olurduBlogun yüklenmesinin yaklaşık 20 saniye sürmesi epey iddialı bir ifade
IPC'nin neredeyse her türü "yavaş"
Başta splice'ın neden bu kadar yavaş olduğunu anlamamıştım
vmsplice'tan neden daha yavaş olduğu belirtilmişti ama neden olduğu net değildivmspliceile yeniden uygulanamamasının bir nedeni olmalı