uwsgiのもうちょっと設定

2022/03 の作業


ワーカープロセスは一定回数使い続けるとメモリ利用量が増えていくらしい。(リーク?)

なので、ワーカープロセスはある程度処理したら、リニューアルした方がいいらしい。

それらの設定を試す。

# プロセス数
processes = 4

# ワーカースプロセスが処理した回数分来たら生まれ変わる回数
max-requests = 10
# ワーカースプロセスが処理した回数分来たら立ち上げ直してくれるけど、
# 一斉に転生が来ると、みなが死ぬタイミングがあるので、
# max-requests 分経過してもこの回数分づつ残りを立ち上げなおしていく回数
max-requests-delta = 2

で試してみる。


リクエストを送ると、きれいに各ワーカープロセスに処理を振り分ける(thunder-lock = trueのおかげ?)。

40回辺り( processes × max-requests )で最初の立ち上げ直しが発生して、後は一つ置きにプロセスが転生するはず。

$ ps -ef | grep wsgi
xxx  4330  4099  4 13:27 pts/0    00:00:00 uwsgi --socket :8001 --ini /home/work_user/worksite/uwsgi.ini
xxx  4331  4330  0 13:27 pts/0    00:00:00 uwsgi --socket :8001 --ini /home/work_user/worksite/uwsgi.ini
xxx  4332  4330  0 13:27 pts/0    00:00:00 uwsgi --socket :8001 --ini /home/work_user/worksite/uwsgi.ini
xxx  4333  4330  0 13:27 pts/0    00:00:00 uwsgi --socket :8001 --ini /home/work_user/worksite/uwsgi.ini
xxx  4334  4330  0 13:27 pts/0    00:00:00 uwsgi --socket :8001 --ini /home/work_user/worksite/uwsgi.ini

・・・・

[pid: 4333|app: 0|req: 1/1]  1.1.1.1 () {62 vars in 1200 bytes} [Wed Mar 23 13:27:52 2022] GET /x/ => generated 2982 bytes in 189 msecs (HTTP/1.1 200) ・・・・
[pid: 4332|app: 0|req: 1/2]  1.1.1.1 () {62 vars in 1200 bytes} [Wed Mar 23 13:27:56 2022] GET /x/ => generated 2982 bytes in 190 msecs (HTTP/1.1 200) ・・・・
[pid: 4334|app: 0|req: 1/3]  1.1.1.1 () {62 vars in 1200 bytes} [Wed Mar 23 13:27:57 2022] GET /x/ => generated 2982 bytes in 189 msecs (HTTP/1.1 200) ・・・・
[pid: 4331|app: 0|req: 1/4]  1.1.1.1 () {62 vars in 1200 bytes} [Wed Mar 23 13:27:58 2022] GET /x/ => generated 2982 bytes in 189 msecs (HTTP/1.1 200) ・・・・

[pid: 4333|app: 0|req: 2/5]  1.1.1.1 () {62 vars in 1200 bytes} [Wed Mar 23 13:27:59 2022] GET /x/ => generated 2982 bytes in 16 msecs (HTTP/1.1 200) ・・・・
[pid: 4332|app: 0|req: 2/6]  1.1.1.1 () {62 vars in 1200 bytes} [Wed Mar 23 13:28:00 2022] GET /x/ => generated 2982 bytes in 31 msecs (HTTP/1.1 200) ・・・・
[pid: 4334|app: 0|req: 2/7]  1.1.1.1 () {62 vars in 1200 bytes} [Wed Mar 23 13:28:00 2022] GET /x/ => generated 2982 bytes in 16 msecs (HTTP/1.1 200) ・・・・
[pid: 4331|app: 0|req: 2/8]  1.1.1.1 () {62 vars in 1200 bytes} [Wed Mar 23 13:28:01 2022] GET /x/ => generated 2982 bytes in 16 msecs (HTTP/1.1 200) ・・・・

[pid: 4333|app: 0|req: 3/9]  1.1.1.1 () {62 vars in 1200 bytes} [Wed Mar 23 13:28:01 2022] GET /x/ => generated 2982 bytes in 16 msecs (HTTP/1.1 200) ・・・・
[pid: 4332|app: 0|req: 3/10] 1.1.1.1 () {62 vars in 1200 bytes} [Wed Mar 23 13:28:02 2022] GET /x/ => generated 2982 bytes in 16 msecs (HTTP/1.1 200) ・・・・
[pid: 4334|app: 0|req: 3/11] 1.1.1.1 () {62 vars in 1200 bytes} [Wed Mar 23 13:28:03 2022] GET /x/ => generated 2982 bytes in 15 msecs (HTTP/1.1 200) ・・・・
[pid: 4331|app: 0|req: 3/12] 1.1.1.1 () {62 vars in 1200 bytes} [Wed Mar 23 13:28:04 2022] GET /x/ => generated 2982 bytes in 15 msecs (HTTP/1.1 200) ・・・・

[pid: 4333|app: 0|req: 4/13] 1.1.1.1 () {62 vars in 1200 bytes} [Wed Mar 23 13:28:05 2022] GET /x/ => generated 2982 bytes in 16 msecs (HTTP/1.1 200) ・・・・
[pid: 4332|app: 0|req: 4/14] 1.1.1.1 () {62 vars in 1200 bytes} [Wed Mar 23 13:28:06 2022] GET /x/ => generated 2982 bytes in 16 msecs (HTTP/1.1 200) ・・・・
[pid: 4334|app: 0|req: 4/15] 1.1.1.1 () {62 vars in 1200 bytes} [Wed Mar 23 13:28:20 2022] GET /x/ => generated 2982 bytes in 16 msecs (HTTP/1.1 200) ・・・・
[pid: 4331|app: 0|req: 4/16] 1.1.1.1 () {62 vars in 1200 bytes} [Wed Mar 23 13:28:24 2022] GET /x/ => generated 2982 bytes in 16 msecs (HTTP/1.1 200) ・・・・

[pid: 4333|app: 0|req: 5/17] 1.1.1.1 () {62 vars in 1200 bytes} [Wed Mar 23 13:28:24 2022] GET /x/ => generated 2982 bytes in 16 msecs (HTTP/1.1 200) ・・・・
[pid: 4332|app: 0|req: 5/18] 1.1.1.1 () {62 vars in 1200 bytes} [Wed Mar 23 13:28:25 2022] GET /x/ => generated 2982 bytes in 15 msecs (HTTP/1.1 200) ・・・・
[pid: 4334|app: 0|req: 5/19] 1.1.1.1 () {62 vars in 1200 bytes} [Wed Mar 23 13:28:26 2022] GET /x/ => generated 2982 bytes in 16 msecs (HTTP/1.1 200) ・・・・
[pid: 4331|app: 0|req: 5/20] 1.1.1.1 () {62 vars in 1200 bytes} [Wed Mar 23 13:28:27 2022] GET /x/ => generated 2982 bytes in 16 msecs (HTTP/1.1 200) ・・・・

[pid: 4333|app: 0|req: 6/21] 1.1.1.1 () {62 vars in 1200 bytes} [Wed Mar 23 13:28:27 2022] GET /x/ => generated 2982 bytes in 16 msecs (HTTP/1.1 200) ・・・・
[pid: 4332|app: 0|req: 6/22] 1.1.1.1 () {62 vars in 1200 bytes} [Wed Mar 23 13:28:28 2022] GET /x/ => generated 2982 bytes in 15 msecs (HTTP/1.1 200) ・・・・
[pid: 4334|app: 0|req: 6/23] 1.1.1.1 () {62 vars in 1200 bytes} [Wed Mar 23 13:28:28 2022] GET /x/ => generated 2982 bytes in 16 msecs (HTTP/1.1 200) ・・・・
[pid: 4331|app: 0|req: 6/24] 1.1.1.1 () {62 vars in 1200 bytes} [Wed Mar 23 13:28:29 2022] GET /x/ => generated 2982 bytes in 16 msecs (HTTP/1.1 200) ・・・・

[pid: 4333|app: 0|req: 7/25] 1.1.1.1 () {62 vars in 1200 bytes} [Wed Mar 23 13:28:29 2022] GET /x/ => generated 2982 bytes in 16 msecs (HTTP/1.1 200) ・・・・
[pid: 4332|app: 0|req: 7/26] 1.1.1.1 () {62 vars in 1200 bytes} [Wed Mar 23 13:28:30 2022] GET /x/ => generated 2982 bytes in 16 msecs (HTTP/1.1 200) ・・・・
[pid: 4334|app: 0|req: 7/27] 1.1.1.1 () {62 vars in 1200 bytes} [Wed Mar 23 13:28:31 2022] GET /x/ => generated 2982 bytes in 16 msecs (HTTP/1.1 200) ・・・・
[pid: 4331|app: 0|req: 7/28] 1.1.1.1 () {62 vars in 1200 bytes} [Wed Mar 23 13:28:32 2022] GET /x/ => generated 2982 bytes in 16 msecs (HTTP/1.1 200) ・・・・

[pid: 4333|app: 0|req: 8/29] 1.1.1.1 () {62 vars in 1200 bytes} [Wed Mar 23 13:28:32 2022] GET /x/ => generated 2982 bytes in 16 msecs (HTTP/1.1 200) ・・・・
[pid: 4332|app: 0|req: 8/30] 1.1.1.1 () {62 vars in 1200 bytes} [Wed Mar 23 13:28:33 2022] GET /x/ => generated 2982 bytes in 16 msecs (HTTP/1.1 200) ・・・・
[pid: 4334|app: 0|req: 8/31] 1.1.1.1 () {62 vars in 1200 bytes} [Wed Mar 23 13:28:33 2022] GET /x/ => generated 2982 bytes in 16 msecs (HTTP/1.1 200) ・・・・
[pid: 4331|app: 0|req: 8/32] 1.1.1.1 () {62 vars in 1200 bytes} [Wed Mar 23 13:28:34 2022] GET /x/ => generated 2982 bytes in 16 msecs (HTTP/1.1 200) ・・・・

[pid: 4333|app: 0|req: 9/33] 1.1.1.1 () {62 vars in 1200 bytes} [Wed Mar 23 13:28:34 2022] GET /x/ => generated 2982 bytes in 16 msecs (HTTP/1.1 200) ・・・・
[pid: 4332|app: 0|req: 9/34] 1.1.1.1 () {62 vars in 1200 bytes} [Wed Mar 23 13:28:35 2022] GET /x/ => generated 2982 bytes in 15 msecs (HTTP/1.1 200) ・・・・
[pid: 4334|app: 0|req: 9/35] 1.1.1.1 () {62 vars in 1200 bytes} [Wed Mar 23 13:28:36 2022] GET /x/ => generated 2982 bytes in 16 msecs (HTTP/1.1 200) ・・・・
[pid: 4331|app: 0|req: 9/36] 1.1.1.1 () {62 vars in 1200 bytes} [Wed Mar 23 13:28:36 2022] GET /x/ => generated 2982 bytes in 15 msecs (HTTP/1.1 200) ・・・・

[pid: 4333|app: 0|req: 10/37] 1.1.1.1 () {62 vars in 1200 bytes} [Wed Mar 23 13:28:37 2022] GET /x/ => generated 2982 bytes in 15 msecs (HTTP/1.1 200) ・・・・
...The work of process 4333 is done. Seeya!
worker 3 killed successfully (pid: 4333)
Respawned uWSGI worker 3 (new pid: 4381)

$ ps -ef | grep wsgi
xxx  4330  4099  0 13:27 pts/0    00:00:00 uwsgi --socket :8001 --ini /home/work_user/worksite/uwsgi.ini
xxx  4331  4330  0 13:27 pts/0    00:00:00 uwsgi --socket :8001 --ini /home/work_user/worksite/uwsgi.ini
xxx  4332  4330  0 13:27 pts/0    00:00:00 uwsgi --socket :8001 --ini /home/work_user/worksite/uwsgi.ini
xxx  4334  4330  0 13:27 pts/0    00:00:00 uwsgi --socket :8001 --ini /home/work_user/worksite/uwsgi.ini
xxx  4381  4330  0 13:28 pts/0    00:00:00 uwsgi --socket :8001 --ini /home/work_user/worksite/uwsgi.ini <- reborn

[pid: 4332|app: 0|req: 10/38] 1.1.1.1 () {62 vars in 1200 bytes} [Wed Mar 23 13:30:05 2022] GET /x/ => generated 2982 bytes in 16 msecs (HTTP/1.1 200) ・・・・
...The work of process 4332 is done. Seeya!
worker 2 killed successfully (pid: 4332)
Respawned uWSGI worker 2 (new pid: 4395)

$ ps -ef | grep wsgi
xxx  4330  4099  0 13:27 pts/0    00:00:00 uwsgi --socket :8001 --ini /home/work_user/worksite/uwsgi.ini
xxx  4331  4330  0 13:27 pts/0    00:00:00 uwsgi --socket :8001 --ini /home/work_user/worksite/uwsgi.ini
xxx  4334  4330  0 13:27 pts/0    00:00:00 uwsgi --socket :8001 --ini /home/work_user/worksite/uwsgi.ini
xxx  4381  4330  0 13:28 pts/0    00:00:00 uwsgi --socket :8001 --ini /home/work_user/worksite/uwsgi.ini
xxx  4395  4330  0 13:30 pts/0    00:00:00 uwsgi --socket :8001 --ini /home/work_user/worksite/uwsgi.ini <- reborn

[pid: 4334|app: 0|req: 10/39] 1.1.1.1 () {62 vars in 1200 bytes} [Wed Mar 23 13:30:23 2022] GET /x/ => generated 2982 bytes in 15 msecs (HTTP/1.1 200) ・・・・
...The work of process 4334 is done. Seeya!
worker 4 killed successfully (pid: 4334)
Respawned uWSGI worker 4 (new pid: 4400)

$ ps -ef | grep wsgi
xxx  4330  4099  0 13:27 pts/0    00:00:00 uwsgi --socket :8001 --ini /home/work_user/worksite/uwsgi.ini
xxx  4331  4330  0 13:27 pts/0    00:00:00 uwsgi --socket :8001 --ini /home/work_user/worksite/uwsgi.ini
xxx  4381  4330  0 13:28 pts/0    00:00:00 uwsgi --socket :8001 --ini /home/work_user/worksite/uwsgi.ini
xxx  4395  4330  0 13:30 pts/0    00:00:00 uwsgi --socket :8001 --ini /home/work_user/worksite/uwsgi.ini
xxx  4400  4330  0 13:30 pts/0    00:00:00 uwsgi --socket :8001 --ini /home/work_user/worksite/uwsgi.ini <- reborn

[pid: 4331|app: 0|req: 10/40] 1.1.1.1 () {62 vars in 1200 bytes} [Wed Mar 23 13:30:48 2022] GET /x/ => generated 2982 bytes in 16 msecs (HTTP/1.1 200) ・・・・
...The work of process 4331 is done. Seeya!
worker 1 killed successfully (pid: 4331)
Respawned uWSGI worker 1 (new pid: 4406)

$ ps -ef | grep wsgi
xxx  4330  4099  0 13:27 pts/0    00:00:00 uwsgi --socket :8001 --ini /home/work_user/worksite/uwsgi.ini
xxx  4381  4330  0 13:28 pts/0    00:00:00 uwsgi --socket :8001 --ini /home/work_user/worksite/uwsgi.ini
xxx  4395  4330  0 13:30 pts/0    00:00:00 uwsgi --socket :8001 --ini /home/work_user/worksite/uwsgi.ini
xxx  4400  4330  0 13:30 pts/0    00:00:00 uwsgi --socket :8001 --ini /home/work_user/worksite/uwsgi.ini
xxx  4406  4330  0 13:30 pts/0    00:00:00 uwsgi --socket :8001 --ini /home/work_user/worksite/uwsgi.ini <- reborn

[pid: 4381|app: 0|req: 11/41] 1.1.1.1 () {62 vars in 1200 bytes} [Wed Mar 23 13:31:05 2022] GET /x/ => generated 2982 bytes in 189 msecs (HTTP/1.1 200) ・・・・
[pid: 4395|app: 0|req: 11/42] 1.1.1.1 () {62 vars in 1200 bytes} [Wed Mar 23 13:31:15 2022] GET /x/ => generated 2982 bytes in 188 msecs (HTTP/1.1 200) ・・・・
[pid: 4400|app: 0|req: 11/43] 1.1.1.1 () {62 vars in 1200 bytes} [Wed Mar 23 13:31:18 2022] GET /x/ => generated 2982 bytes in 190 msecs (HTTP/1.1 200) ・・・・
[pid: 4406|app: 0|req: 11/44] 1.1.1.1 () {62 vars in 1200 bytes} [Wed Mar 23 13:31:19 2022] GET /x/ => generated 2982 bytes in 186 msecs (HTTP/1.1 200) ・・・・
[pid: 4381|app: 0|req: 12/45] 1.1.1.1 () {62 vars in 1200 bytes} [Wed Mar 23 13:31:20 2022] GET /x/ => generated 2982 bytes in 16 msecs (HTTP/1.1 200) ・・・・
[pid: 4395|app: 0|req: 12/46] 1.1.1.1 () {62 vars in 1200 bytes} [Wed Mar 23 13:32:03 2022] GET /x/ => generated 2982 bytes in 16 msecs (HTTP/1.1 200) ・・・・
[pid: 4400|app: 0|req: 12/47] 1.1.1.1 () {62 vars in 1200 bytes} [Wed Mar 23 13:32:04 2022] GET /x/ => generated 2982 bytes in 16 msecs (HTTP/1.1 200) ・・・・
[pid: 4406|app: 0|req: 12/48] 1.1.1.1 () {62 vars in 1200 bytes} [Wed Mar 23 13:32:06 2022] GET /x/ => generated 2982 bytes in 16 msecs (HTTP/1.1 200) ・・・・



各ワーカープロセスが max-requests でプロセスが変わった。

あと、プロセス起動直後(1/x のプロセスと転生後のプロセス)は、約190msec で、1回起動したものは、約16msec 位の時間で処理してる。

max-requests-delta は全く効いていない。

いつの日か効くようになるかもしれないので、max-requests-delta はとりあえず設定しておく事にする。

とりあえず、設定は以下の様にしておく。

(work_venv) $ vi /home/work_user/worksite/uwsgi.ini
# Wagtailプロジェクトのルートディレクトリ
chdir = /home/work_user/worksite

# wsgi.pyの場所
# (Wagtailのプロジェクト名を「worksite」にするとworksite/配下にwsgi.pyがあれば)
module = worksite.wsgi

# 仮想環境のディレクトリ
home = /home/work_user/work_venv

# わかりそうなのは雰囲気で設定
# uWSGI’s built-in prefork+threading multi-worker management mode, 
# activated by flicking the master switch on. 
# For all practical serving deployments it is generally a good idea to use master mode.
master = true
# アクセスは少ないので、コア数分位
processes = 2
threads = 2
chmod-socket = 666
# try to remove all of the generated file/sockets 
vacuum = true
# serialize accept() usage (if possible) 
thunder-lock = true
# アクセスは少ないのでこれ位
max-requests = 600
max-requests-delta = 30
# ほとんどアイドル状態だと思うので、これ位
idle = 1800

とりあえず、こんな感じで。