質問

質問

質問

pytesseract.image_to_string()Supervisorddを介してスクリプトを実行すると時間がかかりすぎますが、シェルで直接実行すると(同じサーバー上のスーパーバイザスクリプトと同時に)ほぼすぐに実行されます。
時間がかかりすぎるだけでなく、これらのプロセスはCPU使用率も高くなります。

pytesseract.image_to_string()Supervisordで実行するのに必要な時間:〜30秒 Bashを介して実行するのに
必要な時間pytesseract.image_to_string():0.1秒

pytesseract.image_to_string()この問題は、スーパーバイザの実行によって実行されるプロセス数が多い場合(約22のインスタンス)にのみ発生します。インスタンス数を10個まで減らすと、Supervisordを介して実行されるスクリプトもスムーズに実行されます。

システムメッセージ

オペレーティングシステム:Ubuntu 18.04.2 LTS(Bionic)
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

より多くの情報が必要な場合はお知らせください。

編集1(またはこの問題の原因ではないことがわかっています)

私はこれが監督者の問題ではないと確信しています。

SSHシェルで1つのインスタンスを実行すると、Supervisordを介して10個のインスタンスが実行されている間に関数(pytesseract.image_to_string())がスムーズに実行されます(つまり、0.1秒かかります)。
新しいSSHシェルで別のインスタンスを起動すると、2つのインスタンス(sshで起動されたインスタンス)がほとんどスムーズに実行されます。
新しいSSHシェルで別のインスタンスを起動すると、3つのインスタンスすべてがブロックを開始し、関数の実行に約10秒かかります。シェルを介してさらにインスタンスを追加すると、この時間は増え続けます。

したがって、シェルを使用しても問題を再現できます。

追加情報

プログラムを実行しましたが、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

9秒かかる関数呼び出しの場合

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)

ベストアンサー1

tesseractで複数の処理を無効にすることで問題を解決しました。これはOMP_THREAD_LIMIT=1設定で行うことができます。

バラよりhttps://github.com/tesseract-ocr/tesseract/issues/898#issuecomment-315202167

おすすめ記事