Extremely slow file (~5MB) upload via POST

Francis Daly francis at daoine.org
Mon Nov 11 12:11:56 UTC 2019

On Sun, Nov 10, 2019 at 01:03:20PM -0500, frank.muller wrote:

Hi there,

I don't have an answer for you, but there are some things you could
perhaps try, if you are happy to keep investigating.

> [DESCRIPTION] I've an upstream backend service behind Niginx (1.16.1,
> openssl-1.1.1) which allow people upload files from their browser. The files
> are simply stored on disk. Nothing else is performed on them.

The sequence is: client writes to nginx; nginx writes to upstream.

Can you see: is the extra slowness in the first part, or the second?

The usual first place to look is in the log files.

> error_log  off; #/var/log/nginx/error.log  info;

You can probably look in the file /usr/local/nginx/off to see what nginx
says is happening; but you might want to increase the log level to see
more details.

>       access_log    off; #/var/log/nginx/access.log;

You don't have an access log to look in. That probably does not matter
much here.

>       sendfile      on;
>       tcp_nopush    on;
>       tcp_nodelay   on;
>       types_hash_max_size 2048;
>       open_file_cache          max=10000 inactive=10m;
>       open_file_cache_valid    1h;
>       open_file_cache_min_uses 1;
>       open_file_cache_errors   on;

I think that those directives should not affect this test, either way.

>         listen  443 ssl;
>         location / {
>            proxy_pass;
>         }

> [PROBLEM] A 5MB file takes almost 30 seconds to upload via Nginx.
> When uploading it directly to the upstream backend, it takes ~400 millisec
> at max.

That does sound unnecessarily slow. The (presumed) ssl/no-ssl difference
should not account for that much overhead.

> Running strace, we've got this:
> % time     seconds  usecs/call     calls    errors syscall
> ------ ----------- ----------- --------- --------- ----------------
>  47.96    0.041738          11      3887      1489 read
>  21.73    0.018909          13      1509           epoll_wait
>  17.95    0.015622          22       708           writev
>  10.62    0.009241          13       712           write
>   0.47    0.000407          19        21        21 connect

I don't know the details, but what is nginx trying to connect() to that
is erroring every time? Is that likely relevant to the problem?

> A lot of errors in "read" calls: 1489 errors. They all correspond to (thanks
> again to strace):

It is possible that the nginx debug log might have more nginx-related
details than the bare strace.

Good luck with it,

Francis Daly        francis at daoine.org

More information about the nginx mailing list