我在Flask中有一个运行在uwsgi上的推荐系统。我的flask API开始加载一个大于或小于5 5gb的模型,然后它将等待推荐输入。问题是:我已经尝试了很多配置设置,但uwsgi不会使用超过50%的可用内存。使用16 30时,我总是收到信号9(“该死的!worker 1 (pid: 30)已死,被信号9杀死:(正在尝试恢复...)”)并且uwsgi重新开始这个过程(加载模型等)。我尝试使用20 it的内存,它可以正常工作。但它并没有利用可用的资源。我在这里做错了什么?
我当前的uwsgi.ini是:
[uwsgi]
socket = 0.0.0.0:$APP_PORT
protocol = http
chdir = b-finder-recommendation
wsgi-file = recommendation_api.py
callable = app
uid = $USER_ID
gid = $USER_GROUP_ID
strict = true
master = true
enable-threads = true
single-interpreter = true
processes = 1
threads = 5
need-app = true
vacuum = true
die-on-term = true
lazy-apps = true发布于 2020-09-22 06:39:05
UWSGI不会杀死你的flask应用程序。uwsgi正在监视这个进程,注意到它已经被信号9杀死,并试图重新启动它。
杀死你的进程的可能是你的操作系统。由于某些ulimits或因为它已被配置为在操作系统认为整个系统消耗太多RAM时终止消耗大部分内存的进程。
我猜加载一个模型意味着将整个数据库表读取到RAM中。(您为什么要这样做?通常,您使用数据库来,而不是,将整个表保存到RAMm中,但是如果不是所有的东西都在内存中,那么您的算法可能真的非常低效)
另一种可能的情况是,您的服务器以这样一种方式编写,即每个线程都是loading in the model的(您是否使用全局变量和Lock来避免在模型中多次加载?
另一个问题可能是误解,认为在Python中读取大小为5 5GB的数据库只需要5 5GB的RAM。情况并不总是这样。python在内存中表示变量的效率可能更高,也可能更低。
例如,字符串通常在内存中每个字符至少使用两个字节,而不是您可能预期的每个字符使用一个字节,即使它只是ASCII字符。
我建议尝试以下两件事:
1.)为了测试和调试,将uwsgi变量threads设置为1。你还会遇到同样的问题吗?
2.)将你的内存设置为20 is,并与ps / top或任何你想要的检查,有多少内存被使用。
这有助于您了解问题,或者您有更多的数据点,您可以与我们分享以找到问题。
如果问题是,您确实消耗了比预期更多的RAM (即使使用一个线程),那么可能有方法以更有效的方式存储数据,或者只将数据的一些键存储在RAM中,并为其余的数据执行一些数据库访问。如果不了解您的代码和数据的性质,当然很难给出具体的建议。
https://stackoverflow.com/questions/63999190
复制相似问题