質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

uWSGI

uWSGIは、PythonでWebサービスを動かすアプリケーションサーバの一つです。WSGI(Web Server Gateway Interface)アプリケーションコンテナの一種で、WSGIに則ったDjangoやFlaskなどで動かすことができます。

Flask

FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

タイムアウト

タイムアウトはイベント発生から完了までに掛かる経過時間に対する一定の待ち時間を指します。また、特定の時間が経過された場合に発生するイベントを指すこともあります。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

1回答

3345閲覧

uWSGIのプロセスがリスポーンしない

alfald

総合スコア19

CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

uWSGI

uWSGIは、PythonでWebサービスを動かすアプリケーションサーバの一つです。WSGI(Web Server Gateway Interface)アプリケーションコンテナの一種で、WSGIに則ったDjangoやFlaskなどで動かすことができます。

Flask

FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

タイムアウト

タイムアウトはイベント発生から完了までに掛かる経過時間に対する一定の待ち時間を指します。また、特定の時間が経過された場合に発生するイベントを指すこともあります。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/06/10 10:04

編集2021/06/11 02:46

前提・実現したいこと

Flask+uWSGI+NGINXでアプリを動かしたい。
外部からjsonを送り、jsonで返す仕組みにしたい。
タイムアウトの際にタイムアウトのメッセージを表示するためにtimeout()を使用している。

発生している問題・エラーメッセージ

uWSGI process 26132 got Segmentation Fault !! *** backtrace of 19621 *** uwsgi(uwsgi_backtrace+0x2e) [0x5f4c0e] uwsgi(uwsgi_segfault+0x21) [0x5f4fa1] /lib64/libc.so.6(+0x36400) [0x7f9112482400] /usr/lib64/libtcmalloc_minimal.so.4(__libc_malloc+0x4a) [0x7f911359968a] uwsgi(PyObject_Malloc+0x15f) [0x50d10f] uwsgi(PyBytes_FromStringAndSize+0x40) [0x4dd7f0] uwsgi() [0x55ae76] uwsgi() [0x4e20ec] uwsgi(_PyObject_CallFunction_SizeT+0x99) [0x4e3099] uwsgi(PyUnicodeDecodeError_Create+0x2d) [0x6268ed] uwsgi() [0x63507c] uwsgi(PyUnicode_DecodeUTF32Stateful+0x383) [0x4716b5] uwsgi() [0x658127] uwsgi(_PyMethodDef_RawFastCallKeywords+0xed) [0x4e0a7d] uwsgi(_PyCFunction_FastCallKeywords+0x21) [0x4e0971] uwsgi(_PyEval_EvalFrameDefault+0x4f97) [0x53dfe7] uwsgi(_PyEval_EvalCodeWithName+0x2d2) [0x538482] uwsgi(_PyFunction_FastCallDict+0x1cf) [0x4e247f] uwsgi() [0x63b750] uwsgi() [0x45e53a] uwsgi(PyUnicode_FromEncodedObject+0x56) [0x6348e6] uwsgi() [0x4df145] uwsgi(_PyMethodDef_RawFastCallKeywords+0x214) [0x4e0ba4] uwsgi(_PyMethodDescr_FastCallKeywords+0x4f) [0x58fbdf] uwsgi(_PyEval_EvalFrameDefault+0x4d5a) [0x53ddaa] uwsgi(_PyEval_EvalCodeWithName+0x5ba) [0x53876a] uwsgi(_PyFunction_FastCallKeywords+0x220) [0x4e1d50] uwsgi(_PyEval_EvalFrameDefault+0x4c03) [0x53dc53] uwsgi(_PyFunction_FastCallKeywords+0xfb) [0x4e1c2b] uwsgi(_PyEval_EvalFrameDefault+0x4c03) [0x53dc53] uwsgi(_PyFunction_FastCallDict+0x10b) [0x4e23bb] uwsgi(_PyEval_EvalFrameDefault+0x1d00) [0x53ad50] uwsgi(_PyEval_EvalCodeWithName+0x2d2) [0x538482] uwsgi(_PyFunction_FastCallDict+0x1cf) [0x4e247f] uwsgi(_PyEval_EvalFrameDefault+0x1d00) [0x53ad50] uwsgi(_PyFunction_FastCallKeywords+0xfb) [0x4e1c2b] uwsgi(_PyEval_EvalFrameDefault+0x685) [0x5396d5] uwsgi(_PyFunction_FastCallKeywords+0xfb) [0x4e1c2b] uwsgi(_PyEval_EvalFrameDefault+0x685) [0x5396d5] uwsgi(_PyFunction_FastCallKeywords+0xfb) [0x4e1c2b] uwsgi(_PyEval_EvalFrameDefault+0x685) [0x5396d5] uwsgi(_PyFunction_FastCallDict+0x10b) [0x4e23bb] uwsgi(_PyObject_Call_Prepend+0x63) [0x4e28d3] uwsgi() [0x51d6da] uwsgi() [0x51a6c4] uwsgi(_PyObject_FastCallKeywords+0x98) [0x4e15a8] uwsgi(_PyEval_EvalFrameDefault+0x4b66) [0x53dbb6] uwsgi(_PyFunction_FastCallKeywords+0xfb) [0x4e1c2b] uwsgi(_PyEval_EvalFrameDefault+0x4c03) [0x53dc53] uwsgi(_PyFunction_FastCallKeywords+0xfb) [0x4e1c2b] uwsgi(_PyEval_EvalFrameDefault+0x685) [0x5396d5] uwsgi(_PyFunction_FastCallKeywords+0xfb) [0x4e1c2b] uwsgi(_PyEval_EvalFrameDefault+0x685) [0x5396d5] uwsgi(_PyEval_EvalCodeWithName+0x2d2) [0x538482] uwsgi(_PyFunction_FastCallDict+0x3c0) [0x4e2670] uwsgi(_PyObject_Call_Prepend+0x63) [0x4e28d3] uwsgi() [0x51d6da] uwsgi() [0x51a6c4] uwsgi(_PyObject_FastCallKeywords+0x180) [0x4e1690] uwsgi(_PyEval_EvalFrameDefault+0x596e) [0x53e9be] uwsgi(_PyEval_EvalCodeWithName+0x2d2) [0x538482] uwsgi(_PyFunction_FastCallKeywords+0x259) [0x4e1d89] uwsgi(_PyEval_EvalFrameDefault+0x14cb) [0x53a51b] uwsgi(_PyFunction_FastCallDict+0x10b) [0x4e23bb] *** end of backtrace ***

追記:
workerがkillされていないためプロセスが残り続けてエラーを起こしているように感じる。
一度使用したworkerが常に残り続けてるのかもしれない。

該当のソースコード

マルチプロセスのタイムアウト処理を入れ、free():invalid pointerを直すために、libtcmalloc_minimal.so.4を設定した結果出るようになった。

def timeout(): try: print('timeout() start ...') with Pool(processes=1) as p: apply_result = p.apply_async(main, (,)) apply_result.get(timeout=1) print('timeout() finished ...') except TimeoutError: print('main() time out ...') return jsonify(apply_result)

参照URL:https://webbibouroku.com/Blog/Article/python-timeout

試したこと

uWSGIのプロセスをリロードを行うコマンドを設定ファイルに入れたが、設定ファイルで指定しているプロセス数が20であるため、連続で通信を行うと止まってしまった。

process=10,max-requests=1にして行うと、3回目以降からworkerがkillされrespawnした。
max-requests=2にすると、10回動いた後に11回目で上記のエラーが出て、その後workerがkillされrespawnした。

補足情報(FW/ツールのバージョンなど)

OS:CentOS7
python 3.7.6
uWSGI 2.0.19.1

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

uwsgiのプロセスは認識が誤っていなければ、flask側でexitされるような場合や、max_requestを超えると自動的に立ち上げ直される仕組みとなっておりまして、タイムアウト処理のようなものはいらなく、マルチプロセス化もuwsgiの設定で行う事ができます。
今回このマルチプロセスの仕掛けとなる部分はflaskのどの辺りに記載されていますでしょうか?

投稿2021/06/10 23:13

m2l

総合スコア318

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

alfald

2021/06/10 23:27

fluskの一番初めです。 ``` @app.route() def timeout(): ``` になります。
alfald

2021/06/10 23:30

一応uWSGIのiniファイルです。 ``` [uwsgi] chdir=/... module=app callable=app processes=20 max-requests=10 maxrequests-delta=10 thunder-lock=true vacuum=true die-on-term=true 一部省略 ``` としてます。
m2l

2021/06/10 23:37

ありがとうございます。 max_requestsの値は現状の設定ですと10回リクエスト送るとプロセスが再起動されてしまいますね。 チューニングは必要ですが取り急ぎ1000にして再起動かからないような設定にしてください。 またプロセス数は通常CPUコア数と同値でないとパフォーマンス落ちるためコア数に合わせて設定下さいませ。 p.apply_async(main, (,)) でmain処理を呼び出しておりますがmain処理はどのようなものになりますでしょうか?(恐らく直接mainを呼ぶかflaskのapp.runを呼び出しているのであれば不要かなと思います)
alfald

2021/06/10 23:47 編集

cpuコア数だと2になるのですが、threadsとはまた別だと考えてよいですか? main()に関してですが、jsonファイルを受け取り、jsonで返す形のプログラムを作成しています。 timeout()を入れたため、jsonを受け取り辞書型をtimeout()に返しています。 上記の通り、timeoutのためだけにdef timeout()を作成しているので、timeout()がなくても動きます。
alfald

2021/06/10 23:50

processes=2にしても「uWSGI process got Segmentation Fault」になりました。
m2l

2021/06/11 10:02

ご返信遅くなりました。 mainの処理は最後にjsonレスポンスをリターンしている形でしょうか? それであればメソッドの処理をかえしてあげるだけで大丈夫です。 スレッドの方はuwsgi側でプロセスから派生する形で生成されるので特段重たい処理をしないのであれば不要だと思います。 flaskはシングルスレッドですが thread=trueにすることでマルチスレッドになりますのでそちらをご使用くださいませ。 def timeout(): return main()
alfald

2021/06/14 02:54 編集

返信遅くなってすみません。 def timeout(): return main() の形だとタイムアウトの表示ができないのではないでしょうか また、タイムアウトを行った場合、2回同じ処理をすることになりそうです。
m2l

2021/06/14 03:32

mainの処理がわからないので何ともいえませんが、前提としてtimeoutの処理って何に使われるのでしょうか? 基本的にタイムアウトの処理はnginxやuwsgi側で行う印象であまりプログラマブルに制御しないと思いますが。。 単純にリクエストに対してレスポンスを返すのであれば少し重ための処理でも1000msec内には返さないと行けないと思いますし、それを超えるのであれば、timeout値をnginxかuwsgi側で設定することでレスポンスの中でタイムアウトのステータスで返せますが、、
alfald

2021/06/14 04:04

タイムアウトを行ったとうい結果をjson形式で返したいために行っています。 また、プログラム内でのタイムアウトとサーバー側でのタイムアウトを分ける意味もあります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問