背景:
众所周知,nand flash 以page program, 复写必须要erase block,因此才有GC。
由于GC的存在,SSD内部就存在后端资源争夺的问题,firmware需要考虑如何平衡Host IO、GC、和内部meta data flush。这就是我们今天要讲的----SSD Internal Flow Control。
---这里假设内部IO理想情况只有GC。(先忽略internal meta data flush)
问题痛点:
由于GC的存在,Host IO 和 GC相互争夺资源,导致performance忽高忽低,Qos波动太大。下面有两张图:
1. 由于没有其他模块block到Host IO,其性能曲线大致如图:
2. 起GC之后,Internal GC和IO互相争夺资源,可能性能曲线会变成这样:
分析问题:
如图,有a、b、c、d四个点有明显的性能波动,下面依次分析4个点波动原因:
如图分析a、b、c、d曲线波动原因:
a: 在a点性能从正常单IO情况到开始跌落,分析最可能的原因是block count到底GC阈值, internal GC开始启动,挡住Host IO导致。(如起GC的条件是 free block count < N)
b: 在b点性能出现大幅度跌落,这时候 GC 和 Host IO争夺资源,导致。
c:c点和b点继续波动和跌落,可能是GC block Host IO导致积压过多,或者其他Internal IO block导致。
d: 性能恢复,退出Flow control,只可能是GC做完 free block count > M.
解决方案:
如何解决SSD 内部各种IO 冲突,使性能更平滑,控制latency?
方案1:
在Flow control中根据GC speed去计算IO下放粒度 (单位时间下放多少Data Unit)
简单来说: 这一轮GC释放多少Data unit(nand page)/ 这轮GC所花时间 = GC speed.
那么根据生产者 = 消费者原则,通过Gc speed去控制下一轮Host IO speed。
(GC speed = (GC free data unit count)/(GC end time - GC start time).)
方案2:
通过Src block Valid Count来算IO、GC的比例,简单来说:这个block VC占比决定这轮IO和GC的写比例。
通过GC free data unit count来计算下一轮IO:GC比例。
{
eg: Block data unit count / VC > 9 ---------> IO : GC = (9 + delta) : 1
Block data unit count / VC = x ------------> IO : GC = (x + delta) : 1
Block data unit count / VC = 1 ------------> IO : GC = 1 : (y+ delta). 《y = (100% - op)*100)》
}
两方案优劣:
方案1,这样的设计带来什么问题?
a. GC的过程也必定有Host IO进,造成GC的时间计算不准确,进一步影响Flow Control。
b. 随着不同类型的数据的写入, GC free data unit count可能呈现很大波动性,造成GC speed波动,进一步影响Flow Control下放IO粒度。
(eg: 写满盘后性能:GC free speed = (op(7%) * (block AU count (4800H)) * 4K)/ (GC 时间 = 1s)= 1300 Data Unit / s )
----->相当于1ms进1.3个IO.
方案2,这样的设计带来什么问题?
a. 由于VC分布不均匀,导致GC read时间不稳定,造成性能波动。
选那种方案?-----------------?(PID算法尝试)
思考:
如果在SSD使用后期,GC有遇到很多的Read retry or UECC,造成在相等Src valid count情况下GC有较大的波动,是否可以考虑delta = error type + GC 时间的加权。
本文来自博客园,作者:ingram14,转载请注明原文链接:https://www.cnblogs.com/ingram14/p/15778939.html