LoginSignup
37
28

More than 5 years have passed since last update.

Python+uWSGI+Dockerで環境に応じてuwsgiプロセス/スレッド数を動的変更する

Last updated at Posted at 2018-12-11

はじめに

image.png

PythonのWEBサーバを使ってる方には馴染みのuWSGIですが、Python+uWSGI+Docker環境を使っていると、マシンやコンテナスペックを変更したくなってくる場面があり、uWSGIの設定値も動的変更したくなりますよね。
ここでは現在本番稼働をしているPython+uWSGI+Docker環境で使用しているプロセス/スレッド数の動的変更方法を記載します。

動作環境

  1. Django 3.0
  2. uwsgi 2.0.17
  3. Docker Image(python:3.6.5-alpine3.6)

uWSGIの特徴

uWSGIの特徴として以下の特徴がありました。

  1. uWSGIの設定値は.iniファイルで流し込むことができる
  2. uWSGIの.iniファイルには環境変数を流し込むことができる

この特徴を使って.iniファイルを変更します。

前準備

app.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数、コア数を取得する処理を記載しておきましょう。

docker-entrypoint.sh
#!/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環境で使う際はぜひご検討ください。

37
28
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
37
28