upgrading binary failed - execve - too long argument list

Maxim Dounin mdounin at mdounin.ru
Tue May 4 15:53:41 UTC 2021


On Fri, Apr 30, 2021 at 11:14:48AM +0200, Charlie Kilo wrote:

> correction.. if i count with
> ss -l -t |grep http | wc -l
> we have around 58340 listening sockets.. at least on that machine..

Since "listen ... reuseport;" implies a separate listening socket 
for each worker process, that's expected with 50 worker processes 
and 1200 "listen ... reuseport" in the configuration.

> On Fri, Apr 30, 2021 at 8:27 AM Charlie Kilo <krikkiteer at gmail.com> wrote:
> > Thanks a lot for the hints so far.. to provide the further info and answer
> > the questions..
> >
> > getconf ARG_MAX shows 2097152
> > ulimit -s shows 8192
> > setting it to unlimited, doesn't change anything (also not with prlimit)
> > wc -c /proc/<pid>/environ shows 1949
> >
> > it seems on a regular machine we have around 1200 listening sockets and do indeed use "reuseport"

Thanks, so all seem to be using the defaults.

Looking more closely at Linux limits, it seems that you are 
hitting the MAX_ARG_STRLEN limit.  It limits single argument 
length (and a single environment variable length), and hardcoded 
to be 32 pages, that is, almost always 128k.  

With 128k limit nginx should be able to pass about 20k listening 
sockets, so with 58340 sockets you are well above the limit.

An obvious workaround would be to reduce the amount of listening 
sockets - either by dropping the "reuseport", or by reducing the 
the number of listening sockets (normally just one on the wildcard 
address is enough), or by reducing the number of worker processes.

It would be interesting to know why you are using such a large 
number of listening sockets with reuseport enabled.  If the use 
case is reasonable, we probably should consider implementing some 
workaround for the 128k limit.

Maxim Dounin

More information about the nginx mailing list