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参数需要更改?我们是否需要更改扭曲的参数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的任
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的问题。有人有什么想法吗?我们被困在这里了。