EasyFlash icon indicating copy to clipboard operation
EasyFlash copied to clipboard

环境变量key写入问题

Open mingminglove opened this issue 5 years ago • 11 comments

Hi armink, 我们产品市场长期工作之后问题显露出来。 问题1:调用API接口ef_set_env_blob写入大量的key这样easyflash_init初始化时间会增加,并且再次ef_set_env_blob时间也会相应的增加。我调用ef_del_env删除所有环境变量,但是初始化时间并没有减少,ef_set_env_blob时间也没变化还是很长。不知道怎么解决? 问题2:这个时间增加不是只和key的多少有关,而我反复调用ef_set_env_blob写同样的key值,key没有增加但是反复写入。easyflash_init初始化和ef_set_env_blob时间也会增加。不知道怎么解决? 问题3:当我调用ef_set_env_blob写入同一个key值磨损均衡,当这个ENV_AREA_SIZE区域写满时,是循环继续从是EVN首地址写吗?

mingminglove avatar Jun 29 '20 07:06 mingminglove

你的数据量有多大?可以试试 legacy 模式?

image

armink avatar Jun 29 '20 08:06 armink

Hi armink, key不固定,最多不超过200个.但是每个key的data size最大能达到2K。反复调用ef_set_env_blob写同样的key值,ef_set_env_blob时间会一直增加,这也当初导致在写flash过程看门狗超时的根本原因。 使用 legacy 模式,是不是easyflash版本要切换3.0?还是只添加 ef_env_legacy.c 及 ef_env_legacy_wl.c就可以了。

mingminglove avatar Jun 29 '20 09:06 mingminglove

用 legacy 时需要有充足的内存,200*2K = 400K,你先详细看下 README 里的介绍

armink avatar Jun 29 '20 11:06 armink

Hi armink, 感谢您耐心的回答,200*2K = 400K这个内存开销太大了,我用的M4内核最大内存200K现在应用层已经用了大部分,剩余给easyflash不足8K。如果不用legacy 模式,NG模式ef_set_env_blob多次写入同一个key会导致时间增加是不可避免无法解决的,对吗?其实我还写不明白这个机制,理论上就一个key不停写入也只有一个key,也无需遍历很多key为什么时间会一直增加。

mingminglove avatar Jun 30 '20 00:06 mingminglove

同一个 key 写入多次,内部的操作是先删除以前的,再插入新的。这里的删除操作,不一定是真正的删除,而只是做了脏标记,下次检测到这个脏 key ,就自动跳过了。所以时间长了以后,脏的越来越多,查询时间也就越来越长,也许手动再后台,不定期调用 GC 后,这种情况也会有缓解,你可以试试。

另外你现在配置的 ENV 分区的容量是多大?

armink avatar Jun 30 '20 00:06 armink

好的,我试试。我现在分配给ENV的容量是26M。

mingminglove avatar Jun 30 '20 01:06 mingminglove

26MB?那确实太大了,空间给 200*2K*4 差不多就够了

armink avatar Jun 30 '20 01:06 armink

是太大,到时候我按实际的内存给他分配。是不是如果一个key写满ENV的容量,下一次再次写入key的时候就会从首地址覆盖脏标记内容。

mingminglove avatar Jun 30 '20 01:06 mingminglove

KEY 写满了,会自动执行 GC 的,以前脏的 KEY ,都会自动被清理掉,所以 GC 后的执行速度又会变快了

armink avatar Jun 30 '20 01:06 armink

明白了,多谢。

mingminglove avatar Jun 30 '20 01:06 mingminglove

@armink 今天自己研究了easyflash的代码,我觉得easyflash存储数据大了以后,速度变慢,主要是因为每次都要从flash的首地址开始按照扇区查找并确定各个扇区的状态。 ef_cfg.h中,对norflash的最小擦除粒度是4K,由于还有32和64K的block,我是否可以将最小擦除粒度修改为64K,这样每次查找的次数就会减少16倍? 不知道我理解的对不对

HikerPan avatar Jul 03 '20 09:07 HikerPan