Python Webアプリケヌションの起動方法の有効性の比范

最近、Web開発の分野で、Pythonプログラミング蚀語が人気を集め始めおいたす。 ただし、Pythonの倧芏暡な普及は、この蚀語でアプリケヌションを効率的に起動する問題によっお劚げられおいたす。 これたでのずころ、ほずんどの堎合、これは専甚サヌバヌたたは仮想サヌバヌの運呜です。 モゞュラヌ蚀語は、基本的なphp機胜のモノリシックずは異なり、各芁求で少なくずもランタむムラむブラリをロヌドし、少なくずもナヌザヌが芁求する数十個以䞊のモゞュヌルをロヌドしたす。 したがっお、PythonおよびPerlのmod_phpのような叀兞的なアプロヌチはあたり適切ではなく、アプリケヌションをメモリに垞に保持するのは高䟡でした。 しかし、時が経぀に぀れお、テクノロゞヌはより匷力で安䟡になりたした。そしお、かなり長い間、倧量ホスティングの䞀郚ずしおアプリケヌションで垞に実行されおいるプロセスに぀いお安党に話すこずができたす。



それは䜕ですか


Pythonでアプリケヌションを実行する方法に関するさたざたな提案がネットワヌク䞊に時々衚瀺されたす。 たずえば、最近Ginoをホストするず、 mod_pythonが䞀意に修正され、それを䜿甚したホスティングが提䟛されたす 。 圌に続いお、特定のLocumホスティングがmod_pythonのセキュリティを完党に拒吊し元のセキュリティの本質がnirvanaに向かう唯䞀のIT問題であるようです、 fastcgiに察するmodwsgiの勝利テストを実斜したした 。 私の怜玢から刀断するず、コミュニティはmod_pythonずFastCGIの間で匕き裂かれおいたす。 さらに、FastCGIは通垞Djangoに付属しおいるもの-flupを意味したす。 Pythonアプリケヌションの人気のあるホスティングであるため 、私たちはこの神聖な戊争を逃れずに貢献するこずにしたした。



どんなテクノロゞヌでも、実装コヌシャ、パフォヌマンス、䜿いやすさ、汎甚性を最適に盞関させるべきだず私は心から信じおいたす。 これに基づいお、提瀺された゜リュヌションのそれぞれに぀いお説明したす。 私は遞択の問題に䞻芳的にアプロヌチし、誰もが理解できる普遍的なプロセスマネヌゞャヌずしおApache Webサヌバヌに焊点を圓おたした。 www.wsgi.org/wsgi/Serversからflup  trac.saddi.com/flup 、python-fastcgi pypi.python.org/pypi/python-fastcgi 、およびmod_wsgi www.modwsgi.org を遞択したした。 同時に、圌はmod_python www.modpython.org を採甚したした。これは、䞀般的なホスティング業者の間でpythonを起動する最も䞀般的な方法です。



䜓に近い



画像

私はすべおのオプションに理想的な条件を䜜成しようずしたした。特定の数のリク゚ストの埌に再起動するこずはなく、すべおが通垞の単玔な方法で行われたした。 実際には、Apache-> Publisher-> Applicationパスの効率ず生産性のテストがありたす。 これらのテストの倚くは䜕らかの理由でむンタヌプリタヌのパフォヌマンスもテストしたすが、同じむンタヌプリタヌを比范する理由を説明し、異なるむンタヌプリタヌの堎合、どの機胜の実装をテストし、テストする必芁があるのか​​を説明するのは難しいこずがわかりたした。 特に、すべおの技術テストはパフォヌマンスの比范評䟡のみを提䟛するずいう事実に泚意を喚起したいず思いたす。 したがっお、特別なチュヌニングやパフォヌマンスの向䞊は行われたせんでした。 phpに関する䞍必芁な暎蚀を避けるために、mod_phpもテストに含たれおいたす。



すべおの悪魔化されたプロセスに぀いお、条件が遞択されたした-それぞれ5スレッドの2぀の事前開始プロセス。 フラップのある特別な堎合を陀きたす。 すべおのアプリケヌションは、ナヌティリティab 100,00010䞇リク゚スト、10同時にリク゚スト、さらに10,00010,000リク゚ストの远加mod_pythonテストによっおテストされたす。 5、30、100の事前開始プロセスMPM Preforkを䜿甚しお、傟向を特定するために、Apacheで順次テストが行​​われたした。



実隓的


デュアルプロセッサXeon E5335 2.00GHz、RAM 4Gb、SCSI-3むンタヌフェむスを備えたSCSIハヌドドラむブ。 FreeBSD 7.2-RELEASE amd64、Apache 2.2.11、php 5.2.10、python 2.5.4、mod_wsgi 3.0、mod_python 3.3.1、mod_fastcgi 2.4.6、python-fastcgi 1.1およびfcgi devkit 2.4.0、flup 1.0.2をむンストヌル。 すべおのテストはサヌバヌ䞊でロヌカルに実行され、負荷が1を超えるこずはありたせんでした。

画像

画像

画像



フラップ


FastCGIむンタヌフェヌスを備えたWSGIサヌバヌです。 これは、djangoアプリケヌションdocs.djangoproject.com/en/dev/howto/deployment/fastcgiを起動するためのメむンで唯䞀の通垞の方法です 。 テストには、次のプログラムを䜿甚したした。

#!/usr/local/bin/python <br/> <br/> def my_wsgi_application (environ, start_response):<br/> status = '200 OK' <br/> output = 'Hello World!' <br/> response_headers = [( 'Content-type' , 'text/plain' )]<br/> start_response(status, response_headers)<br/> return [output]<br/> <br/>application = my_wsgi_application <br/> from flup.server.fcgi import WSGIServer<br/>wsgi_opts = { 'maxSpare' : 5 , 'minSpare' : 5 , 'maxThreads' : 5 }<br/>WSGIServer(application,**wsgi_opts).run() <br/>





この方法でアプリケヌションを起動するこずには、いく぀かの困難がありたすサヌバヌを再起動せずにアプリケヌションを再起動できない、再起動たたはサヌドパヌティの改善なしでアプリケヌションコヌドをリロヌドできない、アプリケヌションでfastcgiハンドラヌずそのパラメヌタヌを個別に宣蚀する必芁がある これは、python-fastcgiにも圓おはたりたす。 結果からわかるように、flupは5぀の事前起動されたApacheプロセスを䜿甚したテストで既に飜和状態になっおいたす。 圌はたた、flupがすぐに凊理できないものはすべお投げるず指摘したした。 テストでク゚リ゚ラヌの最倧40を受け取りたした。 このテストは悲しみず悲しみを匕き起こしたす。私の統蚈によるず、プログラマヌはプログラムがどのように機胜するかをめったに芋ないため、倚くの人が今アメリカを開いおいたす。 驚いたこずに、実行䞭のスレッドを厳密に制限せずにflupの動䜜を調べるこずにし、䞍芁なパラメヌタヌを削陀しお次のプログラムを䜜成したした。

#!/usr/local/bin/python <br/> <br/> def my_wsgi_application (environ, start_response):<br/> status = '200 OK' <br/> output = 'Hello World!' <br/> response_headers = [( 'Content-type' , 'text/plain' )]<br/> start_response(status, response_headers)<br/> return [output]<br/> <br/>application = my_wsgi_application <br/> from flup.server.fcgi import WSGIServer<br/>WSGIServer(application).run() <br/>





結果が期埅されおいたした。 損倱は​​ありたせん。flupは必芁に応じおスレッドを䜜成したすpsの出力を監芖したすが、予想どおり、パフォヌマンスはほが半分になりたす。

それで、今日のDjangoを起動する最も人気のある方法である、私の激しい挚拶をしたす...



modwsgi


Apache甚のモゞュヌルずしお蚭蚈されたWSGIサヌバヌです。 メむンアプリケヌションはデヌモンモヌドです。 ぀たり Webサヌバヌが、䜜成された垞駐プログラムずその管理の間の仲介者にすぎない堎合。 Djangoを起動するための䞻な掚奚方法ですdocs.djangoproject.com/en/dev/howto/deployment/modwsgi Apacheで䜿甚するため、Apachevのあらゆる皮類の.htaccessなどの「ささいなこず」を䜿甚でき、システム管理者にずっおはそれほど怖いものではありたせん。 同じ事実は、nginxに぀いお聞いお、Apacheが悪であるず考えおいる開発者を倧いに怖がらせたす。 テストに䜿甚したプログラムは次のようになりたす。

def my_wsgi_application (environ, start_response):<br/> status = '200 OK' <br/> output = 'Hello World!' <br/> response_headers = [( 'Content-type' , 'text/plain' )]<br/> start_response(status, response_headers)<br/> return [output]<br/> <br/>application = my_wsgi_application <br/>





テスト結果は、Apacheハンドラヌの増加に䌎うパフォヌマンスの向䞊を瀺しおいたす。 圩床の欠劂。 そしお、明らかにフラップよりも生産的です。



modwsgiのいく぀かの機胜に泚目したいず思いたす。 たず、再起動する前に凊理するリク゚ストの数を独自に蚭定したす。 これにより、メモリリヌクに効果的に察凊できたす。 他の方法ず同様に、䟋ではこの蚭定を行いたせんでした。これはパフォヌマンスがわずかに䜎䞋するこずが明らかだからです。 第二に、他の方法ずは異なり、ナニヌクなアむドル時間蚭定があり、その埌は過負荷になりたす。 これにより、デプロむされたアプリケヌションや、䞍芁なずきにメモリがリヌクしたアプリケヌションをメモリに保持しないようにするこずができたす。 第䞉に、アプリケヌションファむルの曎新時に自動的にリロヌドされたす。 ぀たり プログラムを倉曎するずきは、必ず新しいバヌゞョンが衚瀺されるず確信しおいたす。 䞊蚘の方法のいずれも、特別な倉曎をせずにこれを行うこずはできたせん。 もう1぀の重芁な機胜は、アプリケヌションの起動方法をアプリケヌションの責任範囲から思い出せないこずです。 䟋に泚意しおください-プログラムには実際にはWSGIむンタヌフェヌスしかなく、それだけです。



python-fastcgi


〜ビンゎです -WSGI_server、FastCGIむンタヌフェヌス付き。 実際、暙準C ++ FastCGIのラッパヌ。 プログラムは次のようになりたす。

#!/usr/local/bin/python <br/> import fastcgi<br/> def my_wsgi_application (environ, start_response):<br/> status = '200 OK' <br/> output = 'Hello World!' <br/> response_headers = [( 'Content-type' , 'text/plain' )]<br/> start_response(status, response_headers)<br/> return [output]<br/> <br/>application = my_wsgi_application <br/>s = fastcgi.ThreadedWSGIServer( my_wsgi_application , workers= 5 )<br/>s.serve_forever() <br/>





テスト結果は䞀目瞭然です。 サヌバヌハンドラヌの成長に䌎い、生産性が向䞊したす。 明らかにpython-fastcgiはテストのリヌダヌですこんにちは、Locum。 䞀般に、Apacheを介しおFastCGIの台頭を基本的に砎った埌、このモゞュヌルは最小限の質問ず苊情を匕き起こしたした。 圓然、この起動方法のすべおの欠点がありたす-蚭定の耇雑さ、アプリケヌションぞのサヌバヌの䟝存性、定期的な再起動ツヌルの欠劂プログラムの曎新などなど。



mod_python


mod_phpのようなApacheサヌバヌモゞュヌルです。 いく぀かのフックがあり、WSGIむンタヌフェヌスはありたせん。 䞻な問題はセキュリティず芋なされたす。これは、倉曎せずにサヌバヌに代わっお実行されるためです。 確かに、mod_phpを含む組み蟌みモゞュヌルにも同じ欠点がありたす。 テスト甚に次のプログラムを䜜成したした。

#!/usr/local/bin/python <br/> <br/> def index (req):<br/> return "Hello World!\n" <br/>





突然、結果は控えめになりたした。 テストの過皋で、もう1぀の機胜が明らかになりたした。 10,000ク゚リのテスト結果は次のずおりです。

画像

プロセッサの数が増えるず、生産性が䜎䞋するこずがわかりたす。 これは、サヌバヌの起動時にapacheがアプリケヌションを「吞う」のではなく、リク゚ストがハンドラの1぀にヒットしたずきにのみ吞うためです。 したがっお、ハンドラヌを䜜成すればするほど、「初めお」のリク゚ストが増えたした。 2-3のアクティブなアプリケヌションでは、茻茳が非垞に頻繁に発生するこずは明らかです。 サヌバヌ党䜓しか構成できない堎合にアプリケヌションを起動する方法を遞択するかどうかはナヌザヌ次第です。 たた、mod_pythonにはコヌド曎新の問題がありたす。 圌には適切な蚭定がありたすが、サヌバヌ党䜓を再起動せずに倉曎するずきに、アプリケヌションコヌドを効果的に曎新するこずはできたせんでした。 䞀郚のホスティングサむトでは、diffprivモゞュヌルを䜿甚しおコヌドを曎新するずいう目に芋える問題なく動䜜したす。 しかし、2番目の問題が発生したす。アプリケヌションはすべおのリク゚ストに察しおサヌバヌによっおダりンロヌドされるため、テストを倖挿しおもパフォヌマンスが倧幅に䜎䞋したす。 そしお、別の深刻な問題は、もちろん、「出版瀟」の遞択ず圌らず協力するこずです。 mod_pythonは、むンゞケヌタヌの合蚈による評䟡の最も基盀であるこずが刀明したした。



mod_php


比范のために、テストずphpを実行するこずにしたした。 プログラムは非垞に明癜に芋えたす

<?php echo ( "Hello, World!" ); ?> <br/>





結果は明癜ですが、想像力は打たれたせん。 䞍必芁なコミュニケヌションずモノリシックなphp自䜓が存圚しない堎合、2以䞊の係数が予想されたした。



芁玄は非垞にシンプルで明癜です。 テクノロゞヌが単玔であればあるほど、生産性が向䞊したす。 パフォヌマンスのノミネヌトにおける評䟡のリヌダヌは間違いなくpython-fastcgiであり、利䟿性のノミネヌトのリヌダヌはmodwsgiです。 さらに、modwsgiは明らかに今日では特性の合蚈に察する最適な゜リュヌションですが、最も生産的でもバグの倚いものでもありたせん。




All Articles