千万级json文件静态化落地方案优化
最近在一个网站项目上,需要进行6000万个json文件的静态化落地。这些文件都是保存了业务数据的json文本,每个文件大小约为4K字节左右。鉴于ntfs在海量文件管理方面的劣势,采用了Linux网络存储方案。
但是在实际运行中,落地服务通过nfs写入文件比预期的慢很多,分析网络IO和磁盘IO,发现网络流量大,但是磁盘IO很低,落地效率极低。一次完整落地需要数小时才能够完成。网络IO和磁盘IO的不匹配现象提示网络流量中有效数据载荷并不高。怀疑为nfs的交互协议在这种千万级小文件上的消耗太大。
针对这种情况,试着使用C#编写了一个网络文件落地服务,使用Mono加载在Linux主机上运行。通过轻量化的Socket数据流进行落地。试运行,磁盘IO明显升高,落地效率也大幅提升到1小时内可以完成。
此时有效网络流量也大幅升高。
经过对业务数据的分析,发现这些json文件在格式上大同小异,仅其中的部分数据是不同的,所以,针对这种情形,修改网络文件落地服务的网络协议方案,采用约100个json文件压缩为一个二进制数据包传输。试运行,网络流量占用大幅降低,CPU占用明显升高,磁盘IO也有少量提升,落地效率进一步提升到半小时左右。
针对CPU占用明显升高的现象,分析托管的压缩算法执行效率比对应的C语言压缩算法实现要低,所以降低数据压缩的等级,由Optimal修改为Fastest。试运行,网络流量占用略有增加,CPU占用回落不少,磁盘IO基本打满,落地效率有微小提升。此时基本上网络、CPU、磁盘、内存消耗都很均衡,服务品质稳定。至此,千万级json文件静态化落地方案优化完成。
磁盘采用企业级SSD存储,万转硬盘无法承受此IO压力。
在合适的场景使用合适的技术。另外,针对具体业务数据,采用批量压缩的方法在不影响落地效率的情况下,大幅降低了网络负载。