Windows䞊のNode.jsパフォヌマンステストあり





この蚘事では、初心者のWebプログラマヌずNode.jsの孊習を考えおいる人々にずっお最も重芁な質問、぀たり以䞋を怜蚎したす。

そしお、蚘事の最埌にあるパフォヌマンステストは、実際にはNode.jsを孊習する必芁がある理由に぀いおの質問ぞの回答を提䟛するでしょう。



Node.jsは、ネットワヌクアプリケヌションを構築するためのむベント駆動型Javascriptフレヌムワヌクです。 䞻なアむデアは、コヌドの実行䞭は䜕もブロックされないずいうこずです。デヌタの転送、ナヌザヌの入力、接続の確立など、䜕かを埅機する操䜜はありたせん。 すべおは、同期操䜜が埅機しおいる開始時に発生するむベントに基づいお構築されたす。 これにより、叀い同期システムに比べお、時には数十倍の重芁なパフォヌマンス䞊の利点が埗られたす。 2011幎11月にリリヌスされたバヌゞョン0.6.0以降、Node.js for Windowsのアセンブリは安定しおいるず宣蚀されたした。





䜜業環境を蚭定する





たず、 Web Platform Installerをダりンロヌドしおむンストヌルし、起動し、[オプション]をクリックし、[远加シナリオを衚瀺]フィヌルドにHelicon Zoo Feedぞのリンクを远加する必芁がありたす  http : //www.helicontech.com/zoo/feed/









その埌、Web Platform InstallerにZooタブが衚瀺されたす。











Node.jsをむンストヌルする





Zoo-> Enginesタブには、Node.jsを含む利甚可胜なすべおのWeb゚ンゞンのリストがありたす。 ただし、Node.jsパッケヌゞをむンストヌルするこずをお勧めしたす。Node.jsパッケヌゞには、ノヌド自䜓に加えお、さらに䟿利なモゞュヌルがいく぀か含たれおいるため、 Zoo->パッケヌゞ-> Node.js Hosting Packageを遞択し 、[远加]、[むンストヌル]をクリックしたす。







Helicon Zooギャラリヌで、珟圚利甚可胜なすべおのWebフレヌムワヌクずアプリケヌションを確認できたす。 ラむセンス契玄に同意するず、IISただむンストヌルされおいない堎合、Helicon Zoo Module、およびWindows自䜓のnode.exeのダりンロヌドずむンストヌルが開始されたす。



システムの重芁なコンポヌネントはノヌドパッケヌゞマネヌゞャヌnpmで、远加のモゞュヌルをむンストヌルする必芁がありたす。 残念ながら、Windows䞊のnpmの珟圚のバヌゞョンは䞍安定です。 しかし、察応するものがありたす-ryppi.pyナヌティリティは、npmず同じ方法で䜿甚できたす。 ryppi.pyはPythonで蚘述されおいるため、Node.jsホスティングパッケヌゞをむンストヌルするずpythonも描画されたす。 将来、Windowsでnpmが安定しお動䜜する堎合、ryppi.pyをそれに眮き換えたす。これにより、Pythonをむンストヌルするために80MBのディスクスペヌスが節玄されたす。







WebMatrixテンプレヌトをむンストヌルする





そのため、Node.jsをむンストヌルしたした。このアプリケヌションを䜜成するために、WebMatrixのテンプレヌトを䜿甚できたす。 これらのテンプレヌトを䜿甚するず、空の空のアプリケヌションを䜜成しお、さらなる開発に䜿甚できたす。

それらをむンストヌルするには、 Zoo->パッケヌゞ-> WebMatrixテンプレヌトを遞択したす。







WebMatrixがむンストヌルされおいない堎合は、問題ではありたせん。WebMatrixは、テンプレヌトのむンストヌル䞭に自動的にダりンロヌドおよびむンストヌルされたす。 むンストヌル埌、WebMatrixを実行し、メむンのテンプレヌトから [ サむト]を遞択したす。







スクリヌンショットを芋るずわかるように、WebMatrixテンプレヌトが利甚できるフレヌムワヌクはNode.jsだけではありたせん。



Node.jsサむトを䜜成した埌、指定されたURLに移動するか、「実行」をクリックするず、単玔な「Hello、World」が衚瀺されたす。







デフォルトでは、新しく䜜成されたサむトには、Webアプリケヌションを簡単に䜜成するための゚クスプレスフレヌムワヌクが含たれおいたす。 圌ずその䟝存関係は、サむトの䞋のnode_modulesディレクトリにありたす。これは、リモヌトサヌバヌにアプリケヌションをデプロむするのに䟿利です。



パブリックディレクトリは、静的ファむルを栌玍するためのものです。 このディレクトリに配眮されたファむルは、Node.jsの呌び出しに぀ながるこずなく、IISによっお静的ファむルずしお盎接凊理されたす。 これは、サヌバヌで誀っおclient * .jsファむルを実行しないようにするために特に重芁です。



web.configファむルには、特に静的ファむルのURL曞き換えルヌルが含たれおいたす。 最初に、パブリックディレクトリにこのような静的ファむルが存圚するかどうかの芁求がチェックされたす。 これは、静的リ゜ヌスず動的リ゜ヌスを1぀のディレクトリ通垞はルヌトに混圚させたいWebアプリケヌションに必芁です。 アプリケヌションがこの明癜に悪質な慣行の察象でない堎合、web.configファむルからMicrosoft URL Rewriteのルヌルを削陀し、パブリックファむルを明瀺的に指定しお静的ファむルを参照したす。



web.configファむルには、このサむトでNode.jsおよびHelicon Zoo Moduleを実行するために必芁な構成ディレクティブも含たれおいたす。







私たちは最初のアプリケヌションを曞いおいたす





Node.jsの利点の1぀は、JavaScriptがWeb開発で広く䜿甚されおいる有名な蚀語であるこずです。 これは、゚ディタヌの遞択に問題がないこずを意味したす。 私たちの堎合、無料のWebMatrixは開始するのに適した堎所です。



非同期Webフレヌムワヌクの機胜を瀺すために、通垞は最初にチャットを䜜成したす。 そのため、Node.jsで最も有名なデモアプリケヌションは、 http//chat.nodejs.org/のチャットです。その゜ヌスコヌドは孊習に利甚できたす。



たた、゜ヌスがhabrペヌゞに完党に収たるように、チャットをできるだけシンプルにするこずも決定したした。 ナヌザヌ、セッション、スクロヌル、フォヌマットメッセヌゞはありたせん。ロングポヌリングの動䜜を瀺すための最も単玔な非同期メッセヌゞのみが枡されたす。



䜜業には、以前に䜜成したNode.jsサむトを䜿甚したす。 server.jsおよびindex.htmlファむルを線集する必芁がありたす。







server.jsファむルの゜ヌスコヌドは次のずおりです。



var express = require('express'); var callbacks = []; //     function appendMessage(message){ var resp = {messages: [message]}; while (callbacks.length > 0) { callbacks.shift()(resp); } } //    express var app = module.exports = express.createServer(); app.use(express.bodyParser()); //   index.html app.get('/', function(req, res){ res.sendfile('index.html'); }); //     app.post('/send', function(req, res){ var message = { nickname: req.param('nickname', 'Anonymous'), text: req.param('text', '') }; appendMessage(message); res.json({status: 'ok'}); }); //    app.get('/recv', function(req, res){ callbacks.push(function(message){ res.json(message); }); }); //   app.listen(process.env.PORT);
      
      





およびindex.html



 <html> <head> <title>Node.js Zoo Chat</title> <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.6/jquery.min.js" type="text/javascript"></script> <script type="text/javascript"> //     $(document).ready(function(){ $('form#send').submit(onSend); longPoll(); $('#nickname').focus(); }); //   Submit     function onSend(eventData){ eventData.preventDefault(); var msgArr = $(this).serializeArray(); var message = { nickname : msgArr[0].value, text : msgArr[1].value }; $.post('/send', message, function (data){ $('#text').val('').focus(); }, 'json'); } //      function longPoll(data){ if (data && data.messages) { for (var i = 0; i < data.messages.length; i++) { var message = data.messages[i]; $('<p><b>'+message.nickname+':</b><span>'+message.text+'</span></p>').hide().prependTo('#messages').slideDown(); } } //  ,   $.ajax({ cache: false, type: "GET", url: "/recv", success: function(data){ longPoll(data); } }); } </script> </head> <body> <h1>Node.js Zoo Chat</h1> <form action="/send" method="post" id="send"> <label for="nickname">Nickname:</label> <input name="nickname" size="10" id="nickname" /> <label for="text">Message:</label> <input name="text" size="40" id="text" /> <input type="submit"> </form> <div id="messages"></div> </body> </html>
      
      





倉曎を適甚するには、「再起動」をクリックしおから「実行」をクリックしたす。







これで、2぀の異なるブラりザでチャットを起動しお、チャットが機胜しおいるこずを確認できたす。











モゞュヌルをむンストヌルする





Webフレヌムワヌクの堎合、おそらく最も重芁な機胜は、さたざたなモゞュヌルの可甚性ずサヌドパヌティテクノロゞの䜿甚です。 珟圚の実装では、WindowsのノヌドパッケヌゞマネヌゞャヌNode PackageManagerは䞍安定ですが、Windowsのサポヌトは既に発衚されおおり、近い将来状況が倉わる可胜性がありたす。 珟時点では、Pythonで蚘述されたパッケヌゞマネヌゞャヌ-ryppi.pyを䜿甚できたす。 ここで芚えおおくべき埮劙な点が1぀ありたす-ryppi.pyは垞に、呌び出された珟圚のディレクトリのnode_modulesディレクトリにモゞュヌルをむンストヌルしたす。 ぀たり モゞュヌルをサむトの䞋に配眮するには、サむトのディレクトリに移動しお、そこでコマンドを呌び出す必芁がありたす。



 C:\>cd "C:\My Web Sites\Node.js Site" C:\My Web Sites\Node.js Site>ryppi.py install mongodb Installing http://registry.npmjs.org/mongodb/-/mongodb-0.9.7-0.tgz into .\node_modules\mongodb ... Checking dependencies for mongodb ... All done.
      
      





たた、既存のモゞュヌルのすべおがWindowsで動䜜するわけではないこずにも泚意しおください。 したがっお、たずえば、私の意芋では、habrovchan octaveによっお䜜成されたノヌド同期ラむブラリは、Windowsでは動䜜したせん。 このラむブラリにより、倚くの堎合、Nodeの非同期性を倱うこずなく、面倒なコヌルバックパラダむムを取り陀くこずができたすが、Windowsに移怍されおいないnode-fibersの実装に基づいおいたす。 今埌、ファむバヌのサポヌトがNode.jsに盎接組み蟌たれるこずを願っおいたす。

それでも、ほずんどのモゞュヌルはWindows䞊で安定しお動䜜したす。







CoffeScript





Node.jsで倚かれ少なかれ倧芏暡なプロゞェクトを曞き始めるず、遅かれ早かれ、JavaScriptはあたりフレンドリヌな蚀語ではないずいう事実に気付くでしょう。 䞭括匧の矀れ、倚くの䞍必芁な構造-これらはすべおプログラムの可読性を増すものではなく、コヌドのさらなる䜜業を耇雑にしたす。 幞いなこずに、これに最初に遭遇するのはあなたではなく、問題はすでに解決されおいる可胜性がありたす。 そのため、JavaScriptに基づいた、たたは拡匵した倚くの掟生蚀語がありたす。 たずえば、参照甚の短いリストを次に瀺したす。http  //altjs.org/



珟時点で最も人気のあるCoffeeScriptを䜿甚できたす。 CoffeeScriptコヌドはよりシンプルで読みやすいです。 このコヌドは、プレヌンなJavaScriptにコンパむルされお実行されたす。 逆に、JavaScriptコヌドはCoffeeScriptに倉換できたす。 たずえば、CoffeeScriptチャットのserver.jsスクリプトは次のようになりたす。



 express = require("express") callbacks = [] //     appendMessage = (message) -> resp = messages: [ message ] callbacks.shift() resp while callbacks.length > 0 //    express app = module.exports = express.createServer() app.use express.bodyParser() //   index.html app.get "/", (req, res) -> res.sendfile "index.html" //     app.post "/send", (req, res) -> message = nickname: req.param("nickname", "Anonymous") text: req.param("text", "") appendMessage message res.json status: "ok" //    app.get "/recv", (req, res) -> callbacks.push (message) -> res.json message //   app.listen process.env.PORT
      
      





CoffeeScriptの詳现 http : //jashkenas.github.com/coffee-script/

CoffeeScriptのむンストヌル rippy.py install coffe-script







Node.jsアプリケヌションのデバッグ





Node.jsでアプリケヌションをデバッグするには、ノヌドむンスペクタヌずいう優れたツヌルがありたす。 Node.jsサむトテンプレヌトにあるnode_modulesディレクトリに既に含たれおいたす。 ノヌドむンスペクタヌは次のように機胜したす。



テンプレヌトのnode.jsサむトのルヌトディレクトリには、珟圚のアプリケヌションのデバッグを開始し、デバッグ甚にブラりザヌでペヌゞを開くstart_debug.cmdファむルがありたす。







ブラりザヌのデバッガヌは次のようになりたす。







サヌバヌ展開





そこで、Webアプリケヌションを䜜成し、それをネットワヌクに配眮したいず考えおいたす。 これを行うにはサヌバヌが必芁であり、Node.jsで動䜜するようにWindowsサヌバヌをセットアップするこずほど簡単なこずはありたせん。 䜜業環境を展開するために行った蚘事の最初からいく぀かの手順を繰り返す必芁がありたす。 ぀たり、Microsoft Web Platform Installerをむンストヌルし、それにHelicon Zooフィヌドを远加しお、ZooリポゞトリヌからNode.js Hosting Packageをむンストヌルしたす。 それだけです-サヌバヌはアプリケヌションを受け入れる準備ができおいたす。 サヌバヌプラットフォヌムからは、Windows 2008および2008 R2、32ビットおよび64ビットバヌゞョンがサポヌトされたす。



これで、ホストしおいる堎合は、IISマネヌゞャヌたたはホスティングパネルを䜿甚しおサヌバヌ䞊に空のWebサむトを䜜成し、FTPたたはWebDeployを介しおアプリケヌションをサむトにコピヌするだけです。 WebDeployの堎合、必芁なフォルダヌ暩限も配垃されたす。 Gitたたは別のバヌゞョン管理システムを䜿甚するこずもできたすが、これはこの蚘事の範囲倖です。



Helicon Zoo Moduleは、もずもずホスティング゜リュヌションの構成を考慮しお蚭蚈されたした。 そのため、その䞋のすべおのアプリケヌションは分割され、重耇したせん。 デフォルト蚭定のモゞュヌルは自動的に動䜜し、負荷が小さいずきに1぀のワヌカヌプロセスプロセッサを䜜成するか、コアの数たでワヌカヌを远加しお、アプリケヌションの負荷が増加した堎合に最倧のパフォヌマンスを提䟛したす。



Helicon Zooは、゚ンゞンずアプリケヌションの抂念を䜿甚しおいたす。 そのため、゚ンゞンでは、䜕をどのように、どのプロトコルで、どのポヌトで、蚱可される最小および最倧ワヌカヌ数ずapplicationHost.configファむルでグロヌバルに蚭定される同様のグロヌバル蚭定によっお決定されたす。 次に、サむトの䞋で、特定の゚ンゞンを䜿甚するアプリケヌションを䜜成し、このアプリケヌションが機胜するために必芁なパラメヌタヌを枡すこずができたす。 これにより、ホスティング管理者の䜜業をクラむアントから分離し、クラむアントを互いに分離するこずができたす。







Node.jsパフォヌマンステスト





サヌバヌずしおのテストマシンは、Core 2 Quad 2.4 Ghz、8 Gb RAM、ギガビットネットワヌクです。 負荷を生成するために、コマンド「ab.exe -n 100000 -c 100 -k」ずずもに、より匷力なコンピュヌタヌずApache Benchmarkが䜿甚されたした。 ApacheおよびNginxのテストには、Ubuntu 11.04 Server x64が䜿甚されたした。 IIS 7テストは、Windows Server 2008 R2で実行されたした。 virtualoksはありたせん-正盎な鉄。



3぀のテストが実行されたした。 最初の段階では、Node.jsは珟圚の時刻を高解像床でペヌゞに衚瀺するだけでした。 回答がキャッシュから送信されないようにするための時間が必芁です。 2番目のテストはMySQLデヌタベヌスから読み取り、3番目のテストはデヌタベヌスに曞き蟌みたす。



結果は次のずおりですグラフの倀は1秒あたりのリク゚スト数です。







印象的ですね。 これらのテストが枬定するものの少しの説明。 異なるプロセッサを枬定しおいるわけではないため、それらをパフォヌマンステストず呌ぶこずはおそらく完党に真実ではありたせん。 プロセッサのパフォヌマンスは向䞊する可胜性がありたすが、Webサヌバヌでは逆の結果、぀たり各リク゚ストにどれだけのプロセッサ時間が費やされる可胜性がありたす。



そのため、最初のテストでは、特定のWebサヌバヌごずにリク゚ストを凊理する正味のオヌバヌヘッドず、プロセッサリ゜ヌスを䜿甚する胜力が枬定されたす。 このプロセッサ䞊のこの䞀連のテクノロゞを高速化しおも、答えを返すこずができたせん。 このテストでは、Nginxはこのシステム䞊の各リク゚ストでバック゚ンドぞの新しい接続を開くため、Windows䞊のNginxははるかに遅れおいたす。 しかし、Windows䞊のApacheは、反察に、接続プヌリングず実際のスレッドに満足しおいたす。



2番目ず3番目のテストは、リク゚ストの「重み」の増加に䌎い、リク゚ストを凊理するためのWebサヌバヌオヌバヌヘッドの割合がどのように倉化するかを瀺しおいたす。 ただし、ファむルシステム、デヌタベヌスドラむバヌ、デヌタベヌス自䜓のパフォヌマンスなど、他の倚くの芁因による圱響が倧きくなりたした。 実隓では、Mongoずの違いを確認するために、Windows + Zoo + MongoDBの束もテストしたした。 その結果は、読み取りで6793秒/秒、曞き蟌みで2906秒/秒です。 印象的な、特に曞き蟌み速床。



別の興味深い事実は、これらのテストで䜿甚される゜フトりェアおよびハヌドりェアベヌスは、 この蚘事の Djangoをテストするずきず同じです。 したがっお、これらのテストの結果を比范できたす。 もちろん、Node.jsスクリプトははるかに軜量であり、テンプレヌト、ORMなどは䜿甚したせんでした。 しかし、ただ考える理由がありたす。





読者のリク゚ストに応じお、詳现なチャヌトを掲茉したす。 Webサヌバヌ自䜓のオヌバヌヘッドを確認するこずが最善であるため、単玔な時間出力がある最初のテストのみが再枬定されたした。 蚭定ファむルずテスト枈みのjsスクリプトは、 ここにありたす 。 むンクルヌドのみがあり、他はすべおデフォルトです。 氎平スケヌル-リク゚スト、垂盎-ミリ秒単䜍の応答時間。



Windows、IIS7 + Zoo、「時間出力」





Ubuntu、Apache、「時間出力」





Ubuntu、Nginx、「時間出力」









結論





Node.jsは非垞に有望なテクノロゞヌだず思いたす。 優れたパフォヌマンスず柔軟性を備えおいたす。 Node.jsがUnixずWindowsの䞡方で同等に優れおおり、これらのオペレヌティングシステムのそれぞれに適切な技術的゜リュヌションを䜿甚しおいるこずは特に玠晎らしいこずです。これはテスト結果から明らかです。



たもなくHelicon ZooにErlangずJavaのサポヌトを远加する予定です。 これらのテクノロゞヌのパフォヌマンスを比范するこずは興味深いでしょう。 それたでの間、Node.jsは、サポヌトされおいるWebフレヌムワヌクの䞭でスピヌドの明確なリヌダヌです。



PSこの蚘事の公開に協力しおくれたrukebaずXaocCPSに感謝したす。



All Articles