web-dev-qa-db-ja.com

Tesseract:複数のプロセスを並行して実行する場合のみ、高いCPU使用率と遅い速度

問題

pytesseract.image_to_string()は、supervisorddを介してスクリプトを実行すると時間がかかりすぎますが、シェルで直接実行すると(同じサーバー上で、監視プログラムスクリプトと同時に)ほぼ瞬時に実行されます。
時間がかかりすぎることを除いて、プロセスは高いCPU使用率も示しています。

スーパーバイザ経由で実行した場合にpytesseract.image_to_string()にかかる時間:〜30秒
Bash経由で実行した場合にpytesseract.image_to_string()にかかった時間:0.1秒

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

システムインフォメーション

OS:Ubuntu 18.04.2 LTS(バイオニック)
管理対象:バージョン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つのインスタンスを実行すると、関数(pytesseract.image_to_string())はスムーズに実行されます(つまり、0.1秒しかかかりません)。
新しいsshシェルから別のインスタンスを開始すると、両方のインスタンス(1つは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)
_
2
rGun

Tesseractでマルチプロセッシングを無効にすると、問題が修正されました。環境でOMP_THREAD_LIMIT=1を設定することで実行できます。

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

1
rGun