如何为大量数据重建弹性搜索索引,而不会在 15 小时左右后"Killed"



我在AWS上的Postgres数据库中有大约1.3亿篇文章。我正试着用弹性搜索来索引它们。在屏幕上,我输入:

python manage.py search_index --rebuild -f --parallel --model [APP NAME].[MODEL NAME]

一切开始都很顺利。输出为

Deleting index '[MODEL NAME]'
Creating index '[MODEL NAME]'
Indexing 129413202 'MODEL NAME' objects (parallel)

但大约15个小时后,输出被"杀死"。我在一个t2.xlarge EC2实例上运行这个,它有16GB的内存。有趣的是,"Killed"消息发生在我看到与AWS服务器的连接断开之后,但如果进程在屏幕上运行,那也没关系。知道问题是什么吗?我只需要获得一个更大的EC2实例吗?

进程意外退出并显示消息Killed通常意味着它收到了SIGKILL;如果是,那么退出代码将是137。在这里很难确定,进程显然可以打印Killed并以代码137退出,但假设您在代码中没有这样做,那么这就是我接下来要检查的内容。

意外的SIGKILL通常来自内核的OOM杀手,它在系统内存不足时采取行动,通常会杀死内存占用最大的进程。如果是这样,它将在内核日志中记录详细信息,您可以使用dmesg读取这些信息。

如果它是OOM的杀手,那么这听起来像是这个索引代码中的一个bug。将大量文档索引到Elasticsearch中需要非常有限的工作内存,远未达到16GB,但很容易意外地将太多数据在内存中保存太长时间,从而导致过度使用内存。

python manage.py search_index建议您使用Django Elasticsearch DSL,该DSL最近修复了一个性能问题。请确保您使用的版本包含此修复程序。

最新更新