Django 重负载下的扭曲连接超时

Django 重负载下的扭曲连接超时,django,sockets,ubuntu,network-programming,twisted,Django,Sockets,Ubuntu,Network Programming,Twisted,我们有一个Django web应用程序,为中等数量的用户提供服务,运行在一台Ubuntu机器上,该机器有8个内核和至少32GB的RAM。用户通过浏览器进行连接时,我们没有问题。然而,在后端(在同一台服务器上),我们也在运行twisted服务器。Django webapp试图连接到我们的twisted服务器,但在大约1100-1200次这样的连接(包括一系列到后端其他设备的持久连接)之后,所有连接都开始超时。我们的twisted服务器在低负载下运行良好,但现在服务器似乎无法处理来自Django的任

我们有一个Django web应用程序,为中等数量的用户提供服务,运行在一台Ubuntu机器上,该机器有8个内核和至少32GB的RAM。用户通过浏览器进行连接时,我们没有问题。然而,在后端(在同一台服务器上),我们也在运行twisted服务器。Django webapp试图连接到我们的twisted服务器,但在大约1100-1200次这样的连接(包括一系列到后端其他设备的持久连接)之后,所有连接都开始超时。我们的twisted服务器在低负载下运行良好,但现在服务器似乎无法处理来自Django的任何新连接。所有连接都超时。我们没有发现我们的代码有任何明显的错误(我们已经做了几年了,所以应该是相当稳定的)。我们已经将/etc/security/limits.conf中的软硬ulimits设置为50000/65000,并将somaxconn升级到65536。下面列出了我们扭曲过程的限制打印。tope 25进程中的文件总数刚刚超过5000个。不幸的是,我们仍然无法同时连接到twisted服务器大约1100-1200个。我们应该看些什么来让我们的扭曲连接重新开始连接?是否还有其他sysctl或其他Ubuntu Linux参数需要更改?我们是否需要更改扭曲的参数

Limit                     Soft Limit           Hard Limit           Units
Max cpu time              unlimited            unlimited            seconds
Max file size             unlimited            unlimited            bytes
Max data size             unlimited            unlimited            bytes
Max stack size            8388608              unlimited            bytes
Max core file size        0                    unlimited            bytes
Max resident set          unlimited            unlimited            bytes
Max processes             465901               465901               processes
Max open files            50000                65000                files
Max locked memory         65536                65536                bytes
Max address space         unlimited            unlimited            bytes
Max file locks            unlimited            unlimited            locks
Max pending signals       465901               465901               signals
Max msgqueue size         819200               819200               bytes
Max nice priority         0                    0
Max realtime priority     0                    0
Max realtime timeout      unlimited            unlimited            us

Twisted是应用程序周围的薄壳。当出现性能问题时,几乎总是出现在应用程序内部的某个地方,而不是在Twisted中。所以这个问题没有一般的答案

也就是说,你可以使用一些调查技术。您的扭曲进程是否消耗100%的CPU?如果是这样,那么您将需要以某种方式将其拆分为多个进程(使用
spawnProcess
sendFileDescriptor
adoptStreamPort
,以允许在子进程中完成I/O)。如果不是,那么您的问题可能是由于无意中阻塞了I/O,从而阻止了反应器为请求提供服务:您可能会使用类似于诊断反应器“卡住”的热点


还有一种可能性是,问题可能出在连接的Django方面。然而,由于没有关于Django如何建立这些连接的信息,我甚至猜不出更多的信息。

Twisted是应用程序的薄壳。当出现性能问题时,几乎总是出现在应用程序内部的某个地方,而不是在Twisted中。所以这个问题没有一般的答案

也就是说,你可以使用一些调查技术。您的扭曲进程是否消耗100%的CPU?如果是这样,那么您将需要以某种方式将其拆分为多个进程(使用
spawnProcess
sendFileDescriptor
adoptStreamPort
,以允许在子进程中完成I/O)。如果不是,那么您的问题可能是由于无意中阻塞了I/O,从而阻止了反应器为请求提供服务:您可能会使用类似于诊断反应器“卡住”的热点


还有一种可能性是,问题可能出在连接的Django方面。然而,由于没有关于Django如何建立这些连接的信息,我甚至猜不出更多的信息。

这台机器(虚拟机)实际上有8个内核。当我运行htop时,它显示每个核心上的平均负载约为20-30%。htop中的进程列表显示,一个进程总是使用大约150%的CPU。平均负荷为1.48、1.50、1.40。这个负载是分布在所有堆芯上,还是意味着我需要将进程分为多个进程?我们还记录了各种事情,日志文件显示反应堆没有挂起。当负载减少时,一切正常,但当更多客户端连接时,套接字连接开始超时。还有其他想法吗?至于Django是如何进行连接的,它是使用python telnetlib模块进行连接的。我们还有其他嵌入式设备正在连接到问题服务器。这些嵌入式设备使用扭曲的SSLClient进行连接,它们也存在连接问题。所以这不是Django的问题。有人有什么想法吗?我们被困在这里了。这台机器(虚拟机)实际上有8个内核。当我运行htop时,它显示每个核心上的平均负载约为20-30%。htop中的进程列表显示,一个进程总是使用大约150%的CPU。平均负荷为1.48、1.50、1.40。这个负载是分布在所有堆芯上,还是意味着我需要将进程分为多个进程?我们还记录了各种事情,日志文件显示反应堆没有挂起。当负载减少时,一切正常,但当更多客户端连接时,套接字连接开始超时。还有其他想法吗?至于Django是如何进行连接的,它是使用python telnetlib模块进行连接的。我们还有其他嵌入式设备正在连接到问题服务器。这些嵌入式设备使用扭曲的SSLClient进行连接,它们也存在连接问题。所以这不是Django的问题。有人有什么想法吗?我们被困在这里了。