我正在使用nginx + uwsgi + django在生产中部署一个网站。该网站每天有大约3亿个请求,最大并发度是每秒4000个,我有4个nginx在前面,6个uwsgi在后端,nignx communicat with uwsgi通过tcp。
它在几个月内表现良好。但有一天uwsgi突然不起作用。它会抛出以下信息:
HARAKIRI:--- uWSGI工作人员72(pid:23094)WAS管理请求/2/article/v2/stream/?detail=1&image=1&count=20&max_behot_time=1358697136&latitude=39.914651254102&经度= 116.45855261839& city =& device_platform = android& channel = hiapk& version_code = 220& app_name = news_article& openudid = 474604a56e33a44f& uuid = 353769056450763& os_api = 16& device_type = GT-N7100& os_version = 4.1.1 since Mon 1月21日23:07:51 --- ---
从上面的消息看来,由于django应用程序中有一个很长的请求,uwsgi似乎自杀了。但我检查我的应用程序查看时间和调试, 我确信我的应用程序非常快(约100毫秒处理请求)。
令我惊讶的是,我发现nginx会向uwsgi投入大量的连接时间,因为uwsgi会反复查杀并且队列已满。
所以我对uwsgi进程进行了分析,我发现uwsgi在写入系统调用时被阻止,直到它杀死了itseslf:
writev(8,[{“HTTP / 1.1”,8},{“”,1},{“200 OK”,6},{“\ r \ n”,2},{“Vary”, 4},{“:”,2},{“Cookie”,6},{“\ r \ n”,2},{“Content-Type”,12},{“:”,2},{“ text / html; charset = utf-8“,24},{”\ r \ n“,2},{”\ r \ n“,2}],13)= 73
写(8,“{\”has_more \“:true,\”message \“:\”s“......,24005
根据我的理解,uwsgi在tcp中使用非阻塞模式,它永远不会被阻止。我谷歌很长一段时间,有很多尝试,但它没有帮助。
最后,我改变了我的部署模式,我在前面使用4个nginx listen 80端口并使用http_proxy到6个nginx端口81,nginx 81端口用uwsgi与unix文件sock进行通信。在此尝试之后,uwsgi从不阻止,一切都好。
谁能告诉我为什么uwsgi在写入系统调用时被阻止了我认为应该永远不会发生?或者在什么情况下,当通过tcp与nginx进行通信时,uwsgi将被阻止?
非常感谢