Ricerca…


Loop degli eventi

Esempio di operazione di blocco

let loop = (i, max) => {
  while (i < max) i++
  return i
}

// This operation will block Node.js
// Because, it's CPU-bound
// You should be careful about this kind of code
loop(0, 1e+12)

Esempio di operazione IO non bloccante

let i = 0

const step = max => {
  while (i < max) i++
  console.log('i = %d', i)
}

const tick = max => process.nextTick(step, max)

// this will postpone tick run step's while-loop to event loop cycles
// any other IO-bound operation (like filesystem reading) can take place
// in parallel
tick(1e+6)
tick(1e+7)
console.log('this will output before all of tick operations. i = %d', i)
console.log('because tick operations will be postponed')
tick(1e+8)

diagramma del ciclo di eventi

In termini più semplici, Event Loop è un meccanismo di coda a thread singolo che esegue il codice associato alla CPU fino alla fine della sua esecuzione e al codice associato all'IO in modo non bloccante.

Tuttavia, Node.js sotto il tappeto utilizza multi-threading per alcune delle sue operazioni attraverso la libreria libuv .

Considerazioni sulle prestazioni

  • Le operazioni non bloccanti non bloccheranno la coda e non influenzeranno le prestazioni del ciclo.
  • Tuttavia, le operazioni associate alla CPU bloccheranno la coda, quindi dovresti fare attenzione a non eseguire operazioni legate alla CPU nel tuo codice Node.js.

Node.js non blocca l'IO perché scarica il lavoro nel kernel del sistema operativo e quando l'operazione IO fornisce i dati ( come evento ), notificherà il tuo codice con i callback forniti.

Aumenta max socket

Nozioni di base

require('http').globalAgent.maxSockets = 25

// You can change 25 to Infinity or to a different value by experimenting

Node.js utilizza per impostazione predefinita maxSockets = Infinity allo stesso tempo (dalla versione 1.0.0.0 ). Fino al nodo v0.12.0, il valore predefinito era maxSockets = 5 (vedere v0.11.0 ). Quindi, dopo più di 5 richieste, verranno accodate. Se si desidera la concorrenza, aumentare questo numero.

Impostare il proprio agente

http API http utilizza un " Agente globale " . Puoi fornire il tuo agente. Come questo:

const http = require('http')
const myGloriousAgent = new http.Agent({ keepAlive: true })
myGloriousAgent.maxSockets = Infinity

http.request({ ..., agent: myGloriousAgent }, ...)

Disattivare completamente Socket Pooling

const http = require('http')
const options = {.....}

options.agent = false

const request = http.request(options)

insidie

  • Dovresti fare la stessa cosa per l'API https se vuoi gli stessi effetti

  • Attenzione, ad esempio, AWS utilizzerà 50 anziché Infinity .

Abilita gzip

const http = require('http')
const fs   = require('fs')
const zlib = require('zlib')

http.createServer((request, response) => {
  const stream          = fs.createReadStream('index.html')
  const acceptsEncoding = request.headers['accept-encoding']

  let encoder = {
    hasEncoder     : false,
    contentEncoding: {},
    createEncoder  : () => throw 'There is no encoder'
  }

  if (!acceptsEncoding) {
    acceptsEncoding = ''
  }

  if (acceptsEncoding.match(/\bdeflate\b/)) {
    encoder = {
      hasEncoder     : true,
      contentEncoding: { 'content-encoding': 'deflate' },
      createEncoder  : zlib.createDeflate
    }
  } else if (acceptsEncoding.match(/\bgzip\b/)) {
    encoder = {
      hasEncoder     : true,
      contentEncoding: { 'content-encoding': 'gzip' },
      createEncoder  : zlib.createGzip
    }
  }

  response.writeHead(200, encoder.contentEncoding)

  if (encoder.hasEncoder) {
    stream = stream.pipe(encoder.createEncoder())
  }

  stream.pipe(response)

}).listen(1337)


Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow