Node.js multer и body-parser иногда очень медленные

Я использую серверную часть Node.js, которая использует multer для двоичных загрузок, которые должны напрямую отправляться в MySQL через память. Мы также используем body-parser.

Проблема заключается в том, что иногда анализатор тела (JSON) или multer выполняется очень долго (10 000 + мс, в отличие от <100 мс для 99% запросов).

мультиплеерные обработчики загружают размеры максимум ~300 КБ, но в среднем ~5 КБ.

body-parser обрабатывает строки в формате JSON максимум ~ 30 КБ (большая часть - один BLOB-объект как Base64)

У сервера нет других проблем с производительностью (загрузка системы в среднем составляет не более 0,1 даже в часы пик, много свободной памяти).

Система работает на виртуальной машине (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 */

Некоторые берет из журналов

{"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"}

В настоящее время мы получаем ~15 запросов / с со средним значением ~10 мс и процентилем ~ 95 мс.

Для меня нет смысла, что при таком среднем времени отклика внезапно возникают огромные всплески почти идентичных запросов.

0 ответов

Другие вопросы по тегам