Raspberry Pi'yi Node.js için yapılandırma


15

Tek Sayfalı Web Uygulamaları üzerine bir kitap okuma Beni düşündüren bir paragrafa geldim:

Node.js engellemez ve olaya dayalıdır. Özetle, bu , mütevazı donanımdaki tek bir Node.js örneğinin , genellikle modern SPA'ların çok istenen bir özelliği olan gerçek zamanlı mesajlaşmada kullanılanlar gibi on binlerce veya yüz binlerce eşzamanlı açık bağlantıyı işleyebileceği anlamına gelir .

Raspberry Pi'yi Rails sunucusu olarak kullanma durumunu fark ettim , bu yüzden Node.js için ne dersiniz?

Raspberry Pi'mi bir Node.js uygulamasına hizmet verecek şekilde nasıl ayarlarım?
Kimse denedi, ipuçları ve püf noktaları, belki gotchas veya dikkate almak için sınırlama var mı?


Düzenleme: Yanlış anlamaları veya konu dışı konuları önlemek için, lütfen Node.js bağlamında Raspberry Pi'ye odaklanalım:

  1. Raspberry Pi, Düğüm uygulamaları için ne kadar uygundur?
  2. Bu durumda, Raspberry Pi en iyi sonuçlar için nasıl ince ayar yapılabilir?

Kitap tamamen Tek sayfa uygulamasıyla ilgili olduğundan, node.js orada bir görünüm oluşturmak zorunda kaldı. Evet, her şeyi düğüm ile sunmak mümkündür. Ama çok karmaşık ve düşmanca olabileceğinden, herhangi bir üretim ortamında yapılacağından şüpheliyim
Piotr Kula

Karışıklığı önlemek için 2 özel soru sormak ve daha sonra node.js'yi yüklemek için bir cevap işaretlemek için cevabınızı nasıl güncellediğiniz gariptir - soru bu değildi? Orijinal soru, nasıl ayarlanacağı ve herhangi bir tavsiye idi. Neden rahatsız bile ettim. LOL :)
Piotr Kula

1
Seçimin ne zaman yapıldığını hala düzenliyorsunuz; cevabı seçmek tıpkı cevaplar gibi düzenlenebilir, bu yüzden belirttiğiniz için teşekkürler. :)
Marius Butuc

Yanıtlar:


14

Bir Ahududu Pi üzerinde Node.js almak

Şunlardan birini yapabilirsiniz:

  1. Node.js'yi kendiniz derleyin ( ppumkin'in işaret ettiği gibi ) - Raspberry Pi'de yaklaşık 2 saat sürer.
  2. Veya ikili v0.8.17 indirebilirsiniz

Verim

Hızlı bir performans testi yaptım (kaba bir ilk izlenim vermek için):

  1. Raspberry Pi cihazım varsayılan bellekle overclock edilmiş (Turbo )_plit (64)

  2. Testler yerel ağım (802.11g Wifi) üzerinden yapıldı.

  3. Node.js web sitesinden standart "Merhaba Dünya" örneğini kullandım:

    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 Bench ayarları: ab -r -n 10000 -c 100 http://192.168.0.116:1337/

Dolayısıyla bu testler normal bir web uygulamasını temsil etmez (hem ağ bağlantısı hem de aktarılan içeriğin uzunluğu / karmaşıklığı ile ilgili).

Sonuçlar

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)

Bir karşılaştırma için, Raspberry Pi'ye de nginx yükledim ve aynı testi varsayılan "nginx'e hoş geldiniz!" HTML dosyası:

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 ayarlarını optimize etme

raspi-configAşağıdaki ayarları değiştirmek için kullanın :

  1. GPU için memory_split değerini 16'ya (en düşük değer) ayarlayın
  2. En hızlı RAM / CPU ayarları için hız aşırtma modunu "Turbo" olarak ayarlayın

9

Web Sunucuları

Node.JS Pi'de web sunucusu değişimi olarak kullanılabilir ve tek başına veya Tek Sayfa web uygulamalarını kolayca oluşturabilirsiniz.

Ancak sadece bilginiz için, çoğu gerçek dünya uygulamasında modern nginx, hafif lighttpdveya tıknaz ama tam özellikli sunucuları kullanmanız önerilir apache2! Ve sonra siteyi tamamlamak için node.js komut dosyasını yazın.

Açıkçası olasılıklar sonsuzdur ve her şey ne elde etmek istediğinize bağlıdır.

Raspberry Pi?

Raspberry Pi bu web sunucularından herhangi birini çalıştırabilir. Ayrıca Node'yi ciddi bir komplikasyon olmadan da çalıştırabilir ve karmaşık bir tweaking olmadan gerçekten hızlıdır.

Raspberry Pi çok yeteneklidir, ancak en iyisi bellek bölünmesini en az grafik ve RAM'e çevirmektir . Bir IDE kullanmayı unutun ve her şeyi SSH ile yapın. Gerçekten daha fazla meyve suyuna ihtiyacınız varsa, BCM çipine bir soğutucu koyun ve kendinizi güvende hissettiğiniz için overclock yapın . Başka bir seçenek, yük dengelemeye yardımcı olmak için birden fazla Pi'yi küme olarak kullanmak olacaktır. Kümeleme hakkında buralarda araştırmaya başlayabilirsiniz.

Ama gerçekten node.js'yi kullanmanız gerekiyor mu?

Node.JSküçük veri yığınlarının DB'de depolanmasını, önbelleğe alınmasını veya minimum sunucu yükü ile yeniden okunmasını gerektiren yüzlerce ve binlerce istek almaya başladığınızda (veya beklediğinizde) kullanılması amaçlanmıştır. Yani istemcide JS kullanarak sürücü ama Node.JSaslında C / C ++ tarafından tahrik edilir. Peki, özel modüle veya temel kodda belirli bir değişikliğe ihtiyacınız varsa ne olur?

Web sayfalarını sunan bir uygulamada node.js genellikle tekli isteklerde apache'den daha iyi performans göstermez. Günün çoğunda saniyede binlerce isteğiniz varsa node.js'nin engelleme yapma özelliği mükemmeldir, burası apache'nin engelleneceği ve çökeceği yerdir.

Gerçek bir dünya örneği

Ebay - Açık artırma sırasında son 30 saniyenin geri sayımını yaptığınızda. Sayfayı güçlü bir şekilde yenilemek ve teklifleri artırmak için kullanılan birkaç kişiye sahip olabilirsiniz. Burası node.js'nin parladığı yerdir, çünkü bugün daha fazla yenilemenize gerek yoktur. Bunun nedeni JS'nin tüm istemcilerden sık sık node.js'ye (300ms ~ 600ms) ajaxes olması ve "gerçek bir açık artırma" deneyimi sunabilmesidir. Ebay yalnızca node.js'den değil, çok karmaşık yük dengeli sunucu çiftliklerinde çalışır.

Pi * üzerine Node.js oluşturmak ve kurmak için:

Açıkçası, diğerleri yerine node.js kullanmak ve Pi gibi düzgün küçük bir cihazda değilse, düğümü öğrenmek için en iyi şey yoktur. Böylece kodu kendiniz bu şekilde derleyebilirsiniz.

$ 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)

güncelleme: düğümün sonraki sürümleri (geçerli sürüm v0.8.18) aşağıdaki özel adımlar olmadan oluşturulabilir

sonra derleyiciye armv6derleme için mimariyi kullanmasını söylemeliyiz :

$ 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'],
 },

Daha sonra vfp3 ve simülatör parçalarını çıkarmak için 157 işaretinden başlayan satırları yorumlayın. Bu JSON benzeri bir nesne olduğundan, CPPDEFINEShatta virgül kaldırmayı unutmayın !

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

Sonra her zaman yapılandırmak, yapmak, yapmak yükleme işlemi, NB Ben OpenSSL libpath konumunu el ile belirtmek zorunda kaldı:

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

Bu, şimdi çalışan bir Düğüm.JS yüklemeniz gerekir!

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

* Kaynaklar ve orijinal makale

Ancak diğer cevaplarda belirtildiği gibi, sadece çalışacak olan önceden derlenmiş bir ikili dosyayı indirebilirsiniz.

Sonuçlar

İyi bir Pi parçası fena değil. Pi'de hemen hemen her şeyi çalıştırabilirsiniz. Sadece üretim düzeyinde performans beklemeyin.


2
Eh ... muhtemelen Node.js'yi Nginx gibi ek bir "ön uç" web sunucusuyla birleştirmek istediğinizde haklısınız. Peki "C / C ++ geliştiricisine ihtiyacınız var" derken neyi kastediyorsunuz? Node.js çekirdeğinde çalışmak veya platforma bağlı modüller yazmak istemediğiniz sürece, C / C ++ 'a ihtiyacınız yoktur. Ortak Node.js uygulama geliştiricisi için JavaScript yeterlidir. Seni nereden yanlış anladım?
Golo Roden

Bununla kastettiğim tek şey node.js'nin C / C ++ ile yazılmış olmasıydı - node.js üzerinde araştırma yaparken kütüphanede nasıl genişleyeceğini gösteren birçok siteye rastladım. Ancak bu, C / C ++ 'da saf bilgi gerektiriyordu - Çoğu amaç için ihtiyacınız olmayacak - Ama böyle bir duruma düştüğünüzde node.js yanlış çözümdür. Benim durumumda olduğu gibi.
Piotr Kula

Sorum Raspberry Pi odaklı --- Raspberry Pi Düğüm uygulamalarına ne kadar uygundur? Bu durumda, en iyi sonuçlar için RPi'ye nasıl ince ayar yapabilirim? --- ve Düğüm odaklı değil --- Düğüm ne kadar iyi veya kötü? Ancak görüşünüz için teşekkürler; Daha net hale getirmek için ilk soruyu düzenleyeceğim.
Marius Butuc

Evet soru 1'i cevapladım. Pi, node.js artı tam bir LAMP yığını da işleyebilir! İnce ayar nasıl yapılır? Bu tartışmaya açık. Lütfen hangi parametreleri ince ayar yapmak istediğinizden daha açık olun. Performans konusunda yardımcı olabileceğimi düşündüm.
Piotr Kula

1
Eğer iki cevabınızı bu cevapla birleştirirseniz oylayacağım.
Jivings

1

S: Raspberry Pi Düğüm uygulamalarına ne kadar uygundur?

C: Çok uygun :) Hiç şüphe yok.

S: Durum buysa, en iyi sonuçlar için Raspberry Pi'ye nasıl ince ayar yapılabilir?

A: Yapma! Çok iyi tasarlanmış düğüm uygulamaları yazmaya odaklanın. Uygulama betiğinizi en iyi duruma getirme yolu budur.

Her zaman sadece bir nedenden ötürü, örneğin bir proxyserver, örneğin nginex kullanın: Düğüm.JS hala çocukluk yıllarında (Apache ile karşılaştırıldığında), bu yüzden hala keşfedilecek güvenlik sorunlarının olduğunu varsayabilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.