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 :
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 ?