Node Interactive North America 2017に行ってきた & 発表してきた

Node Interactive North America 2017 に行ってきた & 発表してきた

Node Interactive North America に行ってきました。前回は Node Interactive Europe 2016 に参加したのですが、その時の解説も一緒にどうぞ。

yosuke-furukawa.hatenablog.com

Node Interactive North America は North America というだけあって、 Canada Vancouver で開催されてます。来年も同じ場所でやるということでもしも興味あれば参加してください。

会場はここ

f:id:yosuke_furukawa:20171013002437p:plain

Vancouver Convention Centerで、池の側になってる

f:id:yosuke_furukawa:20171015222156p:plain

ちなみに1日目から発表だったので、僕の発表が終わるまで全然聴講者モードになれず、最初の発表は大分聴き逃してる。

My presentation

Node and Learn: How to create a local JavaScript Community

www.youtube.com

JavaScript コミュニティを作るには、という話で大分トークも僕がやってきたここ数年のコミュニティ活動の集大成感があった。

f:id:yosuke_furukawa:20171015230743p:plain

featured presentation

いくつか面白い発表はあったけど、その中でもこれは面白かったという発表を僕の目線で幾つか紹介する。

Take your server to ludicrous speed by mcollina

Slide: Take your HTTP server to Ludicrous Speed

nearForm のエンジニアであり、 Node.js core committer の Matteo Collina の発表。 fastify という Web Application Framework を作った話。

Express よりも速い。

f:id:yosuke_furukawa:20171016094318p:plain

どこを高速にしたのかというとJSON.stringify と router のロジック部分。 JSON.stringify が遅いから自分で JSON Schema を食わせたらスキーマを元に高速に stringify するライブラリを開発したという話。

github.com

さらに router 部分は find-my-way というライブラリを使った。これも既存のrouterよりも高速。

github.com

で、さらに面白かったのは彼の性能改善戦略で、機能開発のたびに 0x と autocannon を使ってボトルネックを特定し、そこをチューニングしていくという戦略だった。それだけではなく、 v8 の JIT killer を倒していくという方法も取っていた。これにより性能改善を機能を損なうことなく入れていくという戦略。言ってみれば Continuous Optimization のお手本とも呼べるような戦略だった。

New DevTools Features for JavaScript by Yang Guo

Slide: https://schd.ws/hosted_files/nina17/97/nina20217yangguo.pdf

新しいChome DevTools の開発で作られた機能の紹介。

カバレッジも取れる。カバレッジがコード変換無しで取れるのは嬉しい。

f:id:yosuke_furukawa:20171016160920p:plain

debugger 起動して途中でinjectionもできる。

f:id:yosuke_furukawa:20171016161111p:plain

ただし、これはv8の新しい機能なので、単純にはできない。

最新のV8をnodejsに適用するプロジェクトがあるのでそれで試すと可能。

github.com

ここに作業したリポジトリがある。

github.com

Understanding and Debugging Memory Leaks in Node.js Application by ofrobots

Slide: 見つからず

www.youtube.com

メモリリークをどうやって見つけるか、という話。

そもそもメモリリークとは "コンピュータプログラムがメモリ割り当てを不正確に管理しているため、不要になったはずのメモリを開放できなくなってしまう事を指す。"

f:id:yosuke_furukawa:20171018071555p:plain

メモリリークメモリリークじゃないもの

ということで、メモリリークを見つけるのは簡単ではない、ただツールはあるのでいくつか紹介する。

f:id:yosuke_furukawa:20171018072932p:plain

JS部分のメモリリークのツールは下記の通り

  • process.memoryUsage
  • Heap Snapshots
  • Allocation Timeline
  • Sampling Heap Profiler
  • V8 Heap Statics

Native Memory Leak に関しては下記のツールがある。

  • Valgrind
  • tcmalloc & Sampling Heap Profiler

System levelだと top, ps, Task Manager 等

新しい v8 の機能を使ったSampling Heap Profiler を紹介する。

f:id:yosuke_furukawa:20171018073756p:plain

これはJavaScript のオブジェクトを標本抽出してデータをトラッキングするもの、全てのメモリを舐める訳じゃないので heapdump よりも本番環境で起きているメモリリークの特定に向く。

npm モジュールもある。

www.npmjs.com

Node.js Technical Roadmap by James

Slide: 見つからず。

www.youtube.com

Node.js のロードマップの話。 実は Node.js には公式のロードマップは存在しない。 Node.js の機能追加は個々のコントリビュータの優先順位付けによって決まる。

f:id:yosuke_furukawa:20171018074459p:plain

ということで今の時点で検討されている機能の話をする。 Profile & Tracing ということで、要は v8 heap profiler などの検証ツールの充実。 V8 や Chrome 互換の高いものを開発することでChromeで検証ができるようにしていき、Chromeが検証ツールになっていく予定。

f:id:yosuke_furukawa:20171018080122p:plain

async_hookも追加された、これはイベントループの中で起きてることをトレースするためのもの。複雑な処理を実施している時にその都度Nodeの内部で何が起きているかをトレースするためのもの。

f:id:yosuke_furukawa:20171018134739p:plain

この他にも言語の特徴としては、 promisify や module が追加されている。 また、 Promise のエラーハンドリング周りも話があった。この他にもWeb Platform周りではWorkerの話も出ている。

ちなみに Worker に関しては ayojs プロジェクトでは既に開発が進んでいる。

github.com

bench mark 結果も書かれており、 cluster よりも速いことが結果として書かれている。Shared Array Bufferでの速度も検証されている。

Worker data transfer benchmarks · GitHub

この辺は実は Node Collaborators Summit でもちょろっと話はあったのだが、Nodeの内部的にはまだやるかどうかきちんとは決まっていないようだ。 Workerをやっているコアコミッターの Anna のやる気次第というところか。

この他にも紹介したい話は多くあったが、書ききれないので割愛、今月末に行われる Node 学園 28時限目で話せたら話します。

まとめ

  • Node Interactive North America に行って、発表してきた。
  • 僕の発表は技術的な発表というよりコミュニティ的な発表
  • 面白かったのは性能面の発表(fastify, v8 profile, memory leaks)
  • Node.js のロードマップ及び今やってることの紹介がされていた。