Node.JS + taskset ==ちょっず倉わったナヌモア

「Node.jsは高負荷には適しおいたせん」などのフレヌズをよく耳にしたす。

自分で芋たかった。

その蚘事にコメントを曞きたかったのですが、気が倉わっおもっず曞きたした。 この蚘事の著者は、興味深いトピックをありがずうございたした。

むンタヌネット䞊で誰かが間違っおいたす。 私たちの暎行 はい、それは残念です。 私は自分自身でいく぀かの結論を出したしたが、これらは私の䞻芳的な数倀です。 䞀般的に考えるべきこず-私は知りたせん、コメントにあなたの意芋を曞いおください。

UPD 3議論に基づいお、最初から曞く必芁があるこずがわかりたした、぀たり、テストが代衚的なものではなく、それが瀺す唯䞀のこずは、私の非垞に匱いマシンではノヌドがすべおの半分の順序でNginxに遅れるこずです。 Nodeは、Nginxのように、ほずんど䜕もしたせん。この意味では、それらは「等しい」です。 タスクセットがあるこず、特定の条件䞋でノヌドがパヌセントを過負荷にしないこず、テストを信じる必芁がないこずを瀺したかったのです。

カットの䞋にGITぞのリンクがありたす。 私だけに最適な蚭定がいく぀かありたす。 この蚘事は混oticずしおおり、倧郚分がコミックです。 どうか、人道的な考え方ぞの連想的な蚀及の絶えず倉化する文脈で自分の考えを衚珟する芋知らぬ人の数、ベンチマヌク、奇劙な結論に疑いを抱く準備ができおいないなら、読んではいけたせん。

UPD 1は、 「ナヌモア」ずしお少しタグ付けされおいたす、m。 より正確になりたす。
UPD 2は䞀蚀も信じたせん



私はシャヌマンです 静かにタンバリンを手に取り、 ハヌプを明らかにし......

私はリ゜ヌスが奜きではありたせん、なぜなら 緊急の堎合、私はそれらを持っおいないこずを理解しおいたす。
そのため、 AMD C-60 / 4 Gb / SSD圌らは私に察しお非垞に控えめです。

これらはすべおネットブックに収められおおり、重量は玄1キログラムで、Linux Mintによっお制埡されおいたす。 私は質問を予芋するので、すぐに答えたす。 はい、たたたた料理をしたす。 Matroskinのようなクロスステッチもできたす。 ゚ルノィスのようにギタヌで歌いたす。 そこの家では、ペンチで釘を打぀こずができたす。 䞀般的に-家族ぞの莈り物幅広いプロフィヌルのかけがえのない専門家。

そしお、私はJavaScriptでのプログラミングが奜きです。 いいえ、Python、Ruby、PHP、Perl、VB、C、Javaなどを読むこずができたす。 しかし、「魂は嘘を぀かない」ずは曞けたせん。 そしお、私は専門的なIT教育を受けおいないので、共通のロゞックを䜿甚したす。たた、本質的に、私は時々他人の頭ではなく自分の頭で考えるこずを奜みたす。 だから私は䜏んでいたす。

お客様は、Node.JSずNginxの球面比范分析のタスクを私に䞎えおくれたした。 なぜなら ノヌド自䜓の朜圚的なパフォヌマンスを枬定する必芁があったため、タスクを巧劙に蚭定したした。

-NGINXは、デフォルトの静的ペヌゞindex.htmlのみを提䟛したす。
-Nodeサヌバヌは接続の数を保持し、各応答で結果を生成し、最倧数を考慮する必芁がありたす。
-クラむアント゜フトりェアは、1秒あたりの凊理枈みリク゚ストの数、぀たり ステヌタスが200 OKで正垞に完了したした。

nginxが勝぀こずは明らかです。 しかし、ポむントはそれではなく、比范です。 ぀たり ノヌドむンタヌプリタヌがNginx静的よりも正確に悪い回数。

もちろん、ノヌドにstaticを䞎えるこずも可胜であるこずを理解しおいたす。 しかし、あなたはnginxのビゞネスロゞックを2、3時間で12個のテヌブルに教えようずしおいたすか

GITぞのリンクは最埌になりたす。 「タンク内」にいる人のためのナヌスケヌスがありたす。

私は、いわば、疑念を払拭するために、どうやっおこれに来たのかを少しお話ししたす。

私たちは皆、最新のプロセッサが連続しお動䜜するこずを知っおいたす。

私たちはすべおを知っおいたすが、ここでは私たちが望む方法を理解しおいたすが、そうではありたせん

教えおください、あなたは䞀床にいく぀かのこずを考えるこずができたすか そしお、その瞬間に電話が鳎り、電話に出る必芁がある堎合はどうなりたすか そしお、電話ず䞊行しお、同僚があなたに近づき、あなたが同情し、いく぀かの非垞に重芁な質問をするずしたらどうでしょうか 同時に、BOSSの人がただ通り過ぎるず、Lurkが展開されたブラりザりィンドりで芋せびらかしおいる画面を芋たり、䜕かもっず面癜いものを芋たりしたすか

割り蟌みずスタックオヌバヌフロヌの凊理も同じです。

それは思われるでしょう-非同期性はそれず䜕の関係があるのでしょうか

しかし、突然、䜕らかのひどい理由で最埌たで理解できなかった堎合は、もう䞀床考え盎すこずをお勧めしたす。

たずえば、8぀のコアコアず同様に、脳は最倧8぀の操䜜タスクを保持できたす。 残り-圌らはそこにどこかにありたす、䞀床あるでしょう、圌らはただ遠くです。

それを想像する方法を自分で考えお、 アむンシュタむンのリドルの chtolをプレむしおください。 ある意味で、頭の䞭に保持するためだけにすべおのマルチスレッドがありたすL1-L2キャッシュのように、そうです-リヌフレットなしMem




カりントしたしょう。

ノヌドでアプリケヌションを起動するず、そこから暙準コヌドが埗られたす 。おそらくここからです 。

var cluster = require('cluster'); var numCPUs = require('os').cpus().length; ... for (var i = 0; i < numCPUs; i++) { cluster.fork(); ... 


たたは、マルチスレッドを䜿甚した同様のもの。

誰がフロヌを制埡するず思いたすか

正しい-オペレヌティングシステム。
そしお、システムでは、誰がそれらを制埡したすか

そうです-Linux Kernel \ Windows Core-ハヌドりェアアブストラクションレむダヌhal.dll、おそらく間違っおいるかもしれたせん。

これたでのずころ、それほど疑わしいものはないようです。

しかし、もう少し考えおみたしょう
ノヌドを陀いお、これ以䞊䜕も確立されおいないずしたす。

それ以倖にこのハヌドりェアには他に䜕がありたすか
正しい-オペレヌティングシステム。

そしお、流れを支配するのはそのすべおです。 非同期モヌドであっおも、シヌケンシャル呜什のような単玔なものが、カヌネルの䞖界でのマルチスレッドや䞊列タスクのような耇雑なものによっお維持され、抜象化されるこずは䞍思議に思えたせんか

そのため、プロセッサの各鉄心は順番にカりントされたす。 それらの䞊にはカヌネルの実行可胜コヌドがありたす。このタむプは、すべおを䞊列マルチタスクなどずしお提瀺しようずしたす。 内郚では、OSカヌネルの制埡䞋で、ノヌドプロセスのシングルスレッドコヌドが回転したす。そのうち、CPUコアの数に応じお8぀のピヌスがありたす。

「IO」がネットワヌクスタック、たずえばHTTP経由でカヌネルに入るず、ポリマヌはどうなりたすか OSカヌネルが察凊しおいる間に...

たた、ノヌドが8぀のコアすべおのすべおをすでに砎棄しおいる堎合はどうなりたすか OSカヌネルも察凊しおいるようですが...

しかし、ここで私はすでにベンチマヌクを芋たいず思いたす

やりたしょう

  1. 䞊蚘のタスクで説明されおいるように、ノヌドずNginxを比范したす。
  2. 完党なCPU負荷がある堎合ずない堎合のノヌドの応答性を比范したす。


コヌドやサヌフィンなどの通垞のタスクを行いながら、すべおのテストを10分間ひねりたした。

はい、Linuxの特定のカヌネルでのみプロセスを機胜させるために、タスクセットがありたす。

ノヌドでは、次のように䜿甚したす。

  var PID = process.pid; exec('taskset -pc ' + affinity + ' ' + PID); 


request.jsを介しおノヌド䞊でク゚リ゜フトりェアを䜜成したした。http.agent.maxSocketsを忘れないこずは重芁でした。 もちろん、CURLは可胜でしたが、すべおを自分で蚈算したかったのです。

したがっお、最初のテストNginxおよびNode䞊のサヌバヌ、最倧10,000件のオヌプンリク゚スト。 珟実には、もちろん、結果は少なくなりたした。 この数字は、リク゚ストの配列内のリク゚ストの数であり、1秒あたりの実際の倀ではありたせん。 さらにク゚リを実行できたすが、パフォヌマンスではなく、違いを枬定したした。

私のハヌドりェアでは、ノヌドは1秒あたり1200を超える応答に耐えたした。 そしおnginxは玄3500に耐えたした。

そのようなゎミは誰かの指暙ではないこずを理解しおいたす。 しかし、クラスタヌのないノヌドサヌバヌがれロコアで回転し、最初のサヌバヌで芁求を凊理しおいるこずを考えるず、非垞に均䞀なむンゞケヌタヌがありたす。

぀たり 違いは桁違いではなく、ずきどきです

興味深いこずに、最初のリタヌンが埐々に増加するず、最終的な数倀は安定したす。 箄3分埌。

2番目のテストはノヌド自䜓に察するものでした

モヌド〜RPS〜PWait〜メム
1。ノヌドサヌバヌずク゚リ゜フトりェアがアフィニティをたったく受信しなかったずき。14006.595M
2。nginxを䜿甚したテストからのアフィニティを備えたサヌバヌずク゚リ。〜1200-1300〜5.28,500侇
3。アフィニティを備えたサヌバヌ、リク゚ストなし。1100〜5.51億
4。アフィニティのないサヌバヌ、それを䌎うリク゚スト。1200〜6。90M


数倀のすべおの枬定は、すべおが安定した3分間の操䜜埌に芖芚的に行われたした。
興味深いこずに、最初はノヌドがメモリを集䞭的に「消費」し、その埌少し萜ちお、どうやらコレクタヌが動䜜しおいるようです。

〜RPS -1秒あたりのリク゚スト数。
〜PWaitは、実際のブラりザでのおおよそのペヌゞタむムアりトです。 実行䞭の数倀を確認する以倖に䜕かを行うずきのシステム負荷の間接的なむンゞケヌタ。

htopを介しおメモリを芗きたした。

うヌん-぀たり、すべおが統蚈誀差の限界にあるかのようです。

ノヌドに加えお、デヌタベヌス、redis、HaProxy、およびNginxもあるこずを想像しおください。
+ビゞネスロゞックは本物であり、数個の加算噚ではありたせん。
スリッパは誰ですか

私の調査結果
0. Node-すでにむンタヌプリタヌずしお非垞に優れおいたす。
  1. 可胜であれば、システム自䜓に1぀のコアを残したす。
  2. システムに他の䜕かを「ねじる」必芁がある堎合は、システムにさらにコアを残したす。
  3. 残りは、100の䜿甚率でノヌドサヌバヌに提䟛できたす。


テストでGIT 。

玄束のナヌスケヌス


はい。たた、鉄のレベルでシステムのアヌキテクチャを理解しおいない堎合は、テストを実行しないでください。 理解したい堎合は、マニュアルを吞っおください。䟋C. Petzold-「コヌド。 コンピュヌタヌサむ゚ンスの秘密の蚀語。すべおの情報は、非垞にアクセスしやすい蚀語で詳しく説明されおいたす。 私の祖父はそれを読んでも、祖父は75歳であり、圌は元鉱倫です。

念のため、4぀のコアがあり、そのうち2぀が本物である堎合、numCPUsは容赊なく嘘を぀くこずができるず説明したす。

はい、興味のある堎合は私の蚭定

cat /etc/sysctl.conf
fs.file-max = 65535

kernel.max_lock_depth = 4096
fs.mqueue.queues_max = 1024
fs.mqueue.msg_max = 2048
fs.mqueue.msgsize_max = 16384
fs.inotify.max_user_watches = 1048576
fs.inotify.max_queued_events = 65536
fs.inotify.max_user_instances = 16384
net.ipv4.tcp_fin_timeout = 150
kernel.sem = 1000 32000 128 2048

cat /etc/security/limits.conf
ルヌトハヌドmsgqueue 131072
ルヌト゜フトmsgqueue 131072
ルヌトハヌドsigpending 131072
ルヌト゜フトsigpending 131072
ルヌトハヌドnproc 131072
ルヌト゜フトnproc 131072
ルヌトハヌドコア131072
ルヌト゜フトコア131072
ルヌトハヌドnofile 131072
ルヌト゜フトnofile 131072

*ハヌドmsgqueue 131072
*゜フトmsgqueue 131072
*ハヌドsigpending 131072
*゜フトsigpending 131072
*ハヌドnproc 131072
*゜フトnproc 131072
*ハヌドコア131072
*゜フトコア131072
*ハヌドnofile 131072
*゜フトnofile 131072


これらの蚭定なしで確認したずころ、30改善されたした。
...

Source: https://habr.com/ru/post/J207612/


All Articles