はじめに
PythonのWEBサーバを使ってる方には馴染みのuWSGIですが、Python+uWSGI+Docker環境を使っていると、マシンやコンテナスペックを変更したくなってくる場面があり、uWSGIの設定値も動的変更したくなりますよね。
ここでは現在本番稼働をしているPython+uWSGI+Docker環境で使用しているプロセス/スレッド数の動的変更方法を記載します。
動作環境
- Django 3.0
- uwsgi 2.0.17
- Docker Image(python:3.6.5-alpine3.6)
uWSGIの特徴
uWSGIの特徴として以下の特徴がありました。
- uWSGIの設定値は.iniファイルで流し込むことができる
- uWSGIの.iniファイルには環境変数を流し込むことができる
この特徴を使って.iniファイルを変更します。
前準備
app.iniには以下の内容で設定ファイルを記述します。
~ 一部抜粋 ~
# threads数=CPU数, processes数=CPUコア数
# 環境変数UWSGI_XXXXと連動
processes=%(processes)
threads=%(threads)
ミソは%(XXXXX)
ですね。
これは環境変数のUWSGI_XXXXX
と連動するようになっており、UWSGI_TEST
の環境変数を.ini内では%(test)
で呼び出すことができます。
この準備ができればあとはDocker起動時にCPU数、CPUコア数を取得するだけです。
Docker起動時にCPU数、コア数を取得する
Docker起動時に必ず実行されるようdocker-entrypointなどにCPU数、コア数を取得する処理を記載しておきましょう。
#!/bin/sh
#CPU / コア数を取得する
CPU=`grep physical.id /proc/cpuinfo | sort -u | wc -l`
CORE=`grep cpu.cores /proc/cpuinfo | sort -u | wc -l`
#uwsgiのプロセス数、スレッド数を設定(要パラメータチューニング)
export UWSGI_THREADS=`expr ${CPU} \* 1`
export UWSGI_PROCESSES=`expr ${CORE} \* 2`
uwsgi --ini ./app.ini
パフォーマンスチューニングについてはこちらをご参照ください。
https://qiita.com/fujimisakari/items/bc00d598e3219d382f60
さいごに
uWSGIの仕組みをうまく使ってDockerコンテナ起動毎に変更できました。
Docker環境で使う際はぜひご検討ください。