2009-12-01 19 views
30

Çok yüksek performanslı bir Linux sunucusu yapıyorum (epoll, bloke olmayan soketler ve uyumsuz disk IO tabanlı olarak [io_submit/io_getevents/eventfd] tabanlı). Bazı testlerim, yuvaları işleme şeklimin gereksinimlerim için yeterince verimli olmadığını gösteriyor. Özellikle, kullanıcı alanı arabelleğinden ağ kartına ve ağ kartından kullanıcı alanı arabelleğine veri almakla ilgileniyorum (şimdilik şimdilik sendfile çağrılarını görmezden gelelim).Verimli Linux soketleri (DMA/sıfır-kopya)

Anlaştığımdan, engellemeyen bir Linux yuvasında okuma/yazma işlemi tamamen eşzamansız değil - sistem çağrısı arabelleği kullanıcı alanından çekirdeğe kopyalarken (veya başka bir şekilde) sadece o zaman döner. Linux'ta bu duyulmadan kaçınmanın bir yolu var mı? Özellikle, hemen geri dönecek bir soket üzerine yapabildiğim tam bir eşzamanlı yazma çağrısı var, gerektiğinde ağ kartına kullanıcı alanı tamponu DMA ve bir olay/etc sinyali/ayarla. tamamlanma tarihinde? Windows'un bunun için bir arabirimi olduğunu biliyorum, ancak bu konuda Linux'ta bir şey bulamadım.

Teşekkürler!

cevap

1

AFAIK, sendfile (2) kullanamıyorsanız, en etkili aramaları kullanıyorsunuz. verimli, yüksek performanslı ağ kodu çeşitli yönleri The C10K problem

19

bu satırlar boyunca bir şey için bir API sunma konusunda son zamanlarda Linux çekirdek bazı konuşma olmuş kapsadığı, ancak anlaşmazlık noktası olduğunu yapabilirsiniz genel userspace arabelleklerden değil DMA ağ kartına, çünkü:

userspace doğrusal adres alanında bitişik verileri gibi görünüyor ne
  • muhtemelen ağ kartı DMA dağınık toplamak yapmazsa bir sorun fiziksel bellek, içinde bitişik değildir;
  • Birçok makinede, tüm fiziksel bellek adresleri "DMA uyumlu" değildir. Şu anda bir kullanıcı alanı uygulamasının özellikle DMA uyumlu bir arabellek isteğinde bulunmasının bir yolu yoktur. Güncel çekirdekler üzerinde

, istediğini elde etmek için vmsplice ve birlikte splice kullanarak deneyebilirsiniz - (SPLICE_F_GIFT ile) vmsplice sayfaları bir boru içine göndermek istiyorum, sonra splice onları (SPLICE_F_MOVE birlikte) borusuna gelen soket.

+1

Teşekkürler! Bunun okuma/yazma konusunda ne kadar verimli olacağına dair bir önseziniz var mı? Genel olarak, bu tür şeyler için bir yerlerde "en iyi uygulamalar" kılavuzu var mı? Tüm sorgulama ve sinyalizasyon API'lerini incelemek ve daha sonra çoklayıcı soket ve asenkron IO için en iyi uygulamayı bulmadan önce hepsini karşılaştırmak için daha fazla zaman gerekiyordu. Bir soket en iyi uygulama rehberi bulmak gerçekten yardımcı olur. C10K problem sayfası var, fakat bilginin çoğu uzun yıllar (yani çekirdek çağında) ve genellikle çok yetersiz. –

+2

'splice' ve arkadaşları oldukça yeni, bu yüzden henüz onlar için herhangi bir" en iyi uygulamalar "kılavuzu varsa emin değilim. Mümkün olan yerlerde oldukça düşük bir gecikme ve sıfır kopya olmalıdırlar - bu onların bütün noktasıdır. Linux-net ve/veya linux-çekirdek posta listelerini sormayı deneyebilirsiniz. – caf

+2

Bu ilanlar 1.5 yıl geçti, bu alandaki gelişmeler nelerdir? @ caf: bunu 'ekleme' ile yapabiliyordunuz? –