Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

まれに「サーバーに接続できませんでした」エラーが起こる問題修正 #193

Open
wants to merge 1 commit into
base: master
Choose a base branch
from

Conversation

kale4eat
Copy link

問題

  • 高負荷
  • アプリを終了し、時間をおかずに再起動

などの状況でまれに、app.py の実行でサーバーに接続できませんでしたエラーになってしまう。

image

原因

SO_REUSEADDR オプションがないことにより、TIME_WAIT状態のポートが残っている状態で
サーバーを起動しようとしたため。

修正内容

サーバーのbind前にオプション設定を追加。

server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 

調査方法

Ubuntu 22.04 stressパッケージで CPU負荷を高い状況に設定。
(CPU24コア中22コアに負荷)

stress -c 22

python3 app.py を繰り返し実行。

また別ターミナルにおいてソケットの状態を確認。

watch -n 1 'ss -tan | grep 7860'

修正前

報告のあったエラーになることを確認しました。
またエラー時にサーバープロセスで以下の例外が起きていることを確認しました。

An exception occurred:
Traceback (most recent call last):
  File "/home/user/voice/work/Style-Bert-VITS2/style_bert_vits2/nlp/japanese/pyopenjtalk_worker/worker_server.py", line 76, in start_server
    server_socket.bind((socket.gethostname(), port))
OSError: [Errno 98] Address already in use

修正後

エラーにならないことを確認しました。

そのほか

ご迷惑をおかけし、申し訳ございません。
実装時もUbuntuやWindowsにおいて挙動は確認しましたが、
負荷の高い環境での確認や連続的な実行の可能性を考慮したソケットプログラミングへの理解が足りていなかったのは、私の不徳の致すところです。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant