Я сталкиваюсь с утечкой памяти в моем проекте машинописи машинного перевода nodejs.У него мало API, которые выполняют простую операцию CRUD.Когда нагрузочный тест выполнялся в течение 1 часа в контейнере с 512 МБ ОЗУ, использование памяти продолжало увеличиваться, и система дважды перезагружалась.После проверки журналов GC стало ясно, что GC не высвобождает достаточно памяти, и большая ее часть сохраняется, что является случаем утечки памяти.* Link
@ Authorized()
@ JsonController('/test')
@ UseBefore(RequestHeaderValidation, RequestParamsValidation)
export class MyController {
private logger = new Logger(__dirname);
constructor(
private myService: MyService,
) { }
@ Get('/:testId')
@ HttpCode(HTTP_STATUS.OK)
public async getCustomerPreference(@Param('testId') testId: string, @Res() response: express.Response):
Promise< string | void | express.Response> {
try {
await Joi.validate(testId, testSchema);
const output = await this.myService.find(testId);
if (!output) {
this.logger.debug(`Invalid Output from DB: ${output}`);
const result = await this.errorHandlingService.getErrors(errorMessages.NO_DATA_FOUND.code);
return this.responseCreatorService.createErrorResponse(response, HTTP_STATUS.BAD_REQUEST, result, undefined);
}
return output;
} catch (err) {
this.logger.error('Error in get', err.isJoi ? err.details : err);
const errorDetails = err.isJoi ? mapErrorObject(_.get(err, 'details[0]', {})) : { code: errorMessages.TECHNICAL_FAILURE.code };
const error = await this.errorHandlingService.getErrors(errorDetails.code);
return this.responseCreatorService.createErrorResponse(response, HTTP_STATUS.BAD_REQUEST, error, undefined);
}
}
}
myService.find имеет простой метод поиска typeorm.
RequestHeaderValidation и RequestParamsValidation - это два промежуточных ПО simlar, выполняющих некоторую проверку joi.
@ Middleware({ type: 'before' })
export class RequestHeaderValidation implements ExpressMiddlewareInterface {
private log = new Logger(__dirname);
constructor(
private responseCreatorService: ResponseCreatorService
) { }
public async use(req: express.Request, res: express.Response, next: express.NextFunction): Promise< any> {
try {
await Joi.validate(req.headers, requestHeaderSchema);
next();
} catch (err) {
this.log.error('Error in header validation', err.isJoi ? err.details : err);
const errorDetails = err.isJoi ? mapErrorObject(_.get(err, 'details[0]', {})) : { code: errorMessages.TECHNICAL_FAILURE.code };
const error = formErrorRespObject(errorDetails.type, errorDetails.code, errorDetails.message);
return this.responseCreatorService.createErrorResponse(res, HTTP_STATUS.BAD_REQUEST, error, undefined);
}
}
}