質問編集履歴

7

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

2017/01/27 05:49

投稿

suvera
suvera

スコア106

test CHANGED
File without changes
test CHANGED
@@ -345,3 +345,71 @@
345
345
  ただ、どちらも対処療法の領域をでておらず、
346
346
 
347
347
  原因の特定に至っていないためまだ調査中と言った感じです。
348
+
349
+
350
+
351
+ ### ワーカープロセスについて
352
+
353
+ 今回のことで初めて調べたのであっているかわかりませんがご了承ください。
354
+
355
+ nginx,gunicorn共にすべてのサーバーで同じ設定を行っています。
356
+
357
+ サーバーのスペックも同スペックで作成しています。
358
+
359
+
360
+
361
+ まずこちらのサイトを参考にCPUや最大プロセス数を調べたところ
362
+
363
+ http://www.crystalsnowman.com/?p=344
364
+
365
+
366
+
367
+ CPU : 1
368
+
369
+ 最大プロセス数 : 1024
370
+
371
+
372
+
373
+ とわかりました。
374
+
375
+ また、nginxにはワーカープロセスについての設定を行って無い状態でした。
376
+
377
+
378
+
379
+ gunicornでは以下の設定は行っていました。
380
+
381
+ ``
382
+
383
+ workers = multiprocessing.cpu_count() * 2 + 1
384
+
385
+ worker_class = 'sync'
386
+
387
+ worker_connections = 1000
388
+
389
+ max_requests = 0
390
+
391
+ ``
392
+
393
+
394
+
395
+ 以下は動いているnginxとgunicornのプロセスを確認したものです。
396
+
397
+ ```
398
+
399
+ [ec2-user@ip-xxx-xx-xx-xx ~]$ ps aux |grep nginx |grep -v grep
400
+
401
+ root 17576 0.0 0.1 58088 1080 ? Ss 11:58 0:00 nginx: master process nginx
402
+
403
+ ec2-user 17578 0.0 0.4 58600 4756 ? S 11:58 0:00 nginx: worker process
404
+
405
+ [ec2-user@ip-xxx-xx-xx-xx ~]$ ps aux |grep gunicorn |grep -v grep
406
+
407
+ 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
408
+
409
+ 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
410
+
411
+ 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
412
+
413
+ 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
414
+
415
+ ```

6

修正

2017/01/27 05:49

投稿

suvera
suvera

スコア106

test CHANGED
File without changes
test CHANGED
@@ -326,7 +326,7 @@
326
326
 
327
327
  一応以前は502エラーが発生していた時以上にはアクセスを繰り返してもエラーは発生しませんでした。
328
328
 
329
- 例としては 5プロセスから 10/s で 各5千回リクエストを飛ばすと行ったことをしましたが
329
+ 例としては 10プロセスから 10/s で 各1千回リクエストを飛ばすと行ったことをしましたが
330
330
 
331
331
  エラーは発生せずに終えることができました。
332
332
 

5

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

2017/01/26 03:16

投稿

suvera
suvera

スコア106

test CHANGED
File without changes
test CHANGED
@@ -249,3 +249,99 @@
249
249
  Swap: 0 0 0
250
250
 
251
251
  ```
252
+
253
+
254
+
255
+ ### 追記4:メモリに負荷をかけてリクエストの結果
256
+
257
+
258
+
259
+ stress コマンドでメモリに負荷をかけて
260
+
261
+ ```
262
+
263
+ stress --vm 2 --vm-bytes 400M --timeout 10m
264
+
265
+ ```
266
+
267
+
268
+
269
+ 10のプロセスから各1000回づつ、10/sでリクエストの送信を行っている状態での
270
+
271
+ vmstatコマンドの結果です。
272
+
273
+
274
+
275
+ ```
276
+
277
+ 2017/01/26 11:05:25 procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
278
+
279
+ 2017/01/26 11:05:25 r b swpd free buff cache si so bi bo in cs us sy id wa st
280
+
281
+ 2017/01/26 11:05:25 2 0 0 291484 4024 18948 0 0 10 25 77 85 1 1 98 0 0
282
+
283
+ 2017/01/26 11:05:26 2 0 0 266260 4032 18940 0 0 0 48 265 298 13 87 0 0 0
284
+
285
+ 2017/01/26 11:05:27 2 0 0 261168 4032 18940 0 0 0 0 251 258 16 84 0 0 0
286
+
287
+ 2017/01/26 11:05:28 3 0 0 179840 4044 20852 0 0 1940 0 1979 1332 32 68 0 0 0
288
+
289
+
290
+
291
+ ...省略
292
+
293
+ ```
294
+
295
+
296
+
297
+ メモリに負荷をかけていない状態ではcpu の id に余裕がありましたが、
298
+
299
+ 負荷をかけた状態では上記のようになっています。
300
+
301
+
302
+
303
+ ### 仕様について追記
304
+
305
+
306
+
307
+ nginxを起動後、gunicornを起動させて
308
+
309
+ その状態でずっと稼働しっぱなしにして動かしています。
310
+
311
+
312
+
313
+ そして、問題の502が起きるのは、しばらくアクセスを繰り返した後に発生し始めること
314
+
315
+ アクセスするたびにメモリが減っていく様子が確認できたことからそこら辺に原因があるかもしれないと思っています。
316
+
317
+
318
+
319
+ ### 現在の状況
320
+
321
+
322
+
323
+ InfoサーバーやDataサーバーから取得するデータ量を減少させたて、
324
+
325
+ タイムアウトまでの時間を伸ばすことでほぼ502エラーが出ないことが確認できました。
326
+
327
+ 一応以前は502エラーが発生していた時以上にはアクセスを繰り返してもエラーは発生しませんでした。
328
+
329
+ 例としては 5プロセスから 10/s で 各5千回リクエストを飛ばすと行ったことをしましたが
330
+
331
+ エラーは発生せずに終えることができました。
332
+
333
+
334
+
335
+ また、UserサーバーからInfoサーバーにリクエストを飛ばした際に
336
+
337
+ 正常な結果が得られるまでリクエストを飛ばすことで、無理やり押し通すことが出来るのも確認しました。
338
+
339
+ (これはコメントアウトした状態で検証しています。)
340
+
341
+
342
+
343
+
344
+
345
+ ただ、どちらも対処療法の領域をでておらず、
346
+
347
+ 原因の特定に至っていないためまだ調査中と言った感じです。

4

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

2017/01/26 03:15

投稿

suvera
suvera

スコア106

test CHANGED
File without changes
test CHANGED
@@ -223,3 +223,29 @@
223
223
  現在30分ほど経ちましたが今のところ502エラーは発生していません。
224
224
 
225
225
  AWSでも同じことをして試してみます。
226
+
227
+
228
+
229
+ ### 追記3:メモリが怪しそうです
230
+
231
+ free コマンドでメモリの使用量を確認したところ以下のように表示されました。
232
+
233
+ また、GETを繰り返すたびにMem-usedの値が上がっていくのが確認できました。
234
+
235
+ Mem-cachedはすぐには上がりませんでしたがココらへんについてもう少し深く調査してみようと思います。
236
+
237
+
238
+
239
+ ```
240
+
241
+ [ec2-user@ip-172-31-29-13 ~]$ free -m
242
+
243
+ total used free shared buffers cached
244
+
245
+ Mem: 995 871 123 0 32 682
246
+
247
+ -/+ buffers/cache: 157 838
248
+
249
+ Swap: 0 0 0
250
+
251
+ ```

3

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

2017/01/19 08:39

投稿

suvera
suvera

スコア106

test CHANGED
File without changes
test CHANGED
@@ -197,3 +197,29 @@
197
197
  また現在サーバーの再起動や何やらは切ってある状態で試しているため
198
198
 
199
199
  もし停止したら停止しっぱなしになります。
200
+
201
+
202
+
203
+ ### 追記2
204
+
205
+
206
+
207
+ Dockerで同じような状況を作って試してみました。
208
+
209
+ DockerでMySQLサーバーを立てて、
210
+
211
+ CentOSのサーバーを立てて、
212
+
213
+ AWSのEC2インスタンスとRDSインスタンスと同じ内容を詰め込んで
214
+
215
+ Docker内でやり取りさせてみました。
216
+
217
+
218
+
219
+ そして、502エラーが発生するまで無限ループを行うようスクリプトを準備し
220
+
221
+ それを12個ほどcmdから実行しています。
222
+
223
+ 現在30分ほど経ちましたが今のところ502エラーは発生していません。
224
+
225
+ AWSでも同じことをして試してみます。

2

情報を追記しました。

2017/01/19 02:03

投稿

suvera
suvera

スコア106

test CHANGED
File without changes
test CHANGED
@@ -155,3 +155,45 @@
155
155
 
156
156
 
157
157
  APIの取得の確認は主にChromeで行っています。
158
+
159
+
160
+
161
+ ### 追記、試したこと1
162
+
163
+ gunicornの設定の下記2つを変更しての動作を確認してみました。
164
+
165
+ 変更したところインスタンスを作成してから
166
+
167
+ 約1時間ほどで適当に百数回以上GETを試しましたが502エラーは発生しませんでした。
168
+
169
+ しかし、時間がたってからGETを行ったところ502が発生。
170
+
171
+ 以降発生するのは変わりませんが頻度は少しだけ減ったように感じます。
172
+
173
+ (1/7から1/10くらいに変化)
174
+
175
+
176
+
177
+ ```
178
+
179
+ timeout = 30 -> 3000
180
+
181
+ keepalive = 2 -> 20
182
+
183
+ ```
184
+
185
+
186
+
187
+ ### 追記
188
+
189
+
190
+
191
+ nginxのキャッシュが溜まっているとかそういう面について調べましたが
192
+
193
+ キャッシュは作られていませんでした。(設定もしてないです)
194
+
195
+
196
+
197
+ また現在サーバーの再起動や何やらは切ってある状態で試しているため
198
+
199
+ もし停止したら停止しっぱなしになります。

1

設定周りの情報を追記

2017/01/18 05:18

投稿

suvera
suvera

スコア106

test CHANGED
File without changes
test CHANGED
@@ -78,6 +78,40 @@
78
78
 
79
79
 
80
80
 
81
+ ###設定周りの情報
82
+
83
+
84
+
85
+
86
+
87
+ gunicornの設定です。
88
+
89
+ 関係ありそうな部分だけ抜粋しました。
90
+
91
+
92
+
93
+ ```
94
+
95
+ workers = multiprocessing.cpu_count() * 2 + 1
96
+
97
+ worker_class = 'sync'
98
+
99
+ worker_connections = 1000
100
+
101
+ max_requests = 0
102
+
103
+ timeout = 30
104
+
105
+ keepalive = 2
106
+
107
+ ```
108
+
109
+
110
+
111
+ nginxの.confではアクセス数やレスポンスまでの時間制限などの設定は行っていないです。
112
+
113
+
114
+
81
115
  ### 試したこと
82
116
 
83
117