首页 > 其他分享 >django使用gunicorn框架,客户端请求耗时接口被中断问题

django使用gunicorn框架,客户端请求耗时接口被中断问题

时间:2023-06-29 14:02:46浏览次数:43  
标签:gunicorn 代码 worker 接口 django timeout 进程 客户端

  项目使用的是django,使用了gunicorn作为动态web服务,使用的是supervisor作为进程管理工具。

  由于特殊原因,最近上线了一个非常耗时的http接口,一段时间后开始有用户陆续反馈他们的代码调用这个接口会返回502错误,经过一段时间的排查排除了网关的问题,确认是系统问题。

  经过日志信息的比对分析,发现这个接口请求的代码只执行了大半,没有执行完。怀疑是worker进程被强制重启,但是没有证据,于是在日志中加上了进程号信息,最终排查发现这个接口的处理进程确实在某一个时间点之后开始就完全没有日志了(也就是说进程确实被重启了)

  一开始以为是supervisor强制重启了进程,但是看到supervisor配置的等待时间是1个小时,但是这个接口的耗时远没有1个小时这么久,所以排除了supervisor问题。

  结合日志和代码发现:每次接口请求都是在同一行代码上出现问题。代码本身没什么疑点,但这行代码使用的第三方的sdk,肝了源码发现这个函数会阻塞整个进程,但也不会导致内存溢出等问题,代码问题的排查实在没有头绪。但柯南说过:“排除了所有可能之后,最不可能的那个可能就是真相”,那怀疑对象就落在了gunicorn身上。

  上网查吧,查到gunicorn有个参数叫timeout,是这么描述这个参数的

gunicorn默认的timeout时间是30秒。
gunicorn的管理进程如果在timeout时间内,没有收到worker进程的消息心跳,则会认为worker进程出现了死亡,从而重启相应的worker进程。会导致worker进程正在执行的任务被中断。
worker进程处于阻塞或高CPU计算时,会出现不能及时发送心跳给管理进程的问题。

  好了,大概率抓到问题点了,我的配置参数里面没有设置这个参数,也就是说使用的默认30秒,但刚刚上面提到的那行阻塞代码的阻塞时间完全在30秒以上,那这个问题也就明朗了。把timeout参数加上吧。

 

疑点:

  目前遗留了一个问题,这个进程管理用心跳感觉不太合理,实在不清楚是如何设计的,回头再肝一下gunicorn的源码吧

标签:gunicorn,代码,worker,接口,django,timeout,进程,客户端
From: https://www.cnblogs.com/gangdou/p/17514020.html

相关文章

  • 获取邮箱(QQ、126、163)的客户端授权码
    获取QQ邮箱的客户端授权码1、首先登录QQ邮箱(https://mail.qq.com),然后,点击“设置”按钮。2、点击“账户”按钮,进入“账户”页面。3、在账户页面将页面往下拉,找到pop3设置,选择“开启”。4、据要求进行验证(此处以手机密保验证为例),验证完毕后,点击“我已发送”按钮。5、接下来......
  • django离线脚本的使用(就是需要借助django的功能,然后写一些脚本)
    在django中,我们可以创建一些离线脚本,它的意思是我们并没有启动django服务,而只是运行了django的一些配置以便我们在脚本里完成一些,需要django环境支持的脚本操作下面是详细用法:#启动djangoimportosimportsysimportdjango#首先,一定要把当前项目的路径加到python模块搜......
  • 10redis列表操作,其他操作,redis管道,django中使用redis,django缓存,序列化json和pickle,cel
    字符串和字节转换的两种方式#字符串和字节转换的两种方式 -decode,encode-直接类型转换-bytes格式的16进制,2进制,10进制的显示#字符串需要用encode,bytes格式需要用decode,但是有时候忘了#可以直接进行强转b1=bytes(s,encoding='utf-8') print(......
  • django中ORM的相关操作
    ORM-操作<br>基本操作包括增删改查<br>ORMCRUD核心->模型类.管理器对象一、管理器对象每个继承下自models.Model的模型类,都会有一个object对象被同样继承下来,这个对象叫管理器对象<br>数据库的增删改查可以通过模型的管理器实现二、创建数据DjangoORM使用一种直观的......
  • 客户端在HDFS上读、写数据的流程
      ......
  • django项目在windows的部署(apach+Mod_wsgi+django)
    如果django项目如果要正式使用,我们需要将项目部署到开发环境上去。django项目自带的服务不支持多线程,会出现多个用户访问时,页面卡死,半天打不开的问题。所以,该如何部署django项目呢?下边是我的部署经验,实测有效。如果可以的话,尽量部署到linux上,但是我的系统中涉及到一些window文件......
  • django缓存的使用
    缓存:可以把django中的一个变量(数据),存放到某个位置,下次还可以取出来之前用过:默认放在:内存中,其实可以放在文件中,数据库,redis。。。。fromdjango.core.cacheimportcachecache.set('key','value',5)#存放值res=cache.get('key')#取值通过配置,控制存放在哪,只要如下写,就会......
  • Kubernetes编程——修改客户端默认支持 Protobuf
    修改客户端默认支持Protobuf一、在kubernetes客户端中修改默认支持Protobuf确保你已经安装了kubectl命令行工具,并且版本在1.14.0或更高。打开~/.kube/config文件,该文件存储了你的Kubernetes集群配置信息。找到clusters部分,并在你的集群配置下添加extensions字段,示例如下:......
  • CAS SSO单点登录基础实践,配置CAS 服务器和CAS客户端
    参考网址:http://www.ibm.com/developerworks/cn/opensource/os-cn-cas/index.html 到CAS官方网站下载CASServer和Client,地址分别为:http://www.ja-sig.org/downloads/cas/cas-server-3.1.1-release.ziphttp://www.ja-sig.org/downloads/cas-clients/cas-client-java-3.0.0.z......
  • python的django框架开发简单的管理系统(一)
    写在最前面:博主现在大二,也不是名校。刚刚接触电脑的时候,装个虚拟机都能搞崩溃。WPS甚至不知道怎么保存,以为发文件的之前关闭,文件就没了。一把辛酸泪啊读者们不必妄自菲薄。废话少说,直接开始。准备:安装python解释器提供3.10,3.9.3.11。尽量选3.9或者3.10:链接:https://pan.baidu.com......