ingram14
原博客地址:https://blog.csdn.net/wangpeng22

    背景:

          众所周知,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 )

----->相当于1ms1.3IO.

       方案2,这样的设计带来什么问题?

         a. 由于VC分布不均匀,导致GC read时间不稳定,造成性能波动。

    选那种方案?-----------------?(PID算法尝试

    思考:

            如果在SSD使用后期,GC有遇到很多的Read retry or UECC,造成在相等Src valid count情况下GC有较大的波动,是否可以考虑delta = error type + GC 时间的加权。

posted on 2021-07-05 18:12  ingram14  阅读(150)  评论(0编辑  收藏  举报