我使用FastCGI服务器在Nginx上运行基于Django的站点。该网站通常很棒。但是每隔2-3天,该网站就会遇到未知问题并停止响应任何请求。
Munin图表显示IO块读取&在问题发生期间,每秒写入次数增加了500%。
我还写了一个python脚本,每隔一分钟记录下面的统计数据。
Load Averages
CPU Usage (user, nice, system, idle, iowait)
RAM Usage
Swap Usage
Number of FastCGI Processes
RAM Used by FastCGI Processes
记录显示,在问题发生期间,FastCGI进程的数量翻了一番(从正常值10-15到25-30)。 FastCGI进程的RAM使用率也翻了一番(从服务器总RAM的17%到35%)。内存使用量的增加需要使用更多的交换,因此它会降低磁盘IO的速度,导致服务器无响应。
我使用的FastCGI参数:
maxspare=10 minspare=5 maxchildren=25 maxrequests=1000
我想这个问题是由于我网站的某些部分编写的Python代码写得不好。但我只是不知道如何找出代码的哪一部分冻结现有的FastCGI进程并分配新实例。
答案 0 :(得分:1)
您已将子项数限制为25,因此当有25个进程正在运行并处理请求时,任何其他进程将阻止,并且该站点似乎没有响应。
听起来像你有一个无限(或很长)的循环导致进程被阻塞。我建议你在FastCGI脚本中添加一个idle-timeout。这有望通过杀死长时间运行的查询来允许站点继续运行,并允许您通过从进程被杀死的位置发送回溯来调试问题。