整个 web 服务是用 ssh 连接到另一台机器抓包的。 最近发现 Django 启动后,线程数一直增长,最后服务就崩掉了。 经过排查,原因是服务有一个接口是前端用来周期性查询已抓包数量的,大概 2s 一次;每次查询包数量都是一次请求;当抓包的时候,服务的线程数以肉眼可见速度增长,初步断定就是报文查询接口导致的。 这一块功能没有使用任何多线程,应该就是每次 request 来之后,Django 框架生成的线程。 我的疑惑是当一次请求结束后,Django 不会结束或者复用当前线程吗?有什么办法可以避免这种情况。 先谢过 V 友
线程问题排查解决了,谢谢各位V友。最后排除发现是查询报文数量后,ssh 连接没有关,导致线程不能正常消亡;在查询完报文数量把 ssh 连接关掉就可以解决问题。
那么新的问题又来了,我ssh连接用的是python的paramiko,现在是每次查询报文都需要新建一次SSH连接,查询完成后再断开;其实这样子从逻辑上是完全没有必要的,因为对于某一次抓包,每次查询报文都是针对同一个机器,也即可以复用同一个SSH连接,那请问有没有办法在某一次开始抓包后,把这个ssh连接存起来,查询报文数量的时候直接使用这个ssh连接,在结束抓包的时候关闭SSH连接,不用每次查询报文数量都打开一次SSH连接。
代码如下:
# 连接SSH
conn = = paramiko.SSHClient()
conn.set_missing_host_key_policy(paramiko.AutoAddPolicy())
conn..connect(host, port, user, password)
# 执行命令
stdin, stdout, stderr = conn.exec_command(cmd)
# 关闭SSH
conn..close()
1
676529483 2019-11-29 17:51:23 +08:00
会结束线程,是不是没有正常退出?如果真的很经常请求,可以用 channels 走 websocket
|
2
Leigg 2019-11-29 18:43:31 +08:00 via Android
请求有及时返回吗?代码有没有问题啊?这种情况百分之九十九是写的代码有问题
|
3
Ehco1996 2019-11-30 09:44:50 +08:00
怎么起 django 的?
前面有一层 webserver 做代理么? 比如 uwsgi -gunicorn 之类的 实际上 webserver 之前应该再套一层反代比如 nginx 之类的来做负载均衡 |
4
NewConn OP @Leigg 代码功能是没有问题的,最后排除发现是查询报文数量后,ssh 连接没有关,导致线程不能正常消亡;在查询完报文数量把 ssh 连接关掉就可以解决问题。谢谢解答
|
5
hustlibraco 2019-11-30 10:16:08 +08:00
ssh 链接不要复用,经常会莫名其妙 block。还是用到的时候再初始化对象吧,开销也没多大
|
6
Hopetree 2019-11-30 16:50:48 +08:00
保存状态的话,丢到 redis 里面试试,不知道 ssh 的连接状态 redis 能不能保存,有可能转换一下格式可以存起来后续调用,但是感觉这样反而不如每次单独连接稳妥
|