teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

7

サーバーのワーカープロセスについて追記を行いました。

2017/01/27 05:49

投稿

suvera
suvera

スコア106

title CHANGED
File without changes
body CHANGED
@@ -171,4 +171,38 @@
171
171
 
172
172
 
173
173
  ただ、どちらも対処療法の領域をでておらず、
174
- 原因の特定に至っていないためまだ調査中と言った感じです。
174
+ 原因の特定に至っていないためまだ調査中と言った感じです。
175
+
176
+ ### ワーカープロセスについて
177
+ 今回のことで初めて調べたのであっているかわかりませんがご了承ください。
178
+ nginx,gunicorn共にすべてのサーバーで同じ設定を行っています。
179
+ サーバーのスペックも同スペックで作成しています。
180
+
181
+ まずこちらのサイトを参考にCPUや最大プロセス数を調べたところ
182
+ http://www.crystalsnowman.com/?p=344
183
+
184
+ CPU : 1
185
+ 最大プロセス数 : 1024
186
+
187
+ とわかりました。
188
+ また、nginxにはワーカープロセスについての設定を行って無い状態でした。
189
+
190
+ gunicornでは以下の設定は行っていました。
191
+ ``
192
+ workers = multiprocessing.cpu_count() * 2 + 1
193
+ worker_class = 'sync'
194
+ worker_connections = 1000
195
+ max_requests = 0
196
+ ``
197
+
198
+ 以下は動いているnginxとgunicornのプロセスを確認したものです。
199
+ ```
200
+ [ec2-user@ip-xxx-xx-xx-xx ~]$ ps aux |grep nginx |grep -v grep
201
+ root 17576 0.0 0.1 58088 1080 ? Ss 11:58 0:00 nginx: master process nginx
202
+ ec2-user 17578 0.0 0.4 58600 4756 ? S 11:58 0:00 nginx: worker process
203
+ [ec2-user@ip-xxx-xx-xx-xx ~]$ ps aux |grep gunicorn |grep -v grep
204
+ ec2-user 17614 0.0 2.1 202156 22332 ? S 11:58 0:01 /home/ec2-user/.pyenv/versions/3.5.2/bin/python3.5 /home/ec2-user/.pyenv/versions/3.5.2/bin/gunicorn run:app --config guniconf.py
205
+ ec2-user 17646 0.4 2.5 223292 25996 ? S 11:58 0:44 /home/ec2-user/.pyenv/versions/3.5.2/bin/python3.5 /home/ec2-user/.pyenv/versions/3.5.2/bin/gunicorn run:app --config guniconf.py
206
+ ec2-user 17647 0.3 2.5 223296 26000 ? S 11:58 0:38 /home/ec2-user/.pyenv/versions/3.5.2/bin/python3.5 /home/ec2-user/.pyenv/versions/3.5.2/bin/gunicorn run:app --config guniconf.py
207
+ ec2-user 17648 0.4 2.5 223248 26004 ? S 11:58 0:41 /home/ec2-user/.pyenv/versions/3.5.2/bin/python3.5 /home/ec2-user/.pyenv/versions/3.5.2/bin/gunicorn run:app --config guniconf.py
208
+ ```

6

修正

2017/01/27 05:49

投稿

suvera
suvera

スコア106

title CHANGED
File without changes
body CHANGED
@@ -162,7 +162,7 @@
162
162
  InfoサーバーやDataサーバーから取得するデータ量を減少させたて、
163
163
  タイムアウトまでの時間を伸ばすことでほぼ502エラーが出ないことが確認できました。
164
164
  一応以前は502エラーが発生していた時以上にはアクセスを繰り返してもエラーは発生しませんでした。
165
- 例としては 5プロセスから 10/s で 各5千回リクエストを飛ばすと行ったことをしましたが
165
+ 例としては 10プロセスから 10/s で 各1千回リクエストを飛ばすと行ったことをしましたが
166
166
  エラーは発生せずに終えることができました。
167
167
 
168
168
  また、UserサーバーからInfoサーバーにリクエストを飛ばした際に

5

メモリに負荷をかけてリクエストの結果 と 仕様と現在の状況について追記しました。

2017/01/26 03:16

投稿

suvera
suvera

スコア106

title CHANGED
File without changes
body CHANGED
@@ -123,4 +123,52 @@
123
123
  Mem: 995 871 123 0 32 682
124
124
  -/+ buffers/cache: 157 838
125
125
  Swap: 0 0 0
126
- ```
126
+ ```
127
+
128
+ ### 追記4:メモリに負荷をかけてリクエストの結果
129
+
130
+ stress コマンドでメモリに負荷をかけて
131
+ ```
132
+ stress --vm 2 --vm-bytes 400M --timeout 10m
133
+ ```
134
+
135
+ 10のプロセスから各1000回づつ、10/sでリクエストの送信を行っている状態での
136
+ vmstatコマンドの結果です。
137
+
138
+ ```
139
+ 2017/01/26 11:05:25 procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
140
+ 2017/01/26 11:05:25 r b swpd free buff cache si so bi bo in cs us sy id wa st
141
+ 2017/01/26 11:05:25 2 0 0 291484 4024 18948 0 0 10 25 77 85 1 1 98 0 0
142
+ 2017/01/26 11:05:26 2 0 0 266260 4032 18940 0 0 0 48 265 298 13 87 0 0 0
143
+ 2017/01/26 11:05:27 2 0 0 261168 4032 18940 0 0 0 0 251 258 16 84 0 0 0
144
+ 2017/01/26 11:05:28 3 0 0 179840 4044 20852 0 0 1940 0 1979 1332 32 68 0 0 0
145
+
146
+ ...省略
147
+ ```
148
+
149
+ メモリに負荷をかけていない状態ではcpu の id に余裕がありましたが、
150
+ 負荷をかけた状態では上記のようになっています。
151
+
152
+ ### 仕様について追記
153
+
154
+ nginxを起動後、gunicornを起動させて
155
+ その状態でずっと稼働しっぱなしにして動かしています。
156
+
157
+ そして、問題の502が起きるのは、しばらくアクセスを繰り返した後に発生し始めること
158
+ アクセスするたびにメモリが減っていく様子が確認できたことからそこら辺に原因があるかもしれないと思っています。
159
+
160
+ ### 現在の状況
161
+
162
+ InfoサーバーやDataサーバーから取得するデータ量を減少させたて、
163
+ タイムアウトまでの時間を伸ばすことでほぼ502エラーが出ないことが確認できました。
164
+ 一応以前は502エラーが発生していた時以上にはアクセスを繰り返してもエラーは発生しませんでした。
165
+ 例としては 5プロセスから 10/s で 各5千回リクエストを飛ばすと行ったことをしましたが
166
+ エラーは発生せずに終えることができました。
167
+
168
+ また、UserサーバーからInfoサーバーにリクエストを飛ばした際に
169
+ 正常な結果が得られるまでリクエストを飛ばすことで、無理やり押し通すことが出来るのも確認しました。
170
+ (これはコメントアウトした状態で検証しています。)
171
+
172
+
173
+ ただ、どちらも対処療法の領域をでておらず、
174
+ 原因の特定に至っていないためまだ調査中と言った感じです。

4

追記3:メモリ周りが怪しそうでした

2017/01/26 03:15

投稿

suvera
suvera

スコア106

title CHANGED
File without changes
body CHANGED
@@ -110,4 +110,17 @@
110
110
  そして、502エラーが発生するまで無限ループを行うようスクリプトを準備し
111
111
  それを12個ほどcmdから実行しています。
112
112
  現在30分ほど経ちましたが今のところ502エラーは発生していません。
113
- AWSでも同じことをして試してみます。
113
+ AWSでも同じことをして試してみます。
114
+
115
+ ### 追記3:メモリが怪しそうです
116
+ free コマンドでメモリの使用量を確認したところ以下のように表示されました。
117
+ また、GETを繰り返すたびにMem-usedの値が上がっていくのが確認できました。
118
+ Mem-cachedはすぐには上がりませんでしたがココらへんについてもう少し深く調査してみようと思います。
119
+
120
+ ```
121
+ [ec2-user@ip-172-31-29-13 ~]$ free -m
122
+ total used free shared buffers cached
123
+ Mem: 995 871 123 0 32 682
124
+ -/+ buffers/cache: 157 838
125
+ Swap: 0 0 0
126
+ ```

3

Dockerで同じような状況を作って試してみました。

2017/01/19 08:39

投稿

suvera
suvera

スコア106

title CHANGED
File without changes
body CHANGED
@@ -97,4 +97,17 @@
97
97
  キャッシュは作られていませんでした。(設定もしてないです)
98
98
 
99
99
  また現在サーバーの再起動や何やらは切ってある状態で試しているため
100
- もし停止したら停止しっぱなしになります。
100
+ もし停止したら停止しっぱなしになります。
101
+
102
+ ### 追記2
103
+
104
+ Dockerで同じような状況を作って試してみました。
105
+ DockerでMySQLサーバーを立てて、
106
+ CentOSのサーバーを立てて、
107
+ AWSのEC2インスタンスとRDSインスタンスと同じ内容を詰め込んで
108
+ Docker内でやり取りさせてみました。
109
+
110
+ そして、502エラーが発生するまで無限ループを行うようスクリプトを準備し
111
+ それを12個ほどcmdから実行しています。
112
+ 現在30分ほど経ちましたが今のところ502エラーは発生していません。
113
+ AWSでも同じことをして試してみます。

2

情報を追記しました。

2017/01/19 02:03

投稿

suvera
suvera

スコア106

title CHANGED
File without changes
body CHANGED
@@ -76,4 +76,25 @@
76
76
  RDSインスタンス
77
77
  MySQL
78
78
 
79
- APIの取得の確認は主にChromeで行っています。
79
+ APIの取得の確認は主にChromeで行っています。
80
+
81
+ ### 追記、試したこと1
82
+ gunicornの設定の下記2つを変更しての動作を確認してみました。
83
+ 変更したところインスタンスを作成してから
84
+ 約1時間ほどで適当に百数回以上GETを試しましたが502エラーは発生しませんでした。
85
+ しかし、時間がたってからGETを行ったところ502が発生。
86
+ 以降発生するのは変わりませんが頻度は少しだけ減ったように感じます。
87
+ (1/7から1/10くらいに変化)
88
+
89
+ ```
90
+ timeout = 30 -> 3000
91
+ keepalive = 2 -> 20
92
+ ```
93
+
94
+ ### 追記
95
+
96
+ nginxのキャッシュが溜まっているとかそういう面について調べましたが
97
+ キャッシュは作られていませんでした。(設定もしてないです)
98
+
99
+ また現在サーバーの再起動や何やらは切ってある状態で試しているため
100
+ もし停止したら停止しっぱなしになります。

1

設定周りの情報を追記

2017/01/18 05:18

投稿

suvera
suvera

スコア106

title CHANGED
File without changes
body CHANGED
@@ -38,6 +38,23 @@
38
38
  urllib.error.URLError: <urlopen error [Errno 111] Connection refused>
39
39
  ```
40
40
 
41
+ ###設定周りの情報
42
+
43
+
44
+ gunicornの設定です。
45
+ 関係ありそうな部分だけ抜粋しました。
46
+
47
+ ```
48
+ workers = multiprocessing.cpu_count() * 2 + 1
49
+ worker_class = 'sync'
50
+ worker_connections = 1000
51
+ max_requests = 0
52
+ timeout = 30
53
+ keepalive = 2
54
+ ```
55
+
56
+ nginxの.confではアクセス数やレスポンスまでの時間制限などの設定は行っていないです。
57
+
41
58
  ### 試したこと
42
59
 
43
60
  Connection refusedは必ず発生するわけではありませんでした。