質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.79%

WEB「分散処理・並列処理」一般論教えて!!

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,733

proglabo

score 2276

質問
裏でとても重たい処理が走るようなWEBアプリの負荷分散?分散処理?同時実行数の制限?ってどうやりますか?一般論を教えてください(Pythonを使っている人はPythonでの実装方法をお教えてください)

状況
裏で重たい処理を動かすWEBアプリを作成しております。結構重たいので、同時に100人くらいで処理を流すと大量にエラーが発生します(根本のプログラムの問題か、メモリが枯渇して強制的にKILLされているかわかりませんが。。。)

環境

サーバ:Nginx
アプリ:Django
並列処理:Celeryかthreding

現状に関する追記
テストの段階です。HeadlessChromeとSeleniumを用いて、テスト用サーバーからほとんど同時に100ユーザーほどでアクセスしています。Jmeterなどのツールの使いかたを覚えている時間がなかったためです。この際、データベースに保存しているデータから、正常に全ユーザーがアクセスできているかを確認したり、ページ遷移の際にスクリーンショットをとって、正常にページ遷移が行われているか確認しています。しかし、100ユーザーでアクセスした際、CPU使用率は低く、メモリ使用率が低いのにもかかわらず、何分経っても、ページが遷移しない状況がありました(ご指摘のような「一つ一つの処理が実行中の間はレスポンスを返す処理は行っていません」)このような状況はユーザー数が増えるにつれ、顕著に現れます

独り言
このような場合どんな方法で、同時接続に対処しますか?thredingって同時実行数の制限ってできるんですか?Celeryはworker数やらconcurrencyやら指定したら、溢れたタスクは待機してくれますが、、、

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

+1

まずは処理を軽くすることが出来ないか考えます。バグの有無やそもそも必要のない処理をやっているなどの可能性を考慮に入れてください。

次にアプリケーションの仕組みによると思いますが、処理キューを作って非同期で処理できるようにします。
リクエストを受けたら処理単位のIDを発行し、処理IDをレスポンスとしてすぐ返却します。受け取った側はその処理IDで処理の進捗状況を確認したり、成果物を受け取ったりできるようにします。
非同期で処理をする場合はWebサーバーのプロセスとは別に裏方で処理を行うプロセスが必要ですし、アプリケーションの性質に応じて「未処理」「処理中」「処理完了」などのプロセスを追う必要があれば、DBなどを使って処理状態を記録しておく必要があると思います。

別の手段としては単にサーバー台数を増やして物量で対応してもいいでしょう。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/10/31 20:08

    もう一つ。
    HTTPサーバーのレスポンスタイムアウトで処理が返せない場合など、様々な要因でエラーが発生します。
    エラーに対して具体的な解決策を求めたい場合は、質問内容にエラーの内容を追記してください。

    キャンセル

  • 2018/10/31 20:39

    申し訳ありません。
    「エラーが出る」という言い方は適切ではなかったです。
    具体的な状況を以下に記述します。

    現状
    テストの段階です。HeadlessChromeとSeleniumを用いて、テスト用サーバーからほとんど同時に100ユーザーほどでアクセスしています。Jmeterなどのツールの使いかたを覚えている時間がなかったためです。この際、データベースに保存しているデータから、正常に全ユーザーがアクセスできているかを確認したり、ページ遷移の際にスクリーンショットをとって、正常にページ遷移が行われているか確認しています。しかし、100ユーザーでアクセスした際、CPU使用率は低く、メモリ使用率が低いのにもかかわらず、何分経っても、ページが遷移しない状況がありました(ご指摘のような「一つ一つの処理が実行中の間はレスポンスを返す処理は行っていません」)このような状況はユーザー数が増えるにつれ、顕著に現れます

    キャンセル

  • 2018/10/31 20:56

    その内容は質問内容への追記として書いてください。

    キャンセル

+1

同じような回答になりますが…

まずはエラーの原因を追究するのがスジですよね。
その結果によってどこに手を入れるのかを決める、と。
やみくもに対策してもデスループにはまりがちになるのがオチです。

次に、サーバーをもっとパワフルなものにリプレースする
あるいは重たい処理を別サーバーで動かす
などの力技が使えるならそれがベターですかね。

ハードウェア的なてこ入れがムリなら
webアプリと重たい処理の間に調停役のなにかを挟むことになるかと。
ただし、webは一期一会ですから利用手順的な意味で変更が必要でしょう。

最初に書きましたが、webアプリが原因なのか、重たい処理が原因なのか
それによってやり方は変わってくると思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

checkベストアンサー

0

各OSの設定計算とかはされましたか?全体的なメモリー使用率だけみても、意味がないと思います。
各々のユーティリティにはメモリをどれぐらい利用するかとか設定するものがあります。たとえばpostgres(DB)利用するメモリーをどれぐらい割り当てるかとか?webサーバーの同時接続利用者が最大でどれぐらいを想定しているのか、発行するsqlでどれぐらいのメモリを利用する想定か、利用する言語でどれぐらいのメモリを利用し(クッキー、post変数など)それが、何タスクもしくは、何スレッドで起動するのかを調査し、最大利用メモリー数を算出します。各々のユーティリティーの必要メモリの想定設定からセマフォバッファ、共用バッファを割り当てていくと思います。(ちなみに、centos5.1では、半々になってました。) ユーティリティーはインストールした状態では、必要最低限の設定がされていると思います。
それらを考慮しご検討されては如何でしょうか?より原因が明確になるかと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.79%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る