NVMe SSD新功能Reservation從入門到精通

memblaze_2011發表於2018-11-05

NVMe 規範中定義了很多功能來處理資源管理和排程問題,這些功能對於保障SSD的正常執行以及高效能、可靠性和穩定性有重要意義。本篇文章由Memblaze工程師擬寫,全面介紹NVMe 的Reservation的命令和實現原理。

第一章:Reservation概述

Reservation 這個feature的意義在於提供了一整套可以讓一個,兩個或者更多的Hosts共同訪問一個shared namespace 的機制。

下面先列舉三個host訪問NVMe SSD的namespace典型場景。
場景1:host A通過Controller 1和Controller 2訪問一個Namespace
場景1:host A通過Controller 1和Controller 2訪問一個Namespace
場景2:host A和host B分別通過Controller 1和Controller 2訪問一個Namespace
場景2:host A和host B分別通過Controller 1和Controller 2訪問一個Namespace
場景3:host A、host B以及host C分別通過Controller 1、Controller 2和Controller 3訪問一個Namespace
場景3:host A、host B以及host C分別通過Controller 1、Controller 2和Controller 3訪問一個Namespace

所有的host通過協商建立一整套許可權機制,這個許可權機制是希望shared namespace 能夠在許可權明確的條件下更好的為Host 服務。

Reservation 功能的基本操作單元是Namespace。Reservation 的命令和通過Set feature命令實現的輔助功能的命令也都是以Namespace為單元傳送到SSD 上的。為了讓reservation 功能更好的執行,Log、AER(Asynchronous Event Request)、 Set Feature、Identify 等多個模組中都有相應的功能支援reservation 模組。

下面會具體介紹這些reservation 的命令和相關功能。

第二章: Reservation 命令和功能

**Reservation一共有Reservation Register, Reservation Acquire, Reservation Release, Reservation Report 四條命令。**Reservation的命令都是NVM 命令,所以這些命令都是通過I/O queue 傳送給drive 的。除了Reservation Report 命令其他三條命令都通過Command dword 10 Bit 0:2 Action 域設定不同的值使一條命令可以執行相關的幾個功能。
Reservation 命令和功能

Register 許可權以及 Register 命令

**Reservation許可權就像是一個shared namespace 的管理員許可權,得到reservation許可權的host 對這個shared namespace 可以做任意的讀寫操作。**但是在成為管理員之前需要先用reservation register 命令註冊成為註冊人員(registrant),從而建立host 和namespace 之間的連線, 這個操作的意義相當於通過register 的key 建立起host id 和namespace 之間的register 關係。

有了這種register 的關係表明這個host 願意按照reservation feature 的要求和大家一起對這個shared namespace (按照reservation許可權)進行相應的讀寫操作。當然也可以通過reservation register 命令unregister 一個registrant 和replace registrant 的key。

Register 命令的IEKEY 域有一個小細節,按照1.3 以前的NVMe spec 可以把IEKEY(ignore existing key) 設定起來不需要知道當前的key 也可以unregister 和replace key。1.3 以後的NVMe spec 禁止了這種不check key 一致性 unregister 和 replace 的行為。

unregister 的時候,host 放棄了registrant 的許可權,如果之前他有reservation 管理員許可權,也會隨著unregister 命令執行成功釋放掉。 另外,Host 是通過host id 來識別的,registrant 是通過每個namespace 上的key 來識別的。 如果兩個host的host id 相同就表明兩個hosts 是同一個host,在同一個namespace上的許可權是一樣的。

關於reservation type

每一個namespace 在一個時間點,只能有一個reservation type 也就是隻有一種管理員許可權,這個管理員通過reservation 的key和host id 來標識自己的唯一性。這個管理員可以獨佔reservation 的讀寫許可權,也可以把這個讀寫許可權分享給其他registrants,甚至可以把管理員的許可權分享給其他registrants。

這裡的讀命令不是簡單的read 命令而是包括 read, compare, security receive.寫命令也不是簡單的write 命令而是包括 write, write uncorrectable, dataset management, flush, format NVM, namespace attachment, namespace management, security send。

Reservation 的管理員許可權還包括對reservation命令和其他vendor specific命令的管理,每一個命令的行為NVME spec都有明確的說明。所有reservation type 具體許可權如下圖:
reservation type

Reservation acquire 命令

  1. Acquire

Registrant(註冊者)通過acquire reservation 命令, 把Reservation Acquire Action (RACQA)域設定成為0 就可以得到對應的namespace 管理員許可權,前提是這個namespace 的reservation 許可權並沒有被分配,而且register key 需要驗證通過。這裡需要注意一個小的細節在NVME spec 1.3 之前的版本ignore existing key(IEKEY)設定為1 是有效的,表明可以忽略register key 一致性檢查,也就是說即使不知道這個host 之前register key 也是可以申請reservation 許可權的。1.3 版本NVMe spec IEKEY 這個域不再允許可以設定為1, 如果設定成1 這條這個命令直接報錯。

  1. Preempt

Preempt 搶佔這個功能是比較特別的一個功能。它可以替換不合作的reservation holder 或者是registrant,改變原來的reservation 許可權,重新建立新的許可權分配規則。能成功執行搶佔功能的host 一定要是registrant。

preempt搶佔功能是通過把Reservation Acquire 命令的Action(RACQA) 域設定成1實現的。具體的搶佔行為和reservation 的type有密切關係。具體的關係列舉如下:

  • a

當reservation 的type 不是 Write Exclusive - All Registrants 和Exclusive Access - All Registrants 也就是說這個namespace reservation 許可權的只有一個holder 的情況下。如果preempt reservation key(PRKEY)的值等於holder 的reservation 的key, Reservation holder會被unregister,當前的reservation許可權被釋放,傳送這個命令的registrant會根據指定的type建立新的reservation許可權。

如果PRKEY非0且沒有holer的key匹配,只有PRKEY匹配的registrant,則該registrant會被unregister。傳送這個命令的registrant會根據指定的type建立新的reservation許可權。

  • b

如果當reservation 的type 是Write Exclusive - All Registrants 和Exclusive Access - All Registrants,這種情況下reservation 的holders 是所有註冊者。如果PRKEY為0,則除了傳送這條命令的registrant,其餘registrants都會被unregister,當前的reservation許可權被釋放,新的reservation許可權由搶佔命令決定。

  • c

如果當前並沒有reservation holder,則與PRKEY值匹配的registrant會被unregister,新的reservation許可權由搶佔命令決定。

  • d

registrant 可以通過preempt 命令搶佔自己的許可權,機制也是和上面一樣,registrant 可以通過這種方法可以改變reservation 許可權的type和reservation 的key.

  • e

registrant 可以通過設定 reservation acquire 命令的RACAQ 域值為2 實現 (preempt and abort) 命令. Preempt and abort 命令的功能與前面說的preempt 功能非常接近,唯一不同在於在執行preempt 行為之前SSD會盡自己最大的努力嘗試去 abort 這個namespace 上的其他執行的命令。

Reservation Release 命令

Reservation release 命令通過Reservation Release Action(RRELA)域實現兩種釋放reservation 許可權的功能。

  • a

當RRELA 域設定成0 時,是release reservation許可權也就是釋放這個namespace 上面的reservation 許可權,這條命令成功需要發命令的host 是reservation 的holder。

  • b

當RRELA 域設定成1時,是clear reservation 許可權也就是釋放這個namespace 上所有reservation 的許可權和register的許可權。

這裡也有一個小的細節需要注意,在NVME spec 1.3 之前的版本ignore existing key(IEKEY)設定為1 是有效的,表明可以忽略register key 一致性檢查,也就是說即使不知道這個host 之前register 的key 也是可以申請reservation 許可權的。1.3 版本NVMe spec IEKEY 這個域不再允許可以設定為1, 如果設定成1 ,這條這個命令直接報錯。

Reservation Report

Host 可以通過reservation report 命令拿到這個namespace上所有的reservation 許可權和register 許可權狀態以及host ID,key 。

下面是解析的一段reservation report 的buffer 供大家參考:
reservation report
同樣通過這個reservation report 命令大家會發現通過這個report 我們可以知道另外一個host 的host id 和相應的reservation key, 所以從這點上看,reservation 模組是為了讓host 更好的分許可權工作,而不能作為安全模組用。

第三章 Reservation在PBlaze5上的應用

Memblaze的PBlaze5 910/916系列NVMe SSD在實現了雙埠和multiple namespaces 功能之後,又全面實現了reservation 功能, 這樣每一個namespace 都可以根據儲存系統裡Host 的需要讓每一個namespace 更加高效有效的利用起來。
更多Memblaze的技術文章,可以掃描下面二維碼:
Memblaze技術文章二維碼

相關文章