armink / EasyFlash

Lightweight IoT device information storage solution: KV/IAP/LOG. | 轻量级物联网设备信息存储方案:参数存储、在线升级及日志存储 ,全新一代版本请移步至 https://github.com/armink/FlashDB
MIT License
1.99k stars 760 forks source link

reduce gc time. #119

Closed liangzhanggb closed 3 years ago

liangzhanggb commented 3 years ago

关于easyflash4的gc逻辑是空间不够了,然后触发一次gc,但是gc的时间过长会影响用户的体验。 因此,我们尝试去修改了这部分逻辑,尽量避免一次gc耗时过长。

armink commented 3 years ago

是如何做到 GC 时间的的降低呢?

liangzhanggb commented 3 years ago

1

2

liangzhanggb commented 3 years ago

我们知道,通常一个扇区擦除的时间在45~100ms左右,如果easyflash扇区有400K空间,

有些场景,夸张一点,例如每次上电只更新boot_times,老版本一次gc可能就需要 4.5 S~ 10 S,这个显然会影响大部分用户的体验。而增加这个patch后,可能只需要擦除2个扇区就可以了(因为有提前终止逻辑,得益于原有架构已经考虑到提前终止逻辑)。

如果当前patch对软件架构理解不够,还请 @armink 辛苦帮忙指点一下,多谢多谢。

armink commented 3 years ago

我大概明白了,是 GC 时候不对所有扇区进行 GC ,只 GC 一个扇区就退出,这样格式化扇区的数量少,时间也就少了,挺不错的想法 👍

另外,DEFAULT_GC_FLAG 是做什么用处?

liangzhanggb commented 3 years ago

这边发现有个case过不了,pr暂时close,修复后再重新提交,多谢多谢。