Node.js用のRaspberry Piの構成


15

単一ページWebアプリケーションの本を読んで、考えさせられた段落に来ました。

Node.jsは、非ブロッキングでイベント駆動型です。簡単に言えば、これは現代のSPAで非常に望ましい機能であるリアルタイムメッセージングで使用される接続など、控えめなハードウェア上の単一のNode.jsインスタンスが数万または数十万の同時オープン接続を処理できることを意味ます。

Raspberry PiをRailsサーバーとして使用する場合に気づいたので、Node.jsについてはどうですか?

Node.jsアプリケーションを提供するためにRaspberry Piをセットアップするにはどうすればよいですか?
誰か試してみましたか?ヒントとコツはありますか?


編集:誤解やトピック外を避けるために、Node.jsコンテキストでRaspberry Piに焦点を当ててください。

  1. Raspberry PiはNodeアプリケーションにどの程度適していますか?
  2. その場合、最良の結果を得るためにラズベリーパイをどのように微調整できますか?

この本はすべてシングルページアプリケーションに関するものなので、node.jsはそこに登場する必要がありました。はい、ノードですべてを提供することが可能です。しかし、私は今までそれは非常に複雑で非友好的な取得することができますどのような生産環境に行われます疑う
ピョートル・クラ

混乱を避けるために2つの特定の質問をするように回答を更新し、node.jsをインストールするための回答をマークする方法は奇妙です-これは質問ではありませんか?最初の質問は、それを設定する方法とアドバイスでした。なぜ私も気にしましたか。LOL :)
ピョートルクラ

1
選択が行われたとき、あなたはまだ編集していたように見えます。回答の選択は回答と同じように編集できるため、指摘していただきありがとうございます。:)
マリウス・ブトゥック

回答:


14

Raspberry PiでNode.jsを取得する

次のいずれかを実行できます。

  1. Node.jsを自分でコンパイルしますppumkinが既に指摘したように — Raspberry Piで約2時間かかります。
  2. または、バイナリv0.8.17をダウンロードできます

性能

簡単なパフォーマンステストを行いました(大まかな第一印象を与えるため)。

  1. Raspberry Piはデフォルトのmemory_split(64)でオーバークロックされています(ターボ)

  2. テストはローカルネットワーク(802.11g Wifi)で実行されました。

  3. Node.js Webサイトの標準の「Hello World」の例を使用しました。

    var http = require('http');
    http.createServer(function (req, res) {
      res.writeHead(200, {'Content-Type': 'text/plain'});
      res.end('Hello World\n');
    }).listen(1337, '127.0.0.1');
    console.log('Server running at http://127.0.0.1:1337/');
  4. Apacheベンチ設定: ab -r -n 10000 -c 100 http://192.168.0.116:1337/

したがって、これらのテストは、通常のWebアプリケーション(ネットワーク接続と転送されたコンテンツの長さ/複雑さの両方)を代表するものではありません

結果

Server Software:        node.js/0.8.17
Server Hostname:        192.168.0.116
Server Port:            1337

Document Path:          /
Document Length:        12 bytes

Concurrency Level:      100
Time taken for tests:   53.824 seconds
Complete requests:      10000
Failed requests:        0
Write errors:           0
Total transferred:      1130791 bytes
HTML transferred:       120084 bytes
Requests per second:    185.79 [#/sec] (mean)
Time per request:       538.238 [ms] (mean)
Time per request:       5.382 [ms] (mean, across all concurrent requests)
Transfer rate:          20.52 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        2  178 405.2     40    4975
Processing:     7  342 1136.4     50   31533
Waiting:        6  274 1047.6     48   31533
Total:         11  520 1238.7     94   31581

Percentage of the requests served within a certain time (ms)
  50%     94
  66%    112
  75%    303
  80%    714
  90%   1491
  95%   2499
  98%   3722
  99%   5040
 100%  31581 (longest request)

比較のために、Raspberry Piにもnginxをインストールし、デフォルトの「Welcome to nginx!」で同じテストを実行しました。HTMLファイル:

Server Software:        nginx/1.2.1
Server Hostname:        192.168.0.116
Server Port:            80

Document Path:          /
Document Length:        151 bytes

Concurrency Level:      100
Time taken for tests:   46.959 seconds
Complete requests:      10000
Failed requests:        0
Write errors:           0
Total transferred:      3610361 bytes
HTML transferred:       1510151 bytes
Requests per second:    212.95 [#/sec] (mean)
Time per request:       469.590 [ms] (mean)
Time per request:       4.696 [ms] (mean, across all concurrent requests)
Transfer rate:          75.08 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        2  162 407.8     40    4999
Processing:     5  256 979.8     45   29130
Waiting:        5  256 979.8     45   29130
Total:         32  418 1078.6     88   30477

Percentage of the requests served within a certain time (ms)
  50%     88
  66%     97
  75%    105
  80%    258
  90%   1064
  95%   2382
  98%   3412
  99%   4145
 100%  30477 (longest request)

Raspberry Pi設定の最適化

raspi-config次の設定を変更するために使用します。

  1. GPUのmemory_splitを16(最小値)に設定します
  2. オーバークロックモードを「ターボ」に設定して、RAM / CPU設定を最速にします

9

Webサーバー

Node.JS PiのWebサーバーの代替として使用でき、スタンドアロンまたは単一ページのWebアプリケーションを簡単に作成できます。

しかし、あなたの情報だけのために、ほとんどの現実世界のアプリケーションでは、モダンnginxで軽量、lighttpdまたはチャンキーだがフル機能のサーバーを使用することをお勧めしますapache2!次に、node.jsをスクリプト化してサイトを補完します。

明らかに、可能性は無限であり、すべてはあなたが達成したいものに依存します。

ラズベリーパイ?

Raspberry Piは、これらのWebサーバーを実行できます。また、深刻な合併症なしでNodeを実行でき、複雑な調整なしで非常に高速です。

Raspberry Piは非常に優れた機能を備えていますが、メモリ分割を最小限のグラフィックスとほとんどのRAM に切り替えることをお勧めします。IDEの使用を忘れて、すべてをSSH経由で行うだけです。本当にもっとジュースが必要な場合は、BCMチップにヒートシンクを置き、安全だと感じたらオーバークロックします。別のオプションは、複数のPiをクラスターとして使用して負荷分散を支援することです。クラスタリングについて、ここから掘り始めることができます。

しかし、本当にnode.jsを使用する必要がありますか?

Node.JSは、小さなデータチャンクをDBに保存、キャッシュ、または最小限のサーバーオーバーヘッドでリードバックする必要がある数百、数千のリクエストを取得する(または予想する)ときに使用することを目的としていました。したがって、クライアントでJSを使用してドライブしますがNode.JS、実際にはC / C ++によってドライブされます。それでは、カスタムモジュールまたは基本コードの特定の変更が必要な場合はどうなりますか?

Webページを提供するアプリケーションでは、node.jsは通常、たとえば単一のリクエストでApacheを上回ることはありません。node.jsの非ブロック機能は、1日のほとんどの間に1秒あたり数千のリクエストがある場合に最適です。これは、apacheがブロックしてクラッシュする場所です。

実世界の例

Ebay-オークション中、最後の30秒間のカウントダウンがある場合。ページを精力的に更新し、入札単価を引き上げるのに使用した複数のユーザーを含めることができます。node.jsが優れているのは、今日はこれ以上リフレッシュする必要がないためです。これは、JSがすべてのクライアントから頻繁に(300ミリ秒から600ミリ秒)node.jsにアジャックスし、「実際のオークション」エクスペリエンスを提供できるためです。Ebayはnode.jsだけで実行されるのではなく、非常に複雑な負荷分散されたサーバーファームで実行されます。

Pi *でNode.jsをビルドしてインストールするには:

明らかに、他のノードの代わりにnode.jsを使用しても何も問題はありません。Piのようなきちんとした小さなデバイスでノードを学習するのに最適な方法です。したがって、このように自分でコードをコンパイルできます。

$ sudo apt-get install git-core build-essential libssl-dev 
$ mkdir ~/nodeDL && cd ~/nodeDL 
$ git clone https://github.com/joyent/node.git
$ git checkout v0.6.15 (to checkout the most recent stable version at time of writing)

更新:ノードの最新バージョン(現在のバージョンはv0.8.18)は、以下の特別な手順なしでビルドできます

次にarmv6、コンパイルにアーキテクチャを使用するようコンパイラーに指示する必要があります。

$ export CCFLAGS='-march=armv6'
$ export CXXFLAGS='-march=armv6'
and then edit deps/v8/SConstruct around the line 82 mark, to add “-march=armv6”:
'all': {
   'CCFLAGS':      ['$DIALECTFLAGS', '$WARNINGFLAGS', '-march=armv6'],
   'CXXFLAGS':     ['-fno-rtti', '-fno-exceptions', '-march=armv6'],
 },

次に、157マーク付近から始まる行をコメントアウトして、vfp3とシミュレーターのパーツを削除します。これはJSONのようなオブジェクトなので、CPPDEFINES行のコンマを忘れずに削除してください!

'armeabi:softfp' : {
   'CPPDEFINES' : ['USE_EABI_HARDFLOAT=0']
  # 'vfp3:on': {
  #   'CPPDEFINES' : ['CAN_USE_VFP_INSTRUCTIONS']
  # },
  # 'simulator:none': {
  #   'CCFLAGS':     ['-mfloat-abi=softfp'],
  # }
 },

次に、通常のconfigure、make、make installプロセス、NB OpenSSL libpathの場所を手動で指定する必要がありました。

$ ./configure --openssl-libpath=/usr/lib/ssl 
$ make (to compile node (This took 103 minutes!))
$ sudo make install 

これで、Node.JSが正常にインストールされました!

$ node -v should show you the version number
$ npm -v should show you the version of the Node Package Manager

*参考文献と元の記事

しかし、他の回答で指摘されているように、機能するプリコンパイル済みバイナリをダウンロードするだけです。

結論

Piの良い部分は悪くありません。Piで何でも実行できます。ただ、生産レベルのパフォーマンスを期待しないでください。


2
まあ...あなたはおそらく、Node.jsをNginxなどの追加の「フロントエンド」Webサーバーと組み合わせたいと思うという点で正しいです。しかし、「C / C ++開発者が必要です」とはどういう意味ですか?Node.jsコアで作業したり、プラットフォーム依存のモジュールを作成したりしない限り、C / C ++はまったく必要ありません。一般的なNode.jsアプリ開発者にはJavaScriptで十分です。どこで間違ったの?
ゴロローデン

つまり、node.jsはC / C ++で記述されているということだけでした。node.jsを調査していたときに、ライブラリを拡張する方法を示す多くのサイトに出会いました。しかし、それにはC / C ++の純粋な知識が必要でした-ほとんどの目的では必要ありません-しかし、そのような状況に陥った場合、node.jsは間違ったソリューションです。たまたま私の場合はそうでした。
ピョートルクラ

私の質問は、Raspberry Piに焦点を当てたものです--- Raspberry PiはNodeアプリケーションにどの程度適していますか その場合、最良の結果を得るためにどのようにRPiを微調整できますか?--- Node-focusedではありません --- Nodeはどれくらい良いですか?しかし、あなたの意見をありがとう。最初の質問を編集して、より明確にします。
マリウスブトゥック

うん私は質問1に答えました-Piはnode.jsとフルLAMPスタックも処理できます!微調整する方法は?それは議論の余地があります。どのパラメーターを微調整するか、より具体的にしてください。また、パフォーマンスに役立つと感じるものについても拡張しました。
ピョートルクラ

1
2つの答えをこの1つにマージする場合、私は賛成します。
Jivings

1

Q:Raspberry PiはNodeアプリケーションにどの程度適していますか?

A:非常に適しています:)それについては間違いありません。

Q:その場合、最良の結果を得るためにRaspberry Piをどのように微調整できますか?

A:しないでください!非常に適切に設計されたノードアプリケーションの作成に焦点を当てます。アプリケーションのスクリプトを最適化する方法があります。

Node.JSはまだ幼年期(Apacheと比較して)であるため、常にnginexなどのプロキシサーバーを使用してください。したがって、まだ発見すべき安全上の問題があると想定できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.