2016-05-03 8 views
1

私は現在mod_wsgiとpython 2.7.10を使用してWindows上でweb2pyで動作しているApacheを持っています。私が気づいたのは、同時接続がある場合、要求ごとの応答時間が増えることです。この増加は、1つの接続に対して20msから5つの同時接続に対して200msになる可能性があります。同時接続数が最大20になると、要求が545Bしかないため、応答時間は800ms - 1秒になります。同時リクエストではApacheが遅い

nginxのようなフロントエンドを追加するとこれを解決するか、または変更可能なものがありますかApacheの設定?

私の現在のApache設定の制限は、次のとおり

Threadlimit 100 
ThreadsPerChild 100 
MaxRequestsPerChild 10000 
AcceptFilter http none 
AcceptFilter https none 
KeepAlive On 

実行されているコードは:

のJavascript:

$(function() { 
    function refresh(){ 
     $.get('/database/domath_stuff', {num:document.getElementById('mathstuff').innerHTML}, function (response) { 
      document.getElementById('mathstuff').innerHTML = response 
     }) 
    }  
    window.setInterval(refresh, 1000); 
}); 

Pythonがある:

def domath_stuff(): 
    number = int(request.vars.num) 
    number = number + 1 
    return number 
+0

リクエストの性質を説明したり、いくつかのコードを表示したりするのに役立つかもしれません。たとえば、これらのAjaxリクエストが1つのブラウザからの同時Ajaxリクエストである場合、セッション・ファイルがロックされ、すべてのリクエストがシリアライズされるという問題があります。 – Anthony

答えて

0

改善点として他の人に示唆されているように、nginxサーバーは、問題がPythonコードにあれば、まったく役に立たないでしょう。これは、リクエストがnginxでは処理されないためですが、使用しているPythonのWebホスティングの仕組みが何であっても同じです。

Pythonアプリケーションでは、アプリケーションまたはフレームワーク内の一部のリソースが正しくロックされていないため、要求処理のシリアル化が原因で問題が発生している可能性があります。 CPUバインドされたタスクは、Pythonグローバルインタープリタロックのために問題を引き起こす可能性もあります。

Apache MPMの設定が悪いために問題を悪化させる可能性があります。スレッドのディレクティブ値に矛盾があります。 ThreadsPerChildが1000の場合、Threadlimitより大きい値が間違っています。 PythonのGILの問題のため、Pythonアプリケーションでスレッド数を増やすことも悪い考えです。 1つはスレッド数が少なく、複数のプロセスになる傾向があります。

残念ながら、WindowsはPython Webアプリケーションを実行するための非常に貧弱なプラットフォームです。あなたのApacheは複数のプロセスを扱うことができません。

テスト用に使用しているHTTPクライアントによっては、KeepAliveを使用すると複雑になり、要求がシリアル化される可能性もあります。

+0

1000のThreadsPerChildはタイプミスです。それは現在100に設定されています。私はまた、アプリケーションが現在使用しているpython/javascriptを追加しました。 KeepAliveを使用すると、要求がシリアル化されるのはなぜですか? – steve

1

nginxは典型的にはApacheよりも速いですが、要求サーバーが少ないため問題はほとんどありません。これが起こりうる何十もの異なる理由があります。これはボトルネックと呼ばれる非常に一般的なことです。最も単純な説明は、アプリケーションがより多くのリソースを消費し、サーバーが処理できるものよりも多くの並行トランザクションを受け入れることですが、要求が非常に少ないため、それらを数えることができます。

+0

アプリケーションは、divの内部HTML(数字)をとり、ajax経由でPythonコントローラに渡し、1ずつインクリメントして戻ります。時間の増加は、ajax呼び出しが行われてからpythonコントローラで受信されるまでに発生します。 ApacheのCPU消費量が35%に達すると、web2pyがボトルネックになる可能性があると私は考えていますか? – steve

+0

それは可能です。 Web2pyの動作は分かりませんが、1秒あたり5リクエスト、1スレッドしかない場合は、遅くなります。そして、私はかなりPythonがシングルスレッドであると確信しています... – Josh

0

グラハムのフィードバックを使用して、私はIISに切り替えました。私は現在20の同時接続を取得しています<私のニーズに合った200ms応答時間です。私はIISを設定する際にweb2pyのドキュメンテーションをたどったので、同じ問題を抱えている人のために「すぐに」設定されています。

関連する問題