当mysql数据库中数据更新后,可以使用elasticsearchRepository.saveAll()
方法来将新增的数据保存到elasticsearch文档库中。
在我所在的场景下,大概每个月会一下往数据库写入几千条数据,然后一股脑得将之前的数据和新增的数据全部实体交给saveAll()
方法,那么就会占用大量的内存。
今天在执行saveAll()
后访问网站发现502,从宝塔上可以看到网站被关闭了。
执行dmesg
发现由于内存占用太多导致网站线程被关闭:
[18314358.456517] Out of memory: Kill process 29482 (java) score 313 or sacrifice child
[18314358.457800] Killed process 29482 (java), UID 1003, total-vm:3637272kB, anon-rss:1212976kB, file-rss:856kB, shmem-rss:0kB
在执行free -h
查看剩余内存只有100M
total used free shared buff/cache available
Mem: 3.7G 2.8G 172M 2.3M 720M 651M
Swap: 0B 0B 0B
因此判断是由于占用过多内存导致网站挂掉。
解决方法是优化程序逻辑,只save()
新增的记录来减少服务器压力。