Node.js multer y body-parser a veces extremadamente lento

Estoy ejecutando un backend Node.js que utiliza multer para cargas binarias que deberían ir directamente a MySQL a través de la memoria. También utilizamos body-parser.

El problema es que a veces, tanto el analizador del cuerpo (JSON) como el multer tardan mucho tiempo en ejecutarse (10k + ms en lugar de <100ms para el 99% de las solicitudes).

los manejadores de multer suben tamaños de un máximo de ~ 300kb pero con un promedio de ~ 5kb.

el analizador de cuerpo maneja cadenas JSON con un máximo de ~ 30kb (la mayor parte es un blob como Base64)

El servidor no tiene otros problemas de rendimiento (la carga del sistema está promediando un máximo de 0,1, incluso en las horas punta, sin mucha memoria).

El sistema se está ejecutando en una máquina virtual (MS Azure D3v2).

function profiler(str) { return function (req, res, next) { var diff = new Date().valueOf() - res.myStarted.valueOf(); var stat = (req.method + req.url).toLowerCase().replace(/[:\.]/g, '').replace(/\//g, '_'); if (diff > 100) { logger.error("init time after '"+str+"': " + diff + "ms, " + stat); } next(); } } app.use((req, res, next) => { res.myStarted = new Date(); // req start time next(); }); app.use(compression({ threshold: 0 })); app.use(profiler("compression")); app.use(bodyParser.raw()); app.use(profiler("bodyparser.raw")); app.use(bodyParser.json()); app.use(profiler("bodyparser.json")); // sometimes large process times app.use(bodyParser.urlencoded({ extended: true })); app.use(profiler("bodyparser.urlencoded")); app.use(multer().single("save")); // should use memory only app.use(profiler("multer")); // sometimes large process times /* rest of backend here, no performance issues after this line */ 

Algunas tomas de los registros

 {"level":"error","message":"init time after 'multer': 125ms, post_save","timestamp":"2016-10-29T15:49:29.149Z"} {"level":"error","message":"init time after 'multer': 107ms, post_save","timestamp":"2016-10-29T15:49:31.215Z"} {"level":"error","message":"init time after 'multer': 103ms, post_save","timestamp":"2016-10-29T15:49:32.603Z"} {"level":"error","message":"init time after 'bodyparser.json': 204ms, post_highscores_post_easy1","timestamp":"2016-10-29T15:49:35.009Z"} {"level":"error","message":"init time after 'bodyparser.urlencoded': 205ms, post_highscores_post_easy1","timestamp":"2016-10-29T15:49:35.010Z"} {"level":"error","message":"init time after 'multer': 205ms, post_highscores_post_easy1","timestamp":"2016-10-29T15:49:35.010Z"} {"level":"error","message":"init time after 'multer': 127ms, post_save","timestamp":"2016-10-29T15:49:36.234Z"} {"level":"error","message":"init time after 'bodyparser.json': 14838ms, post_highscores_post_easy1","timestamp":"2016-10-29T15:49:36.280Z"} {"level":"error","message":"init time after 'bodyparser.urlencoded': 14838ms, post_highscores_post_easy1","timestamp":"2016-10-29T15:49:36.280Z"} {"level":"error","message":"init time after 'multer': 14838ms, post_highscores_post_easy1","timestamp":"2016-10-29T15:49:36.280Z"} {"level":"error","message":"init time after 'multer': 472ms, post_save","timestamp":"2016-10-29T15:49:38.948Z"} 

Actualmente estamos recibiendo ~ 15 requisitos / s con ~ 10 ms promedio y ~ 25 ms percentil 95%.

No tiene sentido para mí que, con esos tiempos de respuesta promedio, de repente haya picos enormes para solicitudes casi idénticas.