Tesseract:CPU使用率高,速度慢,只有在并行运行多个进程时

rGu*_*Gun 6 ocr tesseract

问题

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)

如果您需要更多信息,请告诉我。

编辑 1(或者我知道什么不是这个问题的根源)

我相当确定这不是 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)

rGu*_*Gun 7

在 tesseract 中禁用多重处理解决了该问题。可以通过OMP_THREAD_LIMIT=1环境设置来完成。

请参阅https://github.com/tesseract-ocr/tesseract/issues/898#issuecomment-315202167