从Docker容器中的Django + Celery诊断API超时

我有一个9服务的微服务架构,每个服务运行在自己的容器中。

这些服务使用多种技术,但主要是Django,Celery(使用Redis队列),共享的PostgreSQL数据库(在自己的容器中)以及一些更具体的服务/库。

微服务通过REST API相互交stream。

问题是,有时以一种随机的方式,一些容器API不再响应,卡住了。 当我在他们的界面上发出一个curl请求时,我得到一个超时。

那一刻,所有其他的容器都回答得很好。

有两个托盘容器。 我注意到,这两个阻塞容器使用:

  • Django的
  • Django的rest框架
  • 芹菜
  • Django的芹菜
  • 作为Celery broker的embedded式Redis
  • 访问位于另一个容器中的PostgreSQL数据库

我不知道如何解决这个问题,因为没有相关的信息在服务或Docker日志中可见。

问题是这些API只是在随机时刻被卡住了。 为了使它再次工作,我需要停止阻塞容器,并再次启动。

我想知道如果这可能是一个pythonGIL问题 ,但我不知道如何检查这个假设…

任何想法如何麻烦这个?

你可以将shell放入正在运行的容器中,然后检查一下。 芹菜过程是否还在运行等…

docker exec -ti my-container-name /bin/bash

例如,如果您使用的是django,则可以转至django目录并执行manage.py shell并在此处开始拨动。

我有一个类似的设置,我使用django / celery / celerybeat / nginx /运行多个Web服务…

但是,通常我会为每个容器运行一个进程(类似的django和gunicorn运行在同一个容器中)。 然后我使用--volumes-from来分享内容。

例如,gunicorn应用程序写入一个.sock文件,容器有自己的nginxconfiguration; nginx容器--volumes-from django容器中获取--volumes-from来获取这个信息。 这样,我可以为我的所有Web服务使用一个股票nginx容器。

另一个便于debugging的方法是login到stdout并使用docker的日志驱动程序(splunk,logstash等)进行生产,但在debugging时将其logging到容器中。 通过这种方式,您可以在testing中获得“泊坞窗日志”中的大量信息。 docker工人的优点之一是你可以把生产中出现的错误代码放在显微镜下运行,进行debugging。