Aanbevolen procedures en gids voor probleemoplossing voor knooppunttoepassingen in Azure-app Service Windows

In dit artikel leert u aanbevolen procedures en stappen voor probleemoplossing voor Windows Node.js-toepassingen die worden uitgevoerd op Azure-app Service (met iisnode).

Waarschuwing

Wees voorzichtig bij het gebruik van stappen voor probleemoplossing op uw productiesite. Aanbeveling is het oplossen van problemen met uw app in een niet-productie-installatie, bijvoorbeeld uw staging-site en wanneer het probleem is opgelost, wisselt u uw staging-site door uw productiesite.

IISNODE-configuratie

Dit schemabestand bevat alle instellingen die u voor iisnode kunt configureren. Enkele van de instellingen die nuttig zijn voor uw toepassing:

nodeProcessCountPerApplication

Met deze instelling bepaalt u het aantal knooppuntprocessen dat per IIS-toepassing wordt gestart. De standaardwaarde is 1. U kunt zoveel node.exes starten als het aantal VM-vCPU's door de waarde te wijzigen in 0. De aanbevolen waarde is 0 voor de meeste toepassingen, zodat u alle vCPU's op uw computer kunt gebruiken. Node.exe is één threaded, dus één node.exe verbruikt maximaal 1 vCPU. Als u de maximale prestaties van uw knooppunttoepassing wilt halen, wilt u alle vCPU's gebruiken.

nodeProcessCommandLine

Met deze instelling bepaalt u het pad naar node.exe. U kunt deze waarde zo instellen dat deze verwijst naar de versie node.exe.

maxConcurrentRequestsPerProcess

Met deze instelling bepaalt u het maximum aantal gelijktijdige aanvragen dat door iisnode naar elk node.exe wordt verzonden. In Azure-app Service is de standaardwaarde Oneindig. U kunt de waarde configureren, afhankelijk van het aantal aanvragen dat uw toepassing ontvangt en hoe snel uw toepassing elke aanvraag verwerkt.

maxNamedPipe Verbinding maken ionRetry

Met deze instelling wordt het maximum aantal keren dat iisnode nieuwe pogingen worden gedaan om de verbinding op de benoemde pijp te maken om de aanvragen naar node.exe te verzenden. Deze instelling in combinatie met namedPipe Verbinding maken ionRetryDelay bepaalt de totale time-out van elke aanvraag binnen iisnode. De standaardwaarde is 200 op Azure-app Service. Totale time-out in seconden = (maxNamedPipe Verbinding maken ionRetry * namedPipe Verbinding maken ionRetryDelay) / 1000

namedPipe Verbinding maken ionRetryDelay

Met deze instelling bepaalt u hoe lang (in ms) iisnode wacht tussen elke nieuwe poging om de aanvraag naar node.exe te verzenden via de benoemde pijp. De standaardwaarde is 250 ms. Totale time-out in seconden = (maxNamedPipe Verbinding maken ionRetry * namedPipe Verbinding maken ionRetryDelay) / 1000

De totale time-out in iisnode op Azure-app Service is standaard 200 * 250 ms = 50 seconden.

logDirectory

Met deze instelling bepaalt u de map waarin iisnode stdout/stderr registreert. De standaardwaarde is iisnode, die relatief is ten opzichte van de hoofdscriptmap (map waar main server.js aanwezig is)

foutopsporingsprogrammaExtensionDll

Met deze instelling bepaalt u welke versie van node-inspector iisnode wordt gebruikt bij het opsporen van fouten in uw knooppunttoepassing. Momenteel zijn iisnode-inspector-0.7.3.dll en iisnode-inspector.dll de enige twee geldige waarden voor deze instelling. De standaardwaarde is iisnode-inspector-0.7.3.dll. De versie iisnode-inspector-0.7.3.dll maakt gebruik van node-inspector-0.7.3 en maakt gebruik van websockets. Schakel websockets in uw Azure-web-app in om deze versie te gebruiken.

flushResponse

Het standaardgedrag van IIS is dat het reactiegegevens buffert tot 4 MB voordat het wordt leeggemaakt, of tot het einde van het antwoord, afhankelijk van wat het eerst komt. iisnode biedt een configuratie-instelling om dit gedrag te overschrijven: als u een fragment van de hoofdtekst van de antwoordentiteit wilt leegmaken zodra iisnode het ontvangt van node.exe, moet u het kenmerk iisnode/@flushResponse in web.config instellen op 'true':

<configuration>
    <system.webServer>
        <!-- ... -->
        <iisnode flushResponse="true" />
    </system.webServer>
</configuration>

Schakel het leegmaken van elk fragment van de hoofdtekst van de antwoordentiteit in, waardoor de doorvoer van het systeem met ongeveer 5% wordt verminderd (vanaf v0.1.13). Het beste om deze instelling alleen in te stellen op eindpunten waarvoor reactiestreaming is vereist (bijvoorbeeld met behulp van het <location> element in web.config)

Daarnaast moet u voor streamingtoepassingen ook responseBufferLimit van uw iisnode-handler instellen op 0.

<handlers>
    <add name="iisnode" path="app.js" verb="\*" modules="iisnode" responseBufferLimit="0"/>
</handlers>

watchedFiles

Een door puntkomma's gescheiden lijst met bestanden die worden gecontroleerd op wijzigingen. Elke wijziging in een bestand zorgt ervoor dat de toepassing wordt gerecycled. Elke vermelding bestaat uit een optionele mapnaam en een vereiste bestandsnaam, die zich ten opzichte van de map waar het toegangspunt van de hoofdtoepassing zich bevindt. Jokertekens zijn alleen toegestaan in het gedeelte bestandsnaam. De standaardwaarde is *.js;iisnode.yml.

recycleSignalEnabled

De standaardwaarde is false. Als deze optie is ingeschakeld, kan uw knooppunttoepassing verbinding maken met een benoemde pijp (omgevingsvariabele IISNODE_CONTROL_PIPE) en een bericht 'recyclen' verzenden. Dit zorgt ervoor dat het w3wp probleemloos wordt gerecycled.

idlePageOutTimePeriod

De standaardwaarde is 0, wat betekent dat deze functie is uitgeschakeld. Als deze waarde is ingesteld op een waarde die groter is dan 0, worden in milliseconden alle onderliggende processen van iisnode weergegeven. Raadpleeg de documentatie om te begrijpen wat pagina-out betekent. Deze instelling is handig voor toepassingen die een grote hoeveelheid geheugen verbruiken en af en toe geheugen naar schijf willen uitzetten om RAM vrij te maken.

Waarschuwing

Wees voorzichtig bij het inschakelen van de volgende configuratie-instellingen voor productietoepassingen. Het wordt aangeraden ze niet in te schakelen voor live productietoepassingen.

foutopsporingHeaderEnabled

De standaardwaarde is false. Als deze waarde is ingesteld op waar, voegt iisnode een HTTP-antwoordheader iisnode-debug toe aan elk HTTP-antwoord dat de headerwaarde verzendt, is dit iisnode-debug een URL. Afzonderlijke stukjes diagnostische gegevens kunnen worden verkregen door naar het URL-fragment te kijken, maar er is een visualisatie beschikbaar door de URL in een browser te openen.

loggingEnabled

Deze instelling bepaalt de logboekregistratie van stdout en stderr door iisnode. Iisnode legt stdout/stderr vast van knooppuntprocessen die worden gestart en schrijft naar de map die is opgegeven in de instelling 'logDirectory'. Zodra dit is ingeschakeld, schrijft uw toepassing logboeken naar het bestandssysteem en afhankelijk van de hoeveelheid logboekregistratie die door de toepassing wordt uitgevoerd, kunnen er gevolgen zijn voor de prestaties.

devErrorsEnabled

De standaardwaarde is false. Als deze is ingesteld op waar, geeft iisnode de HTTP-statuscode en Win32-foutcode weer in uw browser. De win32-code is handig bij het opsporen van fouten in bepaalde typen problemen.

foutopsporingEnabled (niet inschakelen op live productiesite)

Deze instelling bepaalt de functie voor foutopsporing. Iisnode is geïntegreerd met node-inspector. Door deze instelling in te schakelen, schakelt u foutopsporing van uw knooppunttoepassing in. Wanneer u deze instelling inschakelt, maakt iisnode node-inspector-bestanden in de map debuggerVirtualDir in de eerste foutopsporingsaanvraag voor uw knooppunttoepassing. U kunt de knooppuntcontrole laden door een aanvraag naar http://yoursite/server.js/debug. U kunt het foutopsporings-URL-segment beheren met de instelling debuggerPathSegment. Standaard is foutopsporingsprogrammaPathSegment='debug'. U kunt bijvoorbeeld instellen debuggerPathSegment op een GUID, zodat het moeilijker is om door anderen te worden gedetecteerd.

Lees Debug Node.js-toepassingen in Windows voor meer informatie over foutopsporing.

Scenario's en aanbevelingen/probleemoplossing

Mijn knooppunttoepassing maakt overmatige uitgaande aanroepen

Veel toepassingen willen uitgaande verbindingen maken als onderdeel van hun normale werking. Als er bijvoorbeeld een aanvraag binnenkomt, wil uw knooppunt-app ergens anders contact opnemen met een REST API en informatie ophalen om de aanvraag te verwerken. U wilt een keep alive-agent gebruiken bij het doen van HTTP- of HTTPS-aanroepen. U kunt de agentkeepalive-module gebruiken als uw keep alive-agent bij het maken van deze uitgaande aanroepen.

De agentkeepalive-module zorgt ervoor dat sockets opnieuw worden gebruikt op uw Azure-web-app-VM. Als u een nieuwe socket maakt voor elke uitgaande aanvraag, wordt overhead toegevoegd aan uw toepassing. Als uw toepassing sockets opnieuw gebruikt voor uitgaande aanvragen, zorgt u ervoor dat uw toepassing niet groter is dan de maxSockets die per VM worden toegewezen. De aanbeveling voor Azure-app Service is om de waarde agentKeepAlive maxSockets in te stellen op een totaal van (4 exemplaren van node.exe * 32 maxSockets/instance) 128 sockets per VM.

Voorbeeld van agentKeepALive-configuratie :

let keepaliveAgent = new Agent({
    maxSockets: 32,
    maxFreeSockets: 10,
    timeout: 60000,
    freeSocketTimeout: 300000
});

Belangrijk

In dit voorbeeld wordt ervan uitgegaan dat er 4 node.exe wordt uitgevoerd op uw VIRTUELE machine. Als u een ander aantal node.exe op de VIRTUELE machine uitvoert, moet u de instelling maxSockets dienovereenkomstig wijzigen.

Mijn knooppunttoepassing verbruikt te veel CPU

Mogelijk ontvangt u een aanbeveling van Azure-app Service in uw portal over een hoog CPU-verbruik. U kunt ook monitors instellen om te kijken naar bepaalde metrische gegevens. Wanneer u het CPU-gebruik controleert op het Dashboard van Azure Portal, controleert u de MAX-waarden voor CPU, zodat u de piekwaarden niet mist. Als u denkt dat uw toepassing te veel CPU verbruikt en u niet kunt uitleggen waarom, kunt u uw knooppunttoepassing profileeren om erachter te komen.

Uw knooppunttoepassing profileren op Azure-app Service met V8-Profiler

Stel dat u een hallo wereld-app hebt die u als volgt wilt profilen:

const http = require('http');
function WriteConsoleLog() {
    for(let i=0;i<99999;++i) {
        console.log('hello world');
    }
}

function HandleRequest() {
    WriteConsoleLog();
}

http.createServer(function (req, res) {
    res.writeHead(200, {'Content-Type': 'text/html'});
    HandleRequest();
    res.end('Hello world!');
}).listen(process.env.PORT);

Ga naar de consolesite voor foutopsporing https://yoursite.scm.azurewebsites.net/DebugConsole

Ga naar uw site-/wwwroot-map. U ziet een opdrachtprompt, zoals wordt weergegeven in het volgende voorbeeld:

Screenshot that shows your site/wwwroot directory and command prompt.

Voer de opdracht npm install v8-profiler uit.

Met deze opdracht installeert u de v8-profiler onder node_modules map en alle bijbehorende afhankelijkheden. Bewerk nu uw server.js om uw toepassing te profilen.

const http = require('http');
const profiler = require('v8-profiler');
const fs = require('fs');

function WriteConsoleLog() {
    for(let i=0;i<99999;++i) {
        console.log('hello world');
    }
}

function HandleRequest() {
    profiler.startProfiling('HandleRequest');
    WriteConsoleLog();
    fs.writeFileSync('profile.cpuprofile', JSON.stringify(profiler.stopProfiling('HandleRequest')));
}

http.createServer(function (req, res) {
    res.writeHead(200, {'Content-Type': 'text/html'});
    HandleRequest();
    res.end('Hello world!');
}).listen(process.env.PORT);

De voorgaande codeprofielen de functie WriteConsoleLog en schrijft vervolgens de profieluitvoer naar het bestand profile.cpuprofile onder wwwroot van uw site. Verzend een aanvraag naar uw toepassing. U ziet een bestand profile.cpuprofile dat is gemaakt onder uw site wwwroot.

Screenshot that shows the profile.cpuprofile file.

Download dit bestand en open het met Chrome F12 Tools. Druk op F12 in Chrome en kies vervolgens het tabblad Profielen . Kies de knop Laden . Selecteer het bestand profile.cpuprofile dat u hebt gedownload. Klik op het profiel dat u zojuist hebt geladen.

Screenshot that shows the profile.cpuprofile file that you loaded.

U kunt zien dat 95% van de tijd is verbruikt door de functie WriteConsoleLog. In de uitvoer ziet u ook de exacte regelnummers en bronbestanden die het probleem hebben veroorzaakt.

Mijn knooppunttoepassing verbruikt te veel geheugen

Als uw toepassing te veel geheugen verbruikt, ziet u een melding van Azure-app Service in uw portal over een hoog geheugenverbruik. U kunt monitors instellen om te kijken naar bepaalde metrische gegevens. Controleer bij het controleren van het geheugengebruik op het Dashboard van Azure Portal de MAX-waarden voor het geheugen, zodat u de piekwaarden niet mist.

Lekdetectie en Heap Diff voor Node.js

U kunt node-memwatch gebruiken om geheugenlekken te identificeren. U kunt net als v8-profiler installeren memwatch en uw code bewerken om heaps vast te leggen en te diffen om de geheugenlekken in uw toepassing te identificeren.

Mijn node.exe wordt willekeurig gedood

Er zijn enkele redenen waarom node.exe willekeurig wordt afgesloten:

  1. Uw toepassing genereert onopgeslagen uitzonderingen: controleer d:\home\LogFiles\Application\logging-errors.txt voor de details van de uitzondering die is gegenereerd. Dit bestand bevat de stacktracering om fouten in uw toepassing op te sporen en op te lossen.
  2. Uw toepassing verbruikt te veel geheugen, wat van invloed is op andere processen om aan de slag te gaan. Als het totale VM-geheugen bijna 100% is, kunnen de knooppunt.exe's worden gedood door de procesbeheerder. Procesbeheer beëindigt sommige processen om andere processen de kans te geven om wat werk te doen. Om dit probleem op te lossen, profileert u uw toepassing voor geheugenlekken. Als uw toepassing grote hoeveelheden geheugen nodig heeft, schaalt u omhoog naar een grotere VIRTUELE machine (waardoor het RAM-geheugen voor de VIRTUELE machine toeneemt).

Mijn knooppunttoepassing wordt niet gestart

Als uw toepassing 500 fouten retourneert wanneer deze wordt gestart, kan er een aantal redenen zijn:

  1. Node.exe is niet aanwezig op de juiste locatie. Controleer de instelling nodeProcessCommandLine.
  2. Het hoofdscriptbestand is niet aanwezig op de juiste locatie. Controleer web.config en controleer of de naam van het hoofdscriptbestand in de handlerssectie overeenkomt met het hoofdscriptbestand.
  3. Web.config-configuratie is niet juist. Controleer de instellingennamen/waarden.
  4. Koude start: uw toepassing duurt te lang om te starten. Als uw toepassing langer duurt dan (maxNamedPipe Verbinding maken ionRetry * namedPipe Verbinding maken ionRetryDelay) / 1000 seconden, retourneert iisnode een 500-fout. Verhoog de waarden van deze instellingen zodat deze overeenkomen met de begintijd van uw toepassing om te voorkomen dat iisnode een time-out optreedt en de 500-fout retourneert.

Mijn knooppunttoepassing is vastgelopen

Uw toepassing genereert onopgeslagen uitzonderingen: controleer d:\\home\\LogFiles\\Application\\logging-errors.txt het bestand op de details van de uitzondering die is gegenereerd. Dit bestand bevat de stacktracering om uw toepassing te diagnosticeren en op te lossen.

Mijn knooppunttoepassing duurt te veel tijd om te starten (koude start)

De veelvoorkomende oorzaak voor lange starttijden van toepassingen is een groot aantal bestanden in de node_modules. De toepassing probeert de meeste van deze bestanden te laden bij het starten. Omdat uw bestanden zijn opgeslagen op de netwerkshare op Azure-app Service, kan het laden van veel bestanden tijd in beslag nemen. Enkele oplossingen om dit proces sneller te maken, zijn:

  1. Probeer uw node_modules te laden en niet alle modules bij het starten van de toepassing te laden. Voor luie laadmodules moet de aanroep om te vereisen('module') worden uitgevoerd wanneer u de module in de functie daadwerkelijk nodig hebt voordat de eerste uitvoering van modulecode wordt uitgevoerd.
  2. Azure-app Service biedt een functie met de naam lokale cache. Met deze functie kopieert u uw inhoud van de netwerkshare naar de lokale schijf op de virtuele machine. Omdat de bestanden lokaal zijn, is de laadtijd van node_modules veel sneller.

HTTP-status en substatus van IISNODE

Het cnodeconstantsbronbestand bevat alle mogelijke combinaties van status/substatus die iisnode kan retourneren vanwege een fout.

Schakel FREB in voor uw toepassing om de win32-foutcode te zien (zorg ervoor dat u FREB alleen inschakelt op niet-productiesites om prestatieredenen).

Http-status Http-substatus Mogelijke reden?
500 1000 Er is een probleem opgetreden bij het verzenden van de aanvraag naar IISNODE: controleer of node.exe is gestart. Node.exe kan zijn vastgelopen bij het starten. Controleer de configuratie van uw web.config op fouten.
500 1001 - Win32Error 0x2 - App reageert niet op de URL. Controleer de regels voor het herschrijven van de URL of uw express-app de juiste routes heeft gedefinieerd. - Win32Error 0x6d - benoemde pipe is bezet - Node.exe accepteert geen aanvragen omdat de pijp bezet is. Controleer het hoge cpu-gebruik. - Andere fouten: controleer of node.exe is vastgelopen.
500 1002 Node.exe is vastgelopen: controleer d:\home\LogFiles\logging-errors.txt voor stacktracering.
500 1003 Probleem met pijpconfiguratie: de configuratie van de benoemde pijp is onjuist.
500 1004-1018 Er is een fout opgetreden tijdens het verzenden van de aanvraag of het verwerken van het antwoord naar/van node.exe. Controleer of node.exe is vastgelopen. controleer d:\home\LogFiles\logging-errors.txt voor stack-trace.
503 1000 Onvoldoende geheugen om meer benoemde pijpverbindingen toe te wijzen. Controleer waarom uw app zoveel geheugen verbruikt. Controleer de waarde van de instelling maxConcurrentRequestsPerProcess. Als het niet oneindig is en u veel aanvragen hebt, verhoogt u deze waarde om deze fout te voorkomen.
503 1001 De aanvraag kan niet worden verzonden naar node.exe omdat de toepassing wordt gerecycled. Nadat de toepassing is gerecycled, moeten aanvragen normaal worden verwerkt.
503 1002 Controleer de win32-foutcode om de werkelijke reden: aanvraag kan niet worden verzonden naar een node.exe.
503 1003 Benoemde pijp is te bezet - Controleer of node.exe overmatige CPU verbruikt

NODE.exe heeft een instelling met de naam NODE_PENDING_PIPE_INSTANCES. In Azure-app Service is deze waarde ingesteld op 5000. Dit betekent dat node.exe 5000 aanvragen tegelijk op de benoemde pijp kan accepteren. Deze waarde moet goed genoeg zijn voor de meeste knooppunttoepassingen die worden uitgevoerd op Azure-app Service. U ziet 503.1003 niet op Azure-app Service vanwege de hoge waarde voor deNODE_PENDING_PIPE_INSTANCES

Meer resources

Volg deze koppelingen voor meer informatie over Node.js-toepassingen in Azure-app Service.