ITのために。 パヌト1

ずらえどころのないゎヌ。



ずらえどころのないゞョヌクを芚えおいたすか たさに「Who need it」ずいう感嘆笊、「 WHY 」ずいう質問の圢で聞こえた、GO 1の最初の安定バヌゞョンのリリヌスはHabréで行われたした。



Habrにずっお珍しい圢匏で曞かれた䞀連の蚘事で、この質問に答えたいず思いたす-既存のWebプロゞェクトの段階的な共同開発の圢で-掻発な議論ず機胜の远加。 そしお、ハブ「High Performance」にサむクルを導入するこずを二重に正圓化するために、「ハムスタヌ」だけでなく、habri et orbiの重芁な自然負荷に耐える胜力を明確に瀺すプロゞェクトを䜜成するタスクを蚭定したす。



食前酒の代わりにGoでの最も単玔な動的Webアプリケヌションの実装は、同様のPython実装よりも5〜20倍速く実行されたす。 たた、Nginxが返す静的デヌタの速床に比べお2倍しか劣っおいたせん。



このプロゞェクトのフレヌムワヌクでは、Go蚀語自䜓に加えお、HTML5、CSS3、Redis、MongoDBなどの他の比范的新しいWeb開発テクノロゞヌに間接的に觊れたす。 たた、安党性の分野でいく぀かのトリックを抜出し、長期蚘憶の隅々からマッチを節玄するこずも詊みたす。 我慢しお、忍耐ずコヌヒヌを買いだめしおください-「たくさんの手玙」の䞋で、しかしこれは玹介だけです:)



たず、Habr政暩の迅速な察応ずGo蚀語専甚のハブの䜜成に感謝したす。 お気に入りの䞻題の認識は垞に楜しいので、このようなハブの出珟ず聎衆の関心の高たりが、Habréでの2幎ぶりの「ドラフトを取り䞊げる」こずを私に促したした。



さらに、ひげを生やした蚀葉、いく぀かの舌で瞛られた舌をスキップし、長い死んだ蚀語での翌のあるフレヌズの蚀い換えをスキップする、やや昔ながらのプレれンテヌションスタむルを事前に謝眪したす 法的過去から受け継いだ習慣のために。



プラむドず偏芋


ご存知のように、圌らは味に぀いお議論したせん。 したがっお、Go蚀語の優れた構文、シンプルさ、および優雅さに぀いお感嘆の声を舞台裏に残さなければなりたせん。 少なくずもコメントの䞭で、次の鈍くお尖った戊いを芋おみたいず思いたす。 これに基づいお、私は単玔で理解可胜な枬定の察象ずなる事項に぀いおのみ話すこずを提案したす。 しかし、数字を比范しおも、他の蚀語ず比范する必芁がありたす。他の蚀語も、因果関係ずしお認識されたす。 私はこの繊现な状況から抜け出す方法を長い間考えおいたしたが、その決定は完党に゜ロモニックであるように思われたす。 他のお気に入りの蚀語であるPythonず比范したす。 このようなアプロヌチは、偏芋の非難から私を救うように思えたす。 癜黒ず倪字で曞きたしょう。Pythonも倧奜きです 。



蚀語そのもの、その哲孊、および胜力を説明する文曞からの平凡な段萜を繰り返したくありたせん。 私はあなたが既に興味を持っおいるず同時に、自分でドキュメントを読むこずができるずいう事実から進んでいきたす。



障壁に、䞻よ 障壁に


前の段萜でおびえさせた比范から始めたしょう。 次の2぀のプリミティブな動的アプリケヌションを䜜成したす。



  1. Webサヌバヌを起動する
  2. ルヌティングずハンドラヌがありたす
  3. コンテキストから倉数を取埗したす
  4. ハンドラでそれを眮き換えお、パヌ゜ナラむズされた挚拶Hello、sを発行したす。




耇雑なこずは䜕もありたせんが、これは静的なコンテンツではありたせんが、倚少のunningはありたす。 メむンブレヌキがただディスク操䜜のたたであり、デヌタベヌスを操䜜しおいるずいう事実には、倚くの異論が予想されたす。 そしお、私はそれに぀いお議論したせん。 しかし、発衚された蚘事の内容を思い出したしょう。 i / oおよびdbの最適化に぀いお説明したすが、ここでは、玔応答率の数倀を芋おいきたす。



1. Webapp2.pyのアプリケヌションコヌド-貌り付けに基づく非垞にシンプルで高速なミニフレヌム



  webapp2をむンポヌトする
クラスHellowebapp2.RequestHandler
     def getself、name
         self.response.write 'Hello、s'name
 app = webapp2.WSGIApplication[
      '/\ w +'、こんにちは、
 ]、debug = False
 def main
    ペヌストむンポヌトhttpserverから
     httpserver.serveアプリ、ホスト= '127.0.0.1'、ポヌト= '8080'
 __name__ == '__main__'の堎合
    メむン 


起動コヌドpython habr.py



2. Goコヌド

 パッケヌゞメむン
むンポヌト
     「fmt」
     「net / http」
 
 funcハンドラヌw http.ResponseWriter、r * http.Request{
     fmt.Fprintfw、 "Hello、s"、r.URL.Path [1]
 }
 func main{
     http.HandleFunc "/"、ハンドラヌ
     http.ListenAndServe "8080"、なし
 } 


スタヌトアップコヌドhabr.goを実行したす



耇雑なこずはありたせんか 少なくずもこのような単玔なタスクに぀いおは、Goコヌドがいかにシンプルで理解しやすいかに泚意しおください。 䞡方のリストは同じアルゎリズムを瀺しおいたす。 ポヌトをリッスンし、すべおのGET /*をハンドラヌに送りたす。ハンドラヌは、*をHelloの埌に衚瀺名に倉換したす。 私は、そのようなスキヌムで働いたすべおの人にコヌドが明確でなければならないず信じおいたす。



3.比范のために、nginxを远加したす。これにより、「Hello、habr」ずいうテキストを含む静的ペヌゞが衚瀺されたす。 泚意 Nginxは、nginx-lightパッケヌゞに含たれる、すぐに䜿甚可胜な蚭定で起動されたす。 オヌバヌクロック甚の圚庫は巚倧なたたですが、これに぀いおは埌で説明したす。



4.次の構成のテストベンチ蚀語はサヌバヌずは呌びたせん

Lenovo B460E / RAM2G / CPUCeleron Dual-Core T3500 @ 2.10Ghz

OSLubuntu 12.04 x86、カヌネル3.2.0-20-generic



5. apache2-utilsのabナヌティリティを䜿甚しお、最も基本的な方法で枬定を行いたす。 必芁に応じお、Siegeたたは別の䜿い慣れたツヌルを䜿甚しお自分で確認できたす。



6.レヌス結果



  Py @ ab -c10 -n1000 http// localhost8080 / habr 
「-n」の倀が倧きくなるず、Pythonバヌゞョンでは察応できなくなりたす

テストにかかった時間0.987秒

1秒あたりのリク゚スト1012.67 [/秒]平均



  Go @ ab -c10 -n1000 http// localhost8080 / habr 


テストにかかった時間0.197秒

1秒あたりのリク゚スト数5080.24 [/秒]平均



  Nginx @ ab -c10 -n1000 http// localhost / 


テストにかかった時間0.101秒

1秒あたりのリク゚スト9895.50 [/秒]平均



タスクを耇雑にしたしょう。



  Py @ ab -c100 -n1000 http// localhost8080 / habr 


テストにかかった時間1.045秒

1秒あたりのリク゚スト956.57 [/ sec]平均



  Go @ ab -c100 -n1000http// localhost8080 / habr 


テストにかかった時間0.199秒

1秒あたりのリク゚スト5021.14 [/秒]平均



  Nginx @ ab -c100 -n1000 http// localhost / 


テストにかかった時間0.110秒

1秒あたりのリク゚スト9054.77 [/秒]平均



「-c」> 1000の堎合、Pythonバヌゞョンはテストに合栌せず、Nginxはキュりリを䜿い続けたすが、Goは「予期せず」1秒あたり50から4000のリク゚ストを瀺し、完党に予枬䞍可胜な結果を​​もたらしたす。 今日、Ubuntu 12.04ずバヌゞョンGo 1で最初に遭遇したため、この珟象は説明できたせん。以前のバヌゞョンr60.3では、Goは安定しおいたした。 たたは、ラップトップでも、パッケヌゞバンドルは明らかにHighLoadサヌバヌ甚ではありたせん:)



誰かがテスト方法論、デフォルト蚭定、たたは他の蚀語での実装の欠劂に満足しないのではないかず思いたす。 あなたの提案を聞いお、テストを繰り返したす。 Goの存圚開発の2幎間で、さたざたなテストを実行し、さたざたな蚭定で実行したした。 そしお、すべおのテストで、Goが私の䜜業範囲に最適なツヌルであるず確信したした。 それらをすべお実斜し、もたらすこずは恩知らずな職業です。なぜなら、圌らは再び䞍満を感じるからです。



蚀葉ぞの信仰を求めお、私は蚘憶からの結果から簡単な抜粋をしたす。



Javaは10〜30速くなるこずがありたすが、メモリ消費が著しく倧きいためですVM自䜓ずプロセスの䞡方による。 繰り返したすが、䞊蚘の䟋フレヌムワヌクを䜿甚せず、暙準ラむブラリのみは、最小限の実装コヌドを明確に瀺しおいたす。 そしお、コヌドが少ないほど、゚ラヌが少なくなりたす。



Net / Mono C実装に぀いおも同じこずが蚀えたす。



C / C ++を䜿甚するず、最小限のリ゜ヌス芁件で玠晎らしく高速なWebアプリケヌションを䜜成できたす。 しかし、開発速床は倧きく䜎䞋したす。



PythonずRubyの実装は速床が䜎䞋し、ほが同じ負荷になりたすが、PHPは壊滅的な打撃を受けたす。



次の郚分の発衚





ご枅聎ありがずうございたした。 少なくずも誰かが玹介をマスタヌし、自分にずっお興味深いものを芋぀けたこずを願っおいたす。

できれば文明的な議論を楜しみにしおいたす。



All Articles