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

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

ただいまの
回答率

87.95%

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

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 67

score 2

前提・実現したいこと

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

0

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2021/06/14 11:53 編集

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

    キャンセル

  • 2021/06/14 12:32

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

    キャンセル

  • 2021/06/14 13:04

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

    キャンセル

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

  • ただいまの回答率 87.95%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る