Anasayfa Makale TCP Üzerinden NVMe Nedir? Nasıl Kullanılır?

TCP Üzerinden NVMe Nedir? Nasıl Kullanılır?

HDD mi SSD mi? Hangisi Seçilmeli?
Samsung 970 Evo M.2 NVMe SSD

Bu yazımızda TCP kullanarak NVMe Flash depolamayı nasıl bağlayacağını gözteriyoruz.

Oracle Linux UEK 5 (Unbreakable Enterprise Kernel), RDMA (Uzaktan Doğrudan Bellek Erişimi) teknolojisini kullanarak bir Infiniband veya Ethernet portu üzerinden, NVMe depolama komutlarının aktarılmasına izin veren Fabrics üzerinden NVMe teknolojisini tanıttı. UEK5 U1, NVMe’yi Fibre Channel depolama ağlarını da içerecek şekilde, Fabrics üzerinden kullanıma sundu. Şimdi ise UEK 6 ile, TCP üzerinden NVMe kullanıma sunuldu ki bu, RDMA yeteneğine sahip ağ donanımı satın almak zorunda kalmadan Fabric üzerinden NVMe’yi standart bir Ethernet ağı kullanacak şekilde genişletiyor.

NVMe-TCP nedir?

NVMe Çoklu Kuyruk Modeli, her NVMe denetleyicisinde 64k I/O (Girdi/Çıktı) Gönderme ve Tamamlama Kuyruğunun yanı sıra bir Yönetim Gönderme Kuyruğu ve Tamamlama Kuyruğu uygular. PCIe bağlantılı bir NVMe denetleyicisi için, bu kuyruklar ana belleğe uygulanır ve hem ana CPU’lar hem de NVMe Denetleyici tarafından paylaşılır. Aygıt sürücüsü bir G/Ç gönderim kuyruğuna komut yazdığında ve ardından aygıtı bilgilendirmek için bir kapı zili kaydına yazdığında NVMe aygıtına G/Ç gönderilir. Komut tamamlandığında, aygıt bir G/Ç tamamlama kuyruğuna yazar ve aygıt sürücüsünü bilgilendirmek için bir kesinti oluşturur.

Ağ üzerinden NVMe bu tasarımı genişletir, böylece ana bilgisayar belleğindeki gönderme ve tamamlama kuyrukları uzak kontrolcüde çoğaltılır, böylece ana bilgisayar tabanlı kuyruk çifti denetleyici tabanlı bir kuyruk çiftine eşlenir. Ağ topolojileri üzerinden NVMe, kuyruklar tarafından Veri Kapsüllerinin yanı sıra ağ genelinde iletişim kurmak için kullanılan Komut ve Yanıt Kapsüllerini tanımlar. NVMe-TCP, bu kapsüllerin bir TCP PDU (Protokol Veri Birimi) içinde nasıl kapsüllendiğini tanımlar. Her ana bilgisayar tabanlı kuyruk çifti ve ilişkili denetleyici tabanlı kuyruk çifti, kendi TCP bağlantısıyla eşleşir ve ayrı bir CPU çekirdeğine atanabilir.

NVMe over TCPNVMe-TCP Avantajları

  • TCP’nin her yerde bulunan doğası. TCP, dünya genelindeki çoğu veri merkezinde zaten uygulanmakta olan, kullanımdaki en yaygın ağ aktarımlarından biridir.
  • Mevcut ağ altyapısıyla çalışmak üzere tasarlanmıştır. Diğer bir deyişle, ağ altyapısının bakımını basitleştiren mevcut ethernet yönlendiricilerinin, anahtarların, NIC’lerin değiştirilmesine gerek yoktur.
  • RDMA tabanlı uygulamalardan farklı olarak, TCP tamamen yönlendirilebilir ve yüksek performans ve düşük gecikme sürelerini korurken daha büyük dağıtımlar ve daha uzun mesafeler için çok uygundur.
  • TCP, büyük bir topluluk tarafından aktif olarak korunmakta ve geliştirilmektedir.

NVMe-TCP Dezavantajları

  • TCP, CPU kullanımını artırabilir çünkü sağlama toplamlarının hesaplanması gibi belirli işlemler, TCP yığınının bir parçası olarak CPU tarafından yapılmalıdır.
  • TCP, düşük gecikmeyle yüksek performans sağlasa da, RDMA uygulamalarıyla karşılaştırıldığında gecikme, kısmen korunması gereken ek veri kopyaları nedeniyle bazı uygulamaları etkileyebilir.

NVMe-TCP Örneğini Ayarlama

UEK6, NVMe-TCP varsayılan olarak etkinleştirilmiş şekilde piyasaya sürüldü, ancak bir orijinal çekirdek ile denemek için aşağıdaki çekirdek yapılandırma parametreleriyle derlemeniz gerekecek:

  • CONFIG_NVME_TCP
  • CONFIG_NVME_TARGET_TCP = m

Hedef Oluşturma

$ sudo modprobe nvme_tcp
$ sudo modprobe nvmet
$ sudo modprobe nvmet-tcp
$ sudo mkdir /sys/kernel/config/nvmet/subsystems/nvmet-test
$ cd /sys/kernel/config/nvmet/subsystems/nvmet-test
$ echo 1 |sudo tee -a attr_allow_any_host > /dev/null
$ sudo mkdir namespaces/1
$ cd namespaces/1/
$ sudo echo -n /dev/nvme0n1 |sudo tee -a device_path > /dev/null
$ echo 1|sudo tee -a enable > /dev/null

Hedef ana bilgisayarda bir NVMe cihazına erişiminiz yoksa, bunun yerine bir boş blok cihaz kullanabilirsiniz.

$ sudo modprobe null_blk nr_devices=1
$ sudo ls /dev/nullb0
/dev/nullb0
$ echo -n /dev/nullb0 > device_path
$ echo 1 > enable
$ sudo mkdir /sys/kernel/config/nvmet/ports/1
$ cd /sys/kernel/config/nvmet/ports/1
$ echo 10.147.27.85 |sudo tee -a addr_traddr > /dev/null
$ echo tcp|sudo tee -a addr_trtype > /dev/null
$ echo 4420|sudo tee -a addr_trsvcid > /dev/null
$ echo ipv4|sudo tee -a addr_adrfam > /dev/null
$ sudo ln -s /sys/kernel/config/nvmet/subsystems/nvmet-test/ /sys/kernel/config/nvmet/ports/1/subsystems/nvmet-t

Şimdi dmesg’de yakalanan aşağıdaki mesajı görmelisiniz:

$ dmesg |grep "nvmet_tcp"
[24457.458325] nvmet_tcp: enabling port 1 (10.147.27.85:4420)

İstemciyi Ayarlama

$ sudo modprobe nvme
$ sudo modprobe nvme-tcp

$ sudo nvme discover -t tcp -a 10.147.27.85 -s 4420
Discovery Log Number of Records 1, Generation counter 3
=====Discovery Log Entry 0======
trtype: tcp
adrfam: ipv4
subtype: nvme subsystem
treq: not specified, sq flow control disable supported
portid: 1
trsvcid: 4420
subnqn: nvmet-test
traddr: 10.147.27.85
sectype: none
$ sudo nvme connect -t tcp -n nvmet-test -a 10.147.27.85 -s 4420

$ sudo nvme list
Node SN Model Namespace Usage Format FW Rev
------------- ------------------- --------------- --------- ----------- --------- -------
/dev/nvme0n1 610d2342db36e701 Linux 1 2.20 GB / 2.20 GB 512 B + 0 B

Artık TCP kullanılarak ağ üzerinden NVMe aracılığıyla dışa aktarılan bir uzak NVMe blok cihazınız var. Bundan sonra yerel olarak bağlı diğer yüksek performanslı blok aygıtlar gibi yazabilir ve ondan okuyabilirsiniz.

Verim

NVMe-RDMA ve NVMe-TCP’yi karşılaştırmak için, her biri Oracle Linux (OL8.2) ile UEK6 (v5.4.0-1944) çalıştıran Mellanox ConnectX-5 içeren bir çift Oracle X7-2 ana bilgisayar kullanıldı. RoCEv2 (RDMA) ile bir çift 40 Gb ConnectX-5 bağlantı noktası yapılandırıldı, performans testleri yapıldı, TCP kullanmak için yeniden yapılandırıldı ve performans testleri yeniden çalıştırıldı. Performans yardımcı programı FIO, saniye başına G/Ç (IOPS) ve gecikmeyi ölçmek için kullanıldı.

IOPS için test ederken, 32 kuyruk derinliğine sahip tek iş parçacıklı bir 8k okuma testi, RDMA’nın önemli ölçüde TCP’den daha iyi performans gösterdiğini ortaya koydu, ancak NVMe kuyruk modelinden daha iyi yararlanan ek iş parçacıkları eklendiğinde, TCP IOPS performansı arttı. İş parçacığı sayısı 32’ye ulaştığında, TCP IOPS performansı RDMA’nınkiyle eşleşiyor.

Gecikme, kuyruk derinliği 1 olan tek bir iş parçacığından 8k okuma kullanılarak ölçüldü. TCP gecikmesi RDMA’dan %30 daha yüksekti. Farkın çoğu, TCP’nin gerektirdiği tampon kopyalardan kaynaklanmakta.

Sonuç

Her ne kadar NVMe-TCP yenilikten muzdarip olsa da, TCP için aynı şey geçerli değil ve veri merkezindeki hakimiyetiyle, NVMe-TCP’nin veri merkezi SAN alanında baskın bir oyuncu olacağına şüphe yok. Bu yıl NVMe-TCP için iyileştirilmiş ethernet adaptörlerinden NVMe-TCP SAN ürünlerine kadar birçok üçüncü taraf NVMe-TCP ürününün piyasaya sürülmesini bekleyebiliriz.