やりたいこと
以下環境で、pythonのAPIサーバを構築したいと思っています。
- ubutnu 18.04
- python 3.7 (anacondaでinstall)
- apache2 (2.4.29 apt-getでinstall)
- mod-wsgi (4.7.1 pipでinstall)
イメージとしては、pythonプログラムをwebサーバ化するためのWSGIサーバにapacheを使い、
APIサーバとしてプロセスを常駐させておき、curlでhttpリクエストすると、簡単な文字列を返却する
ような形になります。またAPIサーバはシングルプロセス、シングルスレッドを稼働前提としています。
問題点
apacheでAPIサーバプロセスを起動、curlで文字列を得ることはできました。
一方、psコマンドでプロセスを見てみると、APIサーバは1プロセス4スレッドで起動していました。
内訳は、1スレッドが親、3スレッドが子でした。
設定ファイル(後述のtest.conf)で、WSGIDaemonProcessに「threads=1」を指定したのに、
なぜ複数スレッド立ち上がるのかが分からずにいます。これらは管理プロセスやプールプロセス
なのでしょうか?お手数ですがご教示いただけますと幸いです。
ファイル
〜apache〜
・/etc/apache2/sites-enable/test.conf
conf
1<VirtualHost *:8080> 2 DocumentRoot /home/user/app 3 WSGIDaemonProcess testprocess user=user group=user threads=1 4 WSGIScriptAlias / /home/user/app/api.py 5 <Directory /home/user/app> 6 WSGIProcessGroup testprocess 7 WSGIApplicationGroup %{GLOBAL} 8 WSGIScriptReloading On 9 Require all granted 10 </Directory> 11</VirtualHost>
〜API〜
・/home/user/app/api.py
python
1def application(environ, start_response): 2 status = '200 OK' 3 output = b'Hello World!' 4 5 response_headers = [('Content-type', 'text/plain'), 6 ('Content-Length', str(len(output)))] 7 start_response(status, response_headers) 8 return [output]
試したこと
- api.pyにループ処理を仕込み負荷をかける
→子スレッド1つと親スレッド1つのCPU使用率が100%、他2スレッドはずっと0%
→残り2スレッドはプール?
- mpm_event.conf(/etc/apache2/mods-available)を確認
→ThreadPerChildの値は25(default)
→一方、psコマンドで見たwww-dataユーザで実行されているapacheの他プロセス(80ポートのデフォルトサイト?)は、親スレッド1、子スレッド26
→子スレッドの数=ThreadPerChildの値ではない?
- mpm_event.confを以下のように変更
StartServers 2 → 1
ThreadPerChild 25 → 1
MaxRequestWorkers 150 → 1
→APIサーバは状況変わらず、www-dataユーザのプロセスは親スレッド1、子スレッド2に変化。
→wsgiサーバには別の設定が必要?やはりプールスレッドがある?
- mpm_eventからmpm_preforkに切替
→3)と同じく、影響を受けたのはwww-dataユーザのプロセスのみ
→wsgiはmpmの設定の影響を受けない?
※MPMは初めて触るのですが、シングルスレッドに限定するならば、本来はpreforkを使うべきなのかなと解釈しています。
補足画像
※USERがグレーの行がAPIサーバです。
- 試したこと3)の時
- 試したこと4)の時
あなたの回答
tips
プレビュー