pytesseract.image_to_string()
当我通过 supervisordd 运行脚本时花费了太多时间,但是当直接在 shell 中运行时几乎立即执行(在同一台服务器上并与主管脚本同时运行)。
除了花费太多时间之外,进程还显示出高 CPU 使用率。
通过采取时间pytesseract.image_to_string()
时,通过Supervisord运行:30岁〜
采取的时间pytesseract.image_to_string()
时,通过击运行:0.1S
只有在有很多进程pytesseract.image_to_string()
、正在执行、通过 supervisord 运行(大约 22 个实例)时才会出现此问题。如果我减少实例的数量(大约 10 个),通过 supervisord 执行的脚本也能顺利运行。
操作系统:Ubuntu 18.04.2 LTS(仿生)
Supervisord:版本 3.3.1
Tesseract:版本 4.0.0-beta.1
Python:版本 3.6
PyTesseract:版本 0.2.5
ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 127357
max locked memory (kbytes, -l) 16384
max memory size (kbytes, -m) unlimited
open files (-n) 8096
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 127357
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
Run Code Online (Sandbox Code Playgroud)
如果您需要更多信息,请告诉我。
我相当确定这不是 Supervisord 的问题。
当我从 ssh shell 运行一个实例时,函数 ( pytesseract.image_to_string()
) 执行顺利(即只需要 0.1 秒),而有 10 个实例通过 Supervisord 运行。
当我从新的 ssh shell 启动另一个实例时,这两个实例(从 ssh 启动的实例)大部分时间都运行顺利。
当我从一个新的 ssh shell 启动另一个实例时,所有三个实例都开始卡住,执行该函数需要大约 10 秒。随着我通过 shell 添加更多实例,这个时间不断增加。
因此,即使使用外壳也可以复制该问题。
我运行了程序,strace -T -f
但我无法弄清楚究竟是什么导致了时间高峰。
对于需要 1 秒的函数调用
Top 10 system calls sorted by time taken
1.504530 [pid 29921] <... wait4 resumed> [{WIFEXITED(s) && WEXITSTATUS(s) == 0}], 0, NULL) = 30166
0.503915 [pid 29932] <... select resumed> ) = 0 (Timeout)
0.503472 [pid 29932] <... select resumed> ) = 0 (Timeout)
0.500524 [pid 29933] <... select resumed> ) = 0 (Timeout)
0.500515 [pid 29933] <... select resumed> ) = 0 (Timeout)
0.500514 [pid 29932] <... select resumed> ) = 0 (Timeout)
0.500512 [pid 29933] <... select resumed> ) = 0 (Timeout)
0.069869 [pid 30169] <... futex resumed> ) = ? ERESTARTSYS (To be restarted if SA_RESTART is set)
0.035989 [pid 30167] <... futex resumed> ) = 0
0.016002 [pid 30168] <... futex resumed> ) = 0
Run Code Online (Sandbox Code Playgroud)
对于需要 9s 的函数调用
Top 10 system calls sorted by time taken
9.795787 [pid 29921] <... wait4 resumed> [{WIFEXITED(s) && WEXITSTATUS(s) == 0}], 0, NULL) = 30106
0.515960 [pid 29933] <... select resumed> ) = 0 (Timeout)
0.511955 [pid 29933] <... select resumed> ) = 0 (Timeout)
0.507979 [pid 29932] <... select resumed> ) = 0 (Timeout)
0.507968 [pid 29932] <... select resumed> ) = 0 (Timeout)
0.505257 [pid 29932] <... select resumed> ) = 0 (Timeout)
0.503988 [pid 29932] <... select resumed> ) = 0 (Timeout)
0.503978 [pid 29932] <... select resumed> ) = 0 (Timeout)
0.503975 [pid 29932] <... select resumed> ) = 0 (Timeout)
0.503974 [pid 29932] <... select resumed> ) = 0 (Timeout)
Run Code Online (Sandbox Code Playgroud)
在 tesseract 中禁用多重处理解决了该问题。可以通过OMP_THREAD_LIMIT=1
环境设置来完成。
请参阅https://github.com/tesseract-ocr/tesseract/issues/898#issuecomment-315202167