【发布时间】:2015-10-02 13:21:57
【问题描述】:
我正在部署一个 Django 应用程序,我使用 apache 进行部署,模块 WGSI 和 mongodb 作为数据库。
我每 10 分钟调用多个 cronjob,为许多 API 收集数据(使用 django-kronos)。
当服务器启动时,一切都很好,但几个小时后服务器开始滞后,现在他倒下了。使用了 100% 的 CPU。 Here:
这是我的 crontask 之一:
@kronos.register('*/10+2 * * * *')
def update_mongo():
# init the instagram api
api = InstagramAPI(client_id = 'SOCIAL_AUTH_INSTAGRAM_KEY',
client_secret = 'SOCIAL_AUTH_INSTAGRAM_SECRET')
# Get Last post added in database
try:
last_id = Post.objects(keywords = 'news').order_by('-created_at').limit(1)[0].insta_id
except:
last_id = 0
# Get the last Media tagged news
if last_id != 0:
results = api.tag_recent_media(tag_name = 'news', min_tag_id = last_id)
else:
results = api.tag_recent_media(tag_name = 'news')
for result in results:
# if post doesn't exist, we create a new one
try:
post = Post.objects.get(insta_id = result.id)
except:
post = InstaPost()
# Init the post and save it in database
post.save(result)
如果我不知道问题到底出在哪里,现在的问题是 apache + django 吗?还是这条线post = Post.objects.get(insta_id = result.id)?
编辑
我删除了 cronjob 并遇到了同样的问题,一段时间后,物理内存和 CPU 刚刚爆炸,服务器开始严重滞后。
服务器是一个非常糟糕的临时服务器:1 个核心,992 MB RAM
【问题讨论】:
-
我看到你用的是newrelic。使用new relic就可以知道哪部分代码占用CPU最多。
-
@EdwinLunando 我只在服务器上安装了它,我现在正在注册我的应用程序
-
你需要找出 10 到 11 之间发生了什么。Mongo 和 Apache 是稳定的代码,所以除非你把它配置得很奇怪,否则这些都不是问题。另外,为什么不直接发出管理命令并从 actual cron 调用这些命令?
-
@timkofu :我检查了日志,在 10 点之前没有什么特别的事情发生,我在 10:45 左右重新启动了服务器。关于 Mongo 和 Apache 我通过 apt-get 安装了它们,并配置了 apache 以使其与 wsgi 一起工作。制作管理命令和使用 django-kronos 有什么区别?
-
@LolWalid 管理命令 + cron 意味着两者之间没有代码可能会或可能不会与您的应用程序进行不良交互。尽量少使用第 3 方应用程序是一种很好的做法。
标签: django apache mongodb cron wsgi