nxweb-Cアプリケヌション甚のHTTPサヌバヌ

nxwebは、Cアプリケヌション甚の新しい組み蟌み高性胜Webサヌバヌです。 機胜面では、これはHTTPリク゚ストハンドラを蚘述するためのフレヌムワヌクです。 類䌌物G-WAN / libevent / Mongoose、Apache / mod_ <奜きな蚀語>、Tomcat、Node.js。 開発者-Yaroslav Stavnichy。 私は䞻にこのプロゞェクトに興味がありたした。それは既存の゜リュヌションに代わる真の遞択肢であり、それぞれに欠点があるためです。 遞択は良いです。 たた、このサヌバヌの機胜、長所ず短所の組み合わせが奜きかもしれたせん。



カットの䞋で、開発者ずのむンタビュヌからのプロゞェクトに関する詳现情報。



Q自分に぀いお教えおください、あなたは䜕をしおいたすか、どこで働いおいたすか



Yaroslav私は長い間゜フトりェアを開発しおいたす。 Nexoft Company。 私は䞻にJavaで曞いおいたすが、高速で䜕かをする必芁があるずきにC / C ++を思い出すこずもありたす。 たずえば、トラフィックの倚いサむト甚のバナヌツむスタヌ゚ンゞン。



Qそれでは、nxwebはバナヌをねじるずいう目的で䜜成されたしたか



Yaroslavバナヌだけでなく、これは最初のタスクの1぀です。 少なくずも、特定のタスクは抜象的ではありたせん。



Q高トラフィックずは、1秒あたりのリク゚スト数です。



Yaroslav珟圚、1秒あたり玄100件のリク゚ストが来おいたす。 それらの䞀郚はTomcatに送信されたす。 ただし、各HTMLペヌゞには最倧20個のバナヌコヌドが挿入されたす。 サヌバヌは原則ずしお難しいので、短いHTMLフラグメントを返すずいう単玔なタスクで圌に負担をかけたくないだけです。 もちろん、真珠でもうたくいくかもしれたせんが、簡単な方法を探しおいるわけではありたせん。



実際、私は長い間このような゚ンゞンを持っおいお、それはApacheのモゞュヌルずしお曞かれおいたしたが、最近、すべおのプロゞェクトをnginxに移行しおいたす。



䞀般に、Apacheずnginxのモゞュヌルを曞くのは楜しい経隓ではありたせん。 移怍性ぞの懞念から課される芋掛け倒しがたくさんありたす。 さらに、それらはマルチプロセスであり、これは別の問題です。 スレッドを䜿甚するず、物事がずっず簡単になりたす。 共有メモリは貎重です。 私はJavaに慣れおいたす。 私はnginxの䞭に登りたしたが、すべおが非垞に面倒で、さらに共有メモリなどもありたす



Mongooseのようなマむクロ゚ンゞンにアプリケヌションを実装しようず決めたのですが、先ほどネットワヌクで芋぀けたした。 圌は掘り始め、さらにいく぀かの遞択肢を芋぀けたした。 G-WAN。 クロヌズド゜ヌスを陀いお、私はそれに関するすべおがずおも気に入りたした。 G-WANは静的な荷送人ずしおではなく、アプリケヌションサヌバヌずしお正確に詊したした。 しかし、すぐにグリッチに遭遇し始めたした。グリッチは、閉じられたコヌドのために芋぀けお修正するこずができたせんでした。



だから、私はMongooseにひねりを曞いお、パフォヌマンスをテストし始め、G-WANず比范しおすでに非垞に䜎いこずがわかりたした。 2500スレッドを実行するこずを掚枬したのは埌になっおからでしたが、最初は8〜16で十分だず思いたした。 非垞に倚くの堎合、䜕もありたせん。



Qmongooseはリク゚ストごずに1぀のOSスレッドを䜿甚するためですか



Yaroslavはい。実際、2500スレッドも解決策ではありたせん。 圌らは倧量のメモリを消費し、再び、2501番目のリク゚ストが衚瀺されたす-そしおこんにちは...



圌はさらに深く掘り始め、microhttpdずlibeventを芋぀けたした。 パフォヌマンスの点では、G-WANず比范するず、芋た目が青癜く芋えたした。 このすべおを扱っお゜ヌスを詳しく調べおいたずきに、Webサヌバヌの䜜成はそれほど難しくないこずに気付きたした。 たずえば、mongooseでは、HTTP応答党䜓をモゞュヌル開発者に手動で曞き蟌む必芁がありたす。



libeventは最も有望であるが、シングルスレッドに芋えたした。 libevlibeventの軜量の代替に察しおも同じこずをやり盎すこずにしたした。 それでnxwebが生たれたした。 䞻な最初の目暙は、フル機胜のサヌバヌではなく、C Webアプリケヌションです。 すでにCで䜕かを開発しおいる堎合は、それを非垞に高速に動䜜させたいのです。぀たり、プラットフォヌムも高速でなければなりたせん。 そしお、あなたはマングヌスの䞋で曞きたす、そしお、圌が詊みたもののために、圌がブレヌキですべおをリリヌスするかどうか疑問に思うでしょう。



誰ずも競争する぀もりはありたせんでした。 速床の暙準に関しおは、G-WANに近づきたかったのです。 しかし、プロゞェクトが公開されるずすぐに、すぐに手玙が流れたした。 圌らは皆私を芋぀め始めたした。 そのため、G-WANを远い抜くには、さらに数日を費やさなければなりたせんでした。



私は圌を远い抜いたかどうか、ただ明確ではありたせん。 私のコンピュヌタヌでは、圌を远い越したした。 圌らが蚀うように、その領域で。 繰り返したすが、おそらくすべおのモヌドではありたせん。



ちなみに、nginxは非垞に喜んでいたした。 HTTPスタックの速床は、G-WANの速床よりも高速です正しく構成されおいる堎合はもちろん。 リク゚ストされおいない堎合、nginxはメモリ内のファむルをキャッシュしたせん。 䞀般的にnginxず競合する意味はありたせん。 このような機胜的なサヌバヌがどのように高速を提䟛するかは驚くべきこずです。 ここで、strcatの代わりにsprintfを基本的に䜿甚するず、1秒あたり5〜1䞇リク゚ストでパフォヌマンスを発揮できるず確信したした。 ぀たり 䜙分なCPU呜什ごずにすでに戊いは終わっおいたす。



Qそれでは、nxwebアヌキテクチャに぀いお簡単に説明しおください。



Yaroslavメむンスレッドは゜ケットをリッスンし、着信接続をネットワヌクフロヌにプッシュしたす各スレッドはミュヌテックスを避けるために独自の順番を持っおいたす。 ネットワヌクストリヌムプロセッサコアで䞀床に1぀ず぀実行するのが理にかなっおいたすは、HTTPプロトコルを提䟛したす。 リク゚ストをデコヌドし、ハンドラヌモゞュヌルに枡したす。 ワヌカヌはオプションであり、ネットワヌクフロヌを停止しないように、䜎速ハンドラヌのみをサポヌトするように蚭蚈されおいたす。



これで、モゞュヌルにはコヌルバックがあり、メむンルヌプに入る前にサヌバヌによっお呌び出されたす。 削陀たたは眮換できるmain.cファむルもありたす。 その機胜はサヌビスのみです。ログファむルを開き、_nxweb_mainに制埡を転送したす。 圌はたた、悪魔を発射する方法を知っおいたす。 ダブル1぀の悪魔が、2番目のnxwebが実際にスピンするが停止しないこずを保蚌したす。 内郚デヌモンがクラッシュした堎合、最初のデヌモンが自動的に再起動したす。 必芁に応じお、main.cを他のものに眮き換えるこずができたす。 最も重芁なこずは、_nxweb_mainを呌び出すこずです。



Q各ネットワヌクストリヌムがルヌプを受け入れないのはなぜですか その埌、OSは接続を分散できるようになり、異なるカヌネルで耇数の受け入れを䞊行しお行うこずができたす。



Yaroslav䞡方のオプションを詊したした。 メむンの参加なしでネットワヌクフロヌを受け入れたす。 速床の違いは芋圓たりたせんでしたが、単䞀のアクセプタヌに戻りたした。これにより、接続゚ラヌの割合が枛少するように思えたした。 nginxずG-WANを䜿甚するず、接続の䞀郚がフリヌズし、負荷がかかりたせん。 ベンチマヌクペヌゞで実際の同時実行性に関するコメントを参照しおください。



Qなるほど。 最初のバヌゞョンではlibevを䜿甚しおいたしたが、今ではwikiはlibevに䟝存しないず述べおいたす。 䜕が倉わった



ダロスラノ私はリベフを曞きたした。 これがたさに「G-WANを远い越すために息を吹きかける」ずいう意味です。 私のニヌズのために投獄されおおり、独立したプロゞェクトではありたせん。 蚀い換えれば、私は珟圚epollを盎接操䜜しおいたす。 nxwebは完党に移怍性がありたせん。 Linuxでのみ動䜜し、カヌネル> = 2.6.22でも動䜜したす。 Edge-Triggered epollを䜿甚しおいたすが、libevはその䞍耐性のためサポヌトしおいたせん。 はい、libevは非垞にクヌルなものです。私はそれをやめたすが、人々はそれをより速く望んでいたした。 それは苊しむ必芁がありたした。



Q゚ッゞトリガヌは最埌のゲむンでしたか



ダロスラフそれだけではありたせん。 たた、コヌドを䜜成する必芁がありたした。 特に、sprintf、新しいメモリバックアップシステムなどを陀倖したす。 これらすべおをlibevに戻すずいう考えがありたす。 悪くはないかもしれたせんが、行くかどうかはわかりたせん。 移怍可胜なコヌドを䜜成する必芁はありたせん。 ホスティングはほずんどの堎合Linux䞊で行われたす。 たた、libevは、nxwebをビルドするためにむンストヌルする必芁がある远加の䟝存関係です。 マむナスも。



QIgor Sysoevずlibevの著者は、epollには倚くの問題があるず䞻匵しおいたす。 ただ出䌚ったこずがありたすか



Yaroslav珟代のコアのこれらの問題がすでにクリヌンアップされおいるこずを期埅しおいたす。 それでも、䜕幎も経ちたした。 2.6.32および3.0.0でテストしおいたすが、問題は発生しおいたせん。



Qメモリのバックアップはどうですか シスコルを少なくするために、ある皮の倧きなプヌルを割り圓おおいたすか



Yaroslav接続甚のフリヌリストず、応答を生成するための独自のobstack察応物。



QHTTPパヌサヌの独自の実装を䜿甚しおいたすか、たたは䜕か準備ができおいたすか



Yaroslav独自の実装。 もちろん、HTTPプロトコルのすべおのニュアンスを完党にサポヌトしおいるわけではありたせん。 たずえば、私は100-continueたたはchunked-encodingを持っおいたす。 繰り返したすが、茞送統蚈はモゞュヌルの仕事です。 カヌネルは芁求を解析し、ハンドラヌを呌び出し、応答を受信し、HTTPでラップしお、クラむアントに送信したす。 ぀たり ETagずRangeはすべおそこにありたす-これはモゞュヌルのタスクです。 珟圚、sendfile.cモゞュヌルはメむンヘッダヌのみを生成したすが、おそらくRangeずIf-Modified-Sinceをすぐにサポヌトするでしょう。



はい、おそらく゚ラヌをチェックする既補のパヌサヌがありたす。 しかし、䞀方で、私自身のパヌサヌでは、他の誰かよりも、圌らがそれに぀いお私に蚀った堎合、私はより迅速に゚ラヌをキャッチしたす。 ここでは、実際に費甚はCPU呜什に費やされたす。 たた、パヌサヌのすべおの独立したプロゞェクトは非垞に包括的であるため、パヌサヌのパフォヌマンスに疑問の䜙地はありたせん。



Q䞀方、nginx以倖には戊闘サヌバヌの倖郚ポヌトをリッスンさせたせん。 そしおその埌、すべおの䞍正なリク゚ストはすでにフィルタリングされおいたす。



Yaroslav珟時点バヌゞョン2.0では、nxwebは公開する準備ができおいたせん。 ほずんどの堎合、実際のアプリケヌションはCスクリプトで構成されおいるだけではありたせん。 Javaずstaticの䞡方ずその他すべおを結び付ける必芁がありたす。 チャットの実装に関しおは、䜕千もの同時接続を維持するこずが重芁です。



QCにはナヌザヌランドスレッドを䜜成するラむブラリがいく぀かありたすが、そのうちの1぀はmongrel2で䜿甚されるlibtaskです。 各コルヌチンには独自のスタックがあるため、ラむブラリにはスタックを切り替えるための耇数のアセンブラヌ呜什が含たれおいたす。 これにより、on_request、on_successなどのコヌルバックなしで通垞のシリアルコヌドを蚘述できたす。



Yaroslavはい、コルヌチンに぀いお聞いたこずがありたす。 ただし、コヌルバックですべおをすでに蚘述しおいる堎合、コルヌチンに切り替えおもパフォヌマンスは向䞊したせん。 䜙分なメモリのみがスタックのストレヌゞに入りたす。 はい、そしおgdbの問題-たた、最も快適ではありたせん。 それは奜みず習慣の問題です。 コルヌチンに慣れる必芁がありたす。 これは特別な抂念です。



Qリク゚スト/レスポンスだけでなく、たずえば、途䞭でスリヌプしたり、デヌタベヌスにアクセスしたいずきに、ハンドラヌのコヌドをサポヌトするこずで倧きなメリットが埗られたす。 もちろん、単玔なバナヌのひねりのために、それらには意味がありたせん。



Yaroslavスリップむンず基地に行くために-それが私が劎働者に提䟛したものです。 そしお最初のものをチェックしたした。 100人のワヌカヌが構成され、各ワヌカヌが1秒間スリヌプするず、サヌバヌは1秒あたり100リク゚ストをスムヌズに、ためらうこずなく凊理したす。 G-WANもnginxもこれを凊理できたせん。 圌らは毎秒3-4のリク゚ストを発行するか、愚かにハングしたす。



ただし、緊急にベヌスにアクセスする必芁がある堎合は、この目的のために非ブロッキングアダプタを䜜成できたす。 サヌブレットからの呌び出しが1぀ありたす-デヌタベヌス芁求をキュヌに入れ、コヌルバックを登録したす。 この埩垰埌、コヌルバックは匕き続き機胜したす。 原則ずしお、ここでは、執筆の䟿宜䞊、コルヌチンに぀いお考えるこずができたす。



Qnxwebの珟圚のステヌタスをどのように説明したすか 安定性、間違い



ダロスラノさお、私はすでにかなりのトラフィックのあるサむトのバック゚ンドずしおそれを台無しにしたした。 生産開始。 1回の再起動/倱敗ではなく、1か月が経過したした。 バック゚ンドは火の最も厳しい掗瀌ではありたせんが。



ステヌタスはアルファだず思いたす。 特に、nxwebのすべおの機胜が完党にテストされおいるわけではありたせん。 たずえば、チャンク化された芁求゚ンコヌド。 テストケヌスでは機胜したすが、䜕がポップアップするかはわかりたせん。 たた、クラむアントの動䜜が正しくない堎合の安定性も䞍明です。 たずえば、゚ラヌのあるリク゚ストは倱敗の原因になりたす。



珟圚の段階ではただ問題がありたす。h-ファむル、デヌタ構造などを積極的に倉曎しおいたす。



Q個人的に、nxwebの朜圚的な開発者ずしお、すべおのリク゚ストの凊理ず、URLの比范、sendfile、ヘッダヌの挿入、Cookieの解析、バック゚ンドぞの転送などの補助機胜の厚いラむブラリこれはモゞュヌルの圢匏で適切ですを完党に制埡する機胜が必芁です。 これは、nxwebでクリティカルセクションをプログラミングするこずを想像する方法です。



ダロスラフこれはほが私のアプロヌチだず蚀わなければなりたせん。 サヌバヌを構成できる基本機胜を䜜成したす。 ただし、䜕らかの構成ファむルの助けを借りずに、Cで構成しおください。 なぜなら、nginxが持぀蚭定の類䌌物を䜜成するこずは非垞に難しい䜜業だからです。



Q次の質問は、ダニの可胜性が高いですが、Windowsサポヌトに぀いおどう思いたすか



ダロスラフ99陀倖。 私は通垞、コヌドの移怍性を冷静に芋おいたす。 実際、nginxの内郚むンタヌフェむスおよびApacheが非垞に混乱しおいるのは、移怍性に関する懞念のためです。 コヌドの移怍性のために、最新のテクノロゞヌを攟棄する必芁がありたす。 今のずころ、私はLinuxのみに集䞭したいず思っおいたす。



QG-WANには、アプリケヌションの自動コンパむルずいうかなり䟿利な機胜がありたす。 もちろん、セキュリティ、コンパむラフラグ、その堎での曎新など、倚くの未解決の質問がありたす。 同じ機胜をnxwebに远加する予定はありたすか



Yaroslavはい、私は圌女が本圓に奜きでした。 しかし、私はただ蚈画しおいたせん。 䜙分なExtra。これは、nxwebを自分のニヌズに完党に䜿い始めるこずに決しお近づきたせん。



Qさお、より差し迫った質問は、nxwebをどのような圢で配垃する予定ですか ゜ヌスツリヌ 図曞通 静的/動的



ダロスラフこれたでのずころ、私がすでに配垃しおいるものだけです。 ゜ヌスをダりンロヌドしおmakeを実行できるオヌプンなリポゞトリ。 珟時点では、プロゞェクトの完党なコンパむルには数秒かかりたす。 図曞通に損害を䞎えるポむントはただ芋圓たりたせん。



QHello Worldアプリケヌションを曞きたいずしたしょう。 私の行動



Yaroslavhello.cはモゞュヌルテンプレヌトです。 さらに、Makefileには、モゞュヌルの接続に関する小さなコメントがありたす。 特別な倉数SRC_MODULESおよびINC_MODULESがありたす。 さらに、modules.cでモゞュヌルぞのリンクを远加する必芁がありたす。



モゞュヌルを䜿甚するプロセスには、特にモゞュヌルがさらに倚い堎合は、䜕らかの方法でより適切に装備する必芁があるこずに同意したす。



モゞュヌルの組織的な開発は次のようになりたす。nxwebをbitbucketでフォヌクするか、nxwebを別の堎所にクロヌンしたす。 そこで開発を行い、コミットするなど。 nxwebを曎新するには、hg pull ... / nxwebを実行したす



Q䜕らかのドキュメント、可胜なモゞュヌルの説明が必芁です。 兞型的な問題を解決する䟋。



Yaroslavhello.cの䟋がある限り、そこから倚くのこずが明らかです。 そしお、残りは゜ヌスコヌドのみです。 bitbucketにはwikiがあり、ドキュメントの䞀郚がありたす。



Q次に-興味のある開発者に連絡する堎所。 ニュヌスレタヌ/フォヌラム。 歎史ず怜玢を含む質問ず回答の堎所。



Yaroslav 先日 、2぀のGoogleグルヌプnxwebずnxweb-ruを䜜成したした。



Q安定バヌゞョンはい぀APIをフリヌズしたすか



ダロスラノああ、わからない... APIの凍結はもうすぐではない。 ただし、モゞュヌルの倉曎の第1バヌゞョンず第2バヌゞョンの間は最小限でした。 サヌバヌの内郚がすべおやり盎されたずいう事実にもかかわらず。



Qこれは良い兆候です。 アプリナヌティリティラむブラリを構築する予定はありたすか 具䜓的には、ロギング、テンプレヌト゚ンゞン、ヘッダヌの操䜜、Cookie。



YaroslavヘッダヌずCookieは既にテヌブルに解析されおおり、名前で取埗できたす。 他に䜕ができるのか分かりたせん。 access_log-ただ必芁ありたせんでした。原則ずしおは耇雑ではありたせんが、䜜業が倧幅に遅くなりたす。 補充されたプロキシ関数で始たるナヌティリティラむブラリ、ず思いたす。



Qアクセスログは必芁ありたせん。アプリケヌションのログが必芁です。



Yaroslavロギングは䞀般的です。 いわゆるerror_log、関数nxweb_log_error ""、...。 各行の埌にフラッシュされたす。



Qさらに、蚈画によるず。 スレッドの数を自動的に構成するこずは玠晎らしいこずです。 ここには2぀の方向がありたす。1起動時に、コアの数を決定し、非垞に倚くのスレッドを配眮したす。2LAが指定された倀を䞋回っおいる間に新しいスレッドを生成したす。



Yaroslav自動蚭定は倧きな問題です。 nxwebは、原則ずしお、再コンパむル以倖の方法でただ構成されおいたせん。 1぀のパラメヌタヌを自動的に構成可胜にするこずは理にかなっおいたすが、わかりたせん。 実際、起動時に自動的に決定された数のスレッドを簡単に起動できたす。 実行可胜ですが、プロセス内のスレッドを開始たたは停止するこずはもう少し困難です。



実甚的な目的のために、私はただプロキシの実装を芋おいたす。 䞻にJavaで。 これが私が取り組んでいるものです。 次に-SSL、マネヌゞドキャッシング。 デヌタベヌスぞのむンタヌフェヌスかもしれたせん。



これで、リク゚ストずレスポンスは完党にバッファリングされたした。 これは、䞀郚のタスクたずえば、ファむルのアップロヌドに悪い堎合がありたす。 したがっお、郚分的に受信したデヌタハンドラヌの抂念をモゞュヌルに導入し、デヌタを郚分的に送信するこずを考えおいたす。



Qnginxができるように、プロキシずSSL。 nxwebを倖に眮かないでください。



Yaroslav倖に出さないず、速床の利点がすべお倱われたす。 昚日、nginxの背埌でnxwebをテストしたした1秒あたり25kリク゚スト。 圌は16䞇を䞎え、nginxは13䞇を䞎えるこずができるずいう事実にもかかわらず。 これは、バック゚ンドのキヌプアラむブを持たないnginx 1.0の珟圚の安定バヌゞョン甚です。 バヌゞョン1.1では、1秒あたり5䞇件のク゚リを取埗したす。はるかに高速ですが、3倍以䞊の速床䜎䞋がありたす。



Qnxwebのナヌスケヌスは、ニヌズの異なる2぀の倧きなカテゎリに分けられるようです。





Yaroslavnxwebの新しいバヌゞョンでは、新しいナヌスケヌスもあるず思いたす。



All Articles