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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Webサーバー

Webサーバーとは、HTTPリクエストに応じて、クライアントに情報を提供するシステムです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

3回答

708閲覧

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

yamato_user

総合スコア2321

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Webサーバー

Webサーバーとは、HTTPリクエストに応じて、クライアントに情報を提供するシステムです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2018/10/31 10:05

編集2018/11/01 01:04

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

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

環境

Python

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

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

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

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

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

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

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

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

投稿2018/10/31 11:10

takasima20

総合スコア7458

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

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

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

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

投稿2018/10/31 10:34

mather

総合スコア6753

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yamato_user

2018/10/31 10:53

早速のご回答ありがとうございます。エラー原因を調査しているのですが、まだつかめていません。vmststでメモリとCPUの使用率を見ると1GBを切ったところでエラーが頻発しています(元は16GB)メモリの不足でプロセスが強制的に殺されることってありますか?
mather

2018/10/31 11:05

前置きですが、やはりあなた自身が抱える問題について具体的に述べて解決策を模索すべきであって、一般論はその後だと思いますよ。 メモリ不足によってOSがプロセスをkillする可能性もあるとは思うのですが、その可能性ばかりに注目しすぎるのは良くないです。 そもそもの問題として、一つ一つの処理が実行中の間はレスポンスを返しているのでしょうか。 処理している間HTTPコネクションを張ったままであれば、HTTPサーバーの接続数上限に達してしまうこともあると思います。
mather

2018/10/31 11:08

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

2018/10/31 11:39

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

2018/10/31 11:56

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

0

ベストアンサー

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

投稿2018/10/31 12:20

akirafudo6

総合スコア341

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問