nvme 盤寫放大

1. SSD 盤內部寫操作的來源

1.1 用戶請求

和其他存儲介質一樣,用戶的寫請求的數據及其相關meta 數據更新,是驅動SSD寫操作的主要來源。

1.2 垃圾回收(GC)

基於SSD介質需要擦除之後才能寫同一個位置的特性,對SSD邏輯地址的覆蓋寫會變成內部SSD物理地址的追加寫,而對之前佔用的物理地址空間就需要回收。這些空間通常是儘量湊成整個Block去回收,爲此Block 內部的有效數據就需要搬遷,這就導致了額外的寫。

1.3 磨損均衡 (wear leveling)

類似的限制是磨損均衡,爲了保證不同塊的PE儘量均衡,內部有時也可能需要搬遷數據。

1.4 壞塊管理

壞塊上的數據需要搬遷,這也會導致內部額外的寫操作。

1.5 讀干擾 (Read Disturb)

當某個閃存塊的讀的次數達到一定閾值的時候,FTL會把這些數據從該閃存塊搬走以避免數據出錯。

1.6 數據保持 (Data Retention)

由於電荷流失,閃存塊上的數據保持可能出現問題,爲此FTL需要搬遷這些數據。

2. nvme盤寫放大統計

從上面的介紹可以看到SSD內部有許多種額外的寫操作,爲了分析這些寫操作對用戶寫請求的影響,就需要統計出這些數據。
對於nvme 盤,可以藉助nvme cli工具去獲取相關數據。

2.1 準備工作

在linux系統上,可以下載並編譯nvme cli工具:
git clone https://github.com/linux-nvme/nvme-cli.git
cd nvme-cli
make

如果出現下面的問題:
NVME_VERSION = 1.6.72.g43f2.dirty
cc -D_GNU_SOURCE -D__CHECK_ENDIAN__ -O2 -g -Wall -Werror -std=gnu99 -DNVME_VERSION='"1.6.72.g43f2.dirty"' -c nvme-print.c
In file included from nvme.h:34:0,
from nvme-print.h:4,
from nvme-print.c:6:
linux/nvme.h:19:24: fatal error: linux/uuid.h: No such file or directory

可以參考下面的方法解決:
修改如下:
#ifndef _LINUX_NVME_H
#define _LINUX_NVME_H

#include <linux/types.h>
//#include <linux/uuid.h> //   註釋掉這行

2.2 確定nvme盤類型

使用lsscsi /smart  獲取相關盤的類型

2.3 讀取nvme盤寫統計數據

[root@localhost nvme-cli]# ./nvme intel smart-log-add /dev/nvme0n1
Additional Smart Log for NVME device:nvme0n1 namespace-id:ffffffff
key normalized raw
program_fail_count : 100% 0
erase_fail_count : 100% 0
wear_leveling : 96% min: 164, max: 206, avg: 190
end_to_end_error_detection_count: 100% 0
crc_error_count : 100% 0
timed_workload_media_wear : 100% 63.999%
timed_workload_host_reads : 100% 65535%
timed_workload_timer : 100% 65535 min
thermal_throttle_status : 100% 0%, cnt: 0
retry_buffer_overflow_count : 100% 0
pll_lock_loss_count : 100% 0
nand_bytes_written : 100% sectors: 7654336
host_bytes_written : 100% sectors: 6398681
[root@localhost nvme-cli]# ./nvme intel smart-log-add /dev/nvme0n1
Additional Smart Log for NVME device:nvme0n1 namespace-id:ffffffff
key normalized raw
program_fail_count : 100% 0
erase_fail_count : 100% 0
wear_leveling : 96% min: 164, max: 206, avg: 190
end_to_end_error_detection_count: 100% 0
crc_error_count : 100% 0
timed_workload_media_wear : 100% 63.999%
timed_workload_host_reads : 100% 65535%
timed_workload_timer : 100% 65535 min
thermal_throttle_status : 100% 0%, cnt: 0
retry_buffer_overflow_count : 100% 0
pll_lock_loss_count : 100% 0
nand_bytes_written : 100% sectors: 7654576
host_bytes_written : 100% sectors: 6398903

對比上面的兩組數據可以看到,nand_bytes_written/host_bytes_written都在增加,前者是內部SSD的物理空間寫的總量,後者可以認爲是來自用戶的寫請求總量,可以認爲一段時間內兩者增量之比值就是該時間段內的寫放大係數。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章