Python uWSGI应用程序中的分段错误
我对在python脚本中使用uwsgi还相当陌生,所以希望这是一个幼稚的错误 我有两个不同的web应用程序,它们与独立但相关的python库进行交互,我们称它们为lib1.py和lib2.py 如果从命令行使用这些库,则不会出现错误 我创建了两个python文件app1.py和app2.py,它们分别连接到不同的uwsgi套接字。这些文件的基本框架是:Python uWSGI应用程序中的分段错误,python,numpy,segmentation-fault,uwsgi,blas,Python,Numpy,Segmentation Fault,Uwsgi,Blas,我对在python脚本中使用uwsgi还相当陌生,所以希望这是一个幼稚的错误 我有两个不同的web应用程序,它们与独立但相关的python库进行交互,我们称它们为lib1.py和lib2.py 如果从命令行使用这些库,则不会出现错误 我创建了两个python文件app1.py和app2.py,它们分别连接到不同的uwsgi套接字。这些文件的基本框架是: import lib1.py #load objects into memory MyObject = lib1.MyClass(init_p
import lib1.py
#load objects into memory
MyObject = lib1.MyClass(init_params)
application(environ, start_response):
status = '200 OK'
output = MyObject.processRequest()
response_headers = [('Content-type', 'text/html'),
('Content-Length', str(len(output)))]
start_response(status, response_headers)
return [output]
导入lib2的app2.py也是如此
App1工作得很好,我对它的设置没有问题。当MyObject初始化时,它会加载几十个大型(100000多行,约100列)numpy数组,并将它们保存在内存中,以便应用程序函数在从web服务器接收请求时进行计算
App2尚未运行。。。lib2.py导入lib1.py,因为作为其工作的一部分,它需要在大型numpy数组上执行类似的计算。奇怪的是,它是抛出SEGFAULT的lib1.py函数之一。起初,我认为这可能是某种奇怪的双重导入的症状,这就是我第一次看到这种情况时将uwsgi分成两个独立的套接字和应用程序的原因。更奇怪的是,lib2只使用1个大的numpy数组,它比lib1最大的numpy数组小。通过在我的代码中放入大量的print
语句并查看日志,我能够找到发生SEGFULT的确切线路:
inner_product_array = np.dot(self.coordinates, vector.T)
self.coordinates是一个2d MxN数组,vector.T是一个Nx1列向量。如果我这样限制self.coordinates数组,SEGFAULT就会消失:self.coordinates[:500,:]
但是,每当切片变得比500大得多时,就会发生SEGFAULT,而这远远不是我需要的150000。同样,当self.coordinates可以达到50000x200时,此计算在lib1中不会引起任何问题
我觉得我已经尽可能地完成了,以确保没有模块/库被双重导入。其他numpy函数表现良好,而且,当从命令行使用时,lib2在处理大型数组时也能很好地工作
唯一需要提及的另一个奇怪症状是,以前,当我有一个app.py文件来处理我所有的uwsgi python代码,并使用PATH_INFO环境变量(包括除这两个变量之外的其他变量)处理不同应用程序的请求时,所有应用程序都可以正常工作,直到我添加了lib2。一旦添加了lib2,lib1就坏了,并开始给出SEGFAULTS。其他应用程序(不依赖于lib1或lib2)都很好
以下是日志中的错误:
*** uWSGI is running in multiple interpreter mode ***
spawned uWSGI worker 1 (and the only) (pid: 33866, cores: 1)
!!! uWSGI process 33866 got Segmentation Fault !!!
*** backtrace of 33866 ***
0 uwsgi 0x00000001062f9420 uwsgi_backtrace + 48
1 uwsgi 0x00000001062f9963 uwsgi_segfault + 51
2 libsystem_platform.dylib 0x00007fff9190ef1a _sigtramp + 26
3 multiarray.so 0x0000000106fd4efe array_dealloc + 158
4 libBLAS.dylib 0x00007fff908911ff rowMajorNoTranspose + 689
5 libBLAS.dylib 0x00007fff9088f2c9 cblas_dgemv + 783
6 _dotblas.so 0x00000001072e0129 dotblas_matrixproduct + 5513
7 libpython2.7.dylib 0x00000001067d27c9 PyEval_EvalFrameEx + 14387
8 libpython2.7.dylib 0x00000001067ced62 PyEval_EvalCodeEx + 1413
9 libpython2.7.dylib 0x00000001067d557d _PyEval_SliceIndex + 757
10 libpython2.7.dylib 0x00000001067d23e3 PyEval_EvalFrameEx + 13389
11 libpython2.7.dylib 0x00000001067ced62 PyEval_EvalCodeEx + 1413
12 libpython2.7.dylib 0x00000001067d557d _PyEval_SliceIndex + 757
13 libpython2.7.dylib 0x00000001067d23e3 PyEval_EvalFrameEx + 13389
14 libpython2.7.dylib 0x00000001067ced62 PyEval_EvalCodeEx + 1413
15 libpython2.7.dylib 0x00000001067d557d _PyEval_SliceIndex + 757
16 libpython2.7.dylib 0x00000001067d23e3 PyEval_EvalFrameEx + 13389
17 libpython2.7.dylib 0x00000001067ced62 PyEval_EvalCodeEx + 1413
18 libpython2.7.dylib 0x00000001067d557d _PyEval_SliceIndex + 757
19 libpython2.7.dylib 0x00000001067d23e3 PyEval_EvalFrameEx + 13389
20 libpython2.7.dylib 0x00000001067ced62 PyEval_EvalCodeEx + 1413
21 libpython2.7.dylib 0x000000010677330a PyFunction_SetClosure + 826
22 libpython2.7.dylib 0x00000001067552ac PyObject_Call + 99
23 libpython2.7.dylib 0x00000001067d4d6b PyEval_CallObjectWithKeywords + 93
24 uwsgi 0x0000000106314097 python_call + 23
25 uwsgi 0x000000010631620f uwsgi_request_wsgi + 879
26 uwsgi 0x00000001062ab530 wsgi_req_recv + 288
27 uwsgi 0x00000001062f7205 simple_loop_run + 229
28 uwsgi 0x00000001062fe577 uwsgi_ignition + 439
29 uwsgi 0x00000001062fe363 uwsgi_worker_run + 835
30 uwsgi 0x00000001062fbe7a uwsgi_run + 442
31 uwsgi 0x00000001062f9b0e main + 14
32 libdyld.dylib 0x00007fff854425c9 start + 1
*** end of backtrace ***
下面是我用于app2的uwsgi的xml配置:
<uwsgi>
<socket>127.0.0.1:3033</socket>
<chdir>/abs/path/to/site_folder/wsgi</chdir>
<wsgi-file>/abs/path/to/site_folder/wsgi/app2.py</wsgi-file>
<logto>/abs/path/to/logdir/app2.log</logto>
<pidfile>app2.pid</pidfile>
<enable-threads></enable-threads>
<daemonize2></daemonize2>
</uwsgi>
127.0.0.1:3033
/abs/path/to/site\u文件夹/wsgi
/abs/path/to/site\u文件夹/wsgi/app2.py
/abs/path/to/logdir/app2.log
app2.pid
更新
我在AmazonLinuxEC-2服务器上创建了一个相同的设置,一切都正常工作。我遇到问题的本地机器是OSX。我仍然不明白为什么只有在uWSGI框架中才会发生这种情况,并且希望能够在本地进行开发和测试,但这似乎更像是一个安装问题(OpenBLAS?),而不是其他问题。你知道为什么uWSGI会在相同的数据和相同的函数调用中触发这种错误行为吗?作为一个无错误的命令行脚本和一个单独的无错误uWSGI应用程序