3 votes

Le profilage de mon serveur NodeJS montre qu'il est suspendu... Mais comment savoir pourquoi ?

J'ai un serveur NodeJS qui fonctionne avec NestJS et déployé sur AKS.
J'ai créé un Intercepteur de sorte que si j'envoie un en-tête HTTP 'profil', le code habituel sera exécuté, mais au lieu d'envoyer la réponse, il remplacera le corps par le résultat du profil.

Voici le code :

import {
  CallHandler, ExecutionContext, Injectable, NestInterceptor,
} from '@nestjs/common';
import { Observable } from 'rxjs';
import { map } from 'rxjs/operators';
import { Session } from 'inspector';

/**
 * This interceptor will replace the body of the response with the result of the profiling
 * if the request as a header 'profile'
 *
 * To use on a controller or a method, simply decorate it with @UseInterceptors(Profiler)
 */
@Injectable()
export class Profiler implements NestInterceptor {
  intercept(context: ExecutionContext, next: CallHandler): Observable<any> | Promise<Observable<any>> {
    const profile = context.switchToHttp().getRequest().get('profile');
    // if the request doesn't have a 'profile' header, we deal with the request as usual
    if (!profile) return next.handle();

    // start a profiling session
    const session = new Session();
    session.connect();

    return new Promise((resolve) => {
      session.post('Profiler.enable', () => {
        session.post('Profiler.start', () => {
          resolve(next.handle().pipe(map(() => new Promise((resolve) => {
            session.post('Profiler.stop', (_, { profile }) => {
              resolve(profile);
            });
          }))));
        });
      });
    });
  }
}

En procédant ainsi, j'obtiens un JSON que je peux ensuite ouvrir avec l'outil de développement de Chrome :

Profile

Vous pouvez voir que toutes les fonctions individuelles ne prennent que quelques ms pour s'exécuter, mais entre les deux, il y a de très longues pauses.

Voici un extrait de mon deployment.yaml qui montre que mon pod devrait avoir 2 Go de mémoire, ce qui devrait suffire.

spec:
      serviceAccount: {{ include "api.fullname" . }}-service-account
      containers:
        - name: {{ .Chart.Name }}
          image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
          imagePullPolicy: {{ .Values.image.pullPolicy }}
          resources:
            limits:
              memory: "2000Mi"
            requests:
              memory: "2000Mi"
          ports:
            - name: http
              containerPort: {{ .Values.port }}
              protocol: TCP

Alors comment expliquer ces longues pauses et comment les prévenir ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X