背景
线上有些机器根盘是HDD,性能比较差,有些客户会同时下发1000多个域名的IP黑白名单文件,文件并发大的时候装载程序发现有1000多个文件时间戳有变更,直接加载到共享内存时导致根盘IO突刺,影响了线上业务。
原因分析
通过原因分析发现,装载程序通过mmap函数调用,将ip黑白名单写入共享内存中,然后由操作系统自动将共享内存中的数据回写到磁盘文件上。操作系统回写的过程不可控,如果加载的ip黑白名单比较多文件比较大,很容易导致机械盘io升高。进而导致访问受到影响。
解决方法
先将ip黑白名单写入到内存中,然后对内存切割成多个分片,每个分片大小为2K。然后将每个分片的内容顺序写入到磁盘文件上。每写完一个分片,就暂停0.1毫秒,这样就可以控制写入磁盘文件的节奏比较均匀,以及控制最大写入速度不会超过20M/s.
这样就从应用层上控制了写入磁盘io的速度上限,理论上不会再出现集中写入导致的突刺。
流程图变更如下:
效果观察
新的方式写入后再也没有出现过硬盘突刺现象。