DPDK ile ilgili hazırlamış olduğum bir sunum sırasında Türkçe içerik eksikliğini görerek, aldığım notları derlediğim bir içerik oluşturmak istedim. Benim de içerisine yeni dahil olduğum bir yapı olduğu için vereceğim bilgiler tecrübelerden daha çok araştırdığım yabancı kaynakların derlenmesi sonucu ortaya çıkmış oldu. Bazı terimlerin Türkçe karşılığı anlamsız kaldığı için ve bu alanla ilgilenen insanların halihazırda bu terimleri bildiğini varsaydığım için İngilizce olarak kullandım. Kısaca DPDK‘nın tarihinden bahsederek başlamak istiyorum.

Data Plane Development Kit yani DPDK, 17 Eylül 2010’da BSD (Berkeley Software Distribution) lisansı ile yayınlandı. 2013 Nisan’dan itibaren dpdk.org üzerinde tamamen bağımsız ve kendi topluluğu olan bir hal aldı. Mikroişlemci üreticileri ve mimari geliştiriciler tarafından da desteklenerek projenin büyümesi hızlandırıldı. Günümüzde ise Linux Foundation tarafından destekleniyor.

DPDK‘nın amaçladığı ana iş data plane uygulamalarında daha hızlı paket işleme için bir framework (altyapı, sistem) sağlamaktır. Geliştiriciler bu framework’ü protokol stacklerini oluşturmak için veya prototip ortaya çıkartmak için kullanabiliyorlar. Bunu yaparken de bize donanımdan bağımsız bir geliştirme ortamı sunduğu için donanıma dokunmamız gereken yerlerden çok uzakta işlem yapabiliyoruz. En basit örnekle bir timer ayarı yaparken donanımdaki register’lardan bağımsız olarak yazdığımız tek bir kod çerçevesinde derlediğimiz ortamın getirdiği parametrelere bağlı olarak timer ayarlamamızı yapmış oluyoruz. Burada kullandığımız işlemci mimarisinin bizim için bir önemi kalmamış oluyor. Aynı zamanda kullanılan hugepage yapısı sayesinde performans yönünde çok büyük avantaj sağlıyor.

Tercih edilme sebeplerine bakacak olursak:

  • Çoklu CPU mimarileri tarafından desteklenir
  • Linux üzerinden 25 kat daha fazla performans artışı sağlar
  • Ücretsizdir
  • Açık kaynak kodludur
  • BSD lisansına sahiptir
Increasing Service Agility with DPDK

Kurulum

DPDK‘yı kendi ortamınıza dahil etmek için core.dpdk.org/download adresine giderek kullanmak istediğiniz versiyonu indirebilirsiniz. Ardından dosyayı bir dizine çıkarttıktan sonra usertools/dpdk-setup.sh dosyasını çalıştırarak uygun mimari ve derleyici seçeneği ile DPDK‘nın derlemesini tamamlayabilirsiniz. Bu işlemi otomatik olarak yapmak istiyorsanız aşağıdaki scripti kullanabilirsiniz.

wget http://fast.dpdk.org/rel/dpdk-19.11.6.tar.xz
tar xf dpdk-19.11.6.tar.xz
cd dpdk-stable-19.11.6
make config T=x86_64-native-linuxapp-gcc
make

Yukarıda script sayesinde DPDK 19.11.6 versiyonunu indirdikten sonra GCC derleyicisi ile 64 bit destekleyen Linux uygulaması olacak şekilde derlemiş olduk. Eğer siz farklı bir mimari ile veya derleyici ile derlemek istiyorsanız tüm listeye usertools/dpdk-setup.sh içerisinden ulaşabilirsiniz. (Aynı şekilde derlemek için o dosya içerisinde 38 komutunu kullanmanız yeterli olacaktır.)

DPDK: Multi Architecture High Performance Packet Processing

Geliştirme Ortamı

DPDK, bize sunduğu geliştirici araçları ve komponentler sayesinde soyutlama ve optimizasyon yapmamızı sağlamayı hedefliyor. İlk olarak soyutlama işlemi için Environment Abstract Layer (EAL) ile başlayacağım.

EAL – Environment Abstract Layer

İsminden de anlaşılacağı üzere, EAL bizi mimariden soyutlayarak üst katman – alt katman arası bir bağlantı oluşmasını sağlar. Bu katman sayesinde kurulum esnasında derlediğimiz ortam koşullarına bağlı olarak donanımla aramızda fiziksel bir bağ kalmamış olur. Zaten kodun çalışması için ilk olarak rte_eal_init() fonksiyonu ile bu katmanı ayağa kaldırmamız gerekmektedir. İçerisinde aşağıda bahsedilen komponentlerin ve daha birçoğunun kullanılması için gerekli olan altyapının oluşturulmasını sağlıyor.

  • Multi-process ve Multi-thread yapıları oluşturuyor
  • Hafızadan ayrılacak ve geri bırakılacak alanları ayarlarıyor (Hugepage ile)
  • Atomic/lock işlemlerini ayarlıyor.
  • Timer işlemlerini ayarlıyor.
  • Gerekli bağlantı ayarlarını yapıyor.
  • Kesme (interrupt) kontrollerini sağlıyor.

Mempool

Mempool ile hafızada yapılacak işlemler için yer ayırma ve geri bırakma (allocate/deallocate) işlemleri gerçekleştiriliyor. Hafıza havuzumuzdan sabit boyutlarda yer ayırıp o yerlerle etkileşime girmemize izin veriyor. Bize ayırdığı hafıza ring buffer konseptine sahip olarak çalışıyor ve cache işlemine imkan veriyor.

Mbuf

Mbuf yani Message Buffers adından da anlaşıldığı üzere, alıp verdiğimiz mesajları tuttuğumuz ve onlar üzerinde işlemler yaptığımız buffer’lar oluşturmamıza yarıyor. Bunu yaparken de mempool ile hafızadan yer ayırma işleminden faydalanıyor.

Ring

Ring, circular buffer olarak da bilinen bir döngüsel buffer konseptidir aslında. Sabit boyutlu bir alan içerisine girip çıkan veriler üzerinde gösterilen noktalar üzerinde gezerek bir çok mesaj işlemini gerçekleştirmeye yarıyor. Bu sayede normalde 1024 byte’lık bir dizi oluşturmak yerine 256 byte’lık bir dizi oluşturarak içerisini 4 kez doldurup boşaltarak daha küçük boyutlu bir dizi ile kayıpsız bir işlem sağlayabiliriz.

Timer

Timer, zamana bağlı olarak işlemler gerçekleştirilmesi için kullanılan bir komponenttir. Gerekli ayarları yapıldıktan sonra bizim belirlemiş olduğumuz süreler içerisinde periyodik olarak veya dışarıdan tetiklenebilir olarak çalışacak şekilde kullanılabilir. Normalde donanım seviyesinde çok ince hesaplar yapılması ile gerçekleştirilebilecek işlemler DPDK sayesinde kolayca gerçekleştirilebiliyor.

Hugepage

Yukarılarda hugepage‘den bahsetmiştik, hugepage Linux üzerinde sanal hafıza yönetimi için kullanılıyor. Normalde sistemin 2kb/4kb olan pagesize’ını artırarak işlem yapabiliyoruz.

Peki neden hugepage‘e ihtiyaç duyuyoruz? Çünkü sayfalar büyük olduğunda sayfa tabloları da büyük oluyor ve bir süreç için verileri bellekten çıkarma/getirme miktarı azalıyor. Aynı zamanda kernel ile yapılan swap işlemlerinde her bir page için gerçekleşecek olan transaction sayısı azaldığı için hız olarak da daha hızlı oluyor. Yani ana amaçlarından bir tanesinin performansı artışı olduğunu söyleyebiliriz.

Hugepage ayarlamasını kurulum sonrasında (yani usertools/dpdk-setup.sh içerisinde) yapabilirsiniz. Bu ayarı yaparken karşınıza iki kavram çıkacak; UMA ve NUMA. Bunların arasındaki fark UMA(Uniform Memory Access) tek hafıza bloğuna sahip kontrolörlerle birlikte genel amaçlı uygulamalar için kullanılır. NUMA (Non-Uniform Memory Access) ise çoklu hafıza bloklarına sahip kontrolörlerle birlikte zamanın kritik olduğu işler için -genelde- real-time uygulamalarda tercih edilir.

DPDK, genel hatları ile bu kavramları içeriyor ancak bunun yanında daha birçok komponenti de (Crypto, Hash vb.) içerisinde barındırıyor. Daha detaylı kullanımları için kaynaklarda yer alan dokümanlarını inceleyebilirsiniz. İçerisinde yer alan örnek uygulamalarla da kullanımına dair fikir edinebilirsiniz.

Kaynaklar

http://doc.dpdk.org/guides/prog_guide/overview.html

https://www.youtube.com/watch?v=ewsrzoKwwz0&ab_channel=FD.io

https://s3.us-east-2.amazonaws.com/university-video-cdn/2_DPDK/1_DPDK_101/DPDK_101.pdf

https://software.intel.com/content/www/us/en/develop/articles/data-plane-development-kit-dpdk-getting-started.html

https://networkbuilders.intel.com/university/course/dpdk-101

Author

Genel dünya problemleri ile çok ilgili olmasa da teknolojik gelişmeleri yakından takip eden, sistemleri geliştirmek için çalışmalar yapan, bolca kod yazmaya çalışan ve öğrendiklerini paylaşmaya çalışan birisi.

Write A Comment

This site uses Akismet to reduce spam. Learn how your comment data is processed.