實錘,PBlaze5實力演繹multiple namespaces 功能(下)

memblaze_2011發表於2018-11-05

上篇文章介紹了一系列的基礎概念,並對Multiple namespaces的一些基本使用方法進行了介紹。這篇文章將繼續討論Multiple namespaces的優勢,並以PBlaze5為例解讀Multiple namespaces的使用和配置。

為什麼要用 Multiple Namespaces

看起來用法並不難,那麼使用Multiple Namespaces有什麼好處呢?簡單羅列幾個場景:

  • 控制邏輯範圍
    可以在建立namespace時,確定利用的邏輯塊的範圍,有效控制使用者空間大小,甚至達到擴大OP,增加壽命的效果。
  • 獨立無擾
    多個namespace之間的format格式、邏輯地址、IO路徑都是相互獨立的。比如,
    nvme0n1 format成512B的,nvme0n2 format成4096B的完全沒問題;
    nvme0n3支援資料保護,nvme0n4不支援資料保護,OK;
    nvme0n5做共享namespace,nvme0n6做私有namespace,也OK;

    IO在每個namespace上都是相對獨立,互不干擾的,每個namespace的使用者都可以從0開始讀寫,但之間沒有任何干擾,資料沒有交集。放心大膽的trim一個namespace,另一個namespace繼續讀寫,高枕無憂。
  • Dual Port
    multiple namespaces的private/shared namespace可以和雙埠結合,成為雙埠+多名稱空間應用場景,給上層應用提供更多可能。這也是PBlaze5的一個重要的功能。
    multiple namespaces的private/shared namespace可以和雙埠結合,成為雙埠+多名稱空間應用場景,給上層應用提供更多可能。這也是PBlaze5的一個功能。如下圖所示,NS A是portx的private namespace,NS C是porty的private namespace, NS B是portx和porty的shared namespace。
    在這裡插入圖片描述
    雙埠 + Multiple namespaces
    雙埠 + Multiple namespaces
    雙埠與 Multiple namespace 結合之後,portx 可以訪問 NS A 和 NS B,porty 可以訪問 NS B 和 NS C,同時,portx 可以看到 NS C 但是不能訪問它,porty 可以看到 NS A 但是不能訪問它。可以說,我們從分開埠的角度對 MNS 多了一層保護和控制,我們從 MNS 的角度對埠多了一層擴充套件和保護,基於這兩個功能的強強聯合,為上層應用創造了更多高效安全的可能。

如何使用PBlaze5的multiple namespaces

既然 Multiple Namespaces 好處多多,讓我們用起來吧,用法也不難,以 PBlaze5 為例,慢慢道來。
讓我們先了解一下 NVMe 協議裡關於 Multiple Namespaces 的幾個概念。

  • NSID
    -每個 namespace 都擁有自己唯一的 NSID。NSID 有效範圍:
    1 ~ NN。注:0無效。NN+1 ~ FFFFFFFEh無效。FFFFFFFFh表示廣播。
    如下圖所示:
    圖 2 - NSID規則
  • Active、Inactive、Allocated、Unallocated
    不要蒙圈,這跟 namespace 的建立和使用有關。當使用 Namespace Management command 成功建立了namespace 之後,namespace 就是 Allocated 狀態,表示這些邏輯塊已經劃給這個 NSID 的 namespace 了;那些沒有建立沒有分配的邏輯塊和 NSID 就是 Unallocated,很好理解。
    但是 Allocated namespace 還不能IO,還需要使用 Namespace Attachment command 掛到某個 controller 上,成為 Active namespace 才可以。所以,Active NSID 就是已經建立並且已經掛到某個 controller 上的 namespace 的NSID。
  • Namespace Management command 和Namespace Attachment command
    NVMe協議規定了兩個admin命令,Namespace Management和Namespace Attachment,用以建立、管理namespace等操作。另外,Identify命令中也有對namespace的支援,比如獲取NSID列表、controller ID列表等。
    圖 3 - NVMe 1.3協議中兩個admin命令
    圖 3 - NVMe 1.3協議中兩個admin命令
    拿到一塊支援multiple namespace的SSD,比如PBlaze5,用支援這兩個admin命令的的工具,比如nvme-cli,就可以create、delete、list、attach、detach一個namespace了:
    圖 4 -  nvme-cli中namespace命令
    圖 4 - nvme-cli中namespace命令
    命令不多,支援的內容還是很豐富的。比如create-ns命令,可以設定這個namespace的大小、格式化格式、資料保護能力、共享能力等。又比如list-ns命令,可以列出某個NSID之後所有有效的NSID,並可以分別列出Active、Inactive的namespace,方便使用者使用。再次宣告,經過細緻有效的測試,PBlaze5系列產品完全符合NVMe1.3協議之規定。
    再用PBlaze5舉個例子 —— 建立namespace舉例
    下面以在PBlaze5 U.2 4T上使用nvme-cli工具建立一個500GB的namespace為例。
    第一步,檢查SSD上剩餘空間是否足夠建立目標namespace。使用Identify命令檢視unvmcap的值可知剩餘可分配容量,單位是Byte。
    圖 5 -  使用Identify查詢unvmcap
    圖 5 - 使用Identify查詢unvmcap
    第二步:計算建立 500GB 的 namespace,是多少個LBA。執行create-ns命令時,NSZE和NCAP的單位都是指 LBA的個數,lba count和user capacity的關係符合JEDEC218A,公式如下:
    user capacity = (lbacount- 21168) / 1953504 當LBA size是512B
    user capacity = (lbacount- 2646) / 244188 當LBA size是4096B
    那麼,當想建立500GB的namespace,並且該namespace格式化為512B的sector size的話,size引數就設定為:21168 + 1953504 * 500 = 976773168。
    第三步:執行nvme create-ns /dev/nvme0 –s 976773168 –c 976773168 –f 0 –d 0 –m 1即可建立一個namespace。其中,-f 0設定了一個邏輯塊的大小是512Byte,PBlaze5還支援4096B等。
    第四步:執行nvme attach-ns /dev/nvme0 –n 1 –c 1即可將這500GB的namespace掛到controller 1上,這是執行IO的先決條件。
    第五步:如果作業系統支援Namespace Attribute Notices,那麼此時已經可以在系統中看到這個namespace並使用它了。
    圖 6 -  建立500GB namespace舉例
    圖 6 - 建立500GB namespace舉例
    經過兩篇文章的討論,可以發現Multiple namespaces是NVMe SSD一個非常基礎而重要的功能,是對SSD不同儲存單元進行差異化策略設定和操作的基礎。現在PBlaze5已經開始全面支援Multiple namespaces功能,使用者可以對不同的namespaces分別執行格式化等操作。未來基於Multiple namespaces還將有更多新的特性加入,使用者管理NVMe SSD也更加方便。

下面是Memblaze的技術文章合集:
在這裡插入圖片描述

相關文章