Q:

The limit of ulimit -Hn

Using trial and error, I've found the maximum number I can give to ulimit -Hn without getting error is 1048576. Where does that number come from? My sys.fs.file-max is 20000500 (20 million).

A:

Actually, this is hardcoded in Linux kernel, in fs/file.c:
int sysctl_nr_open __read_mostly = 1024*1024;

and is equal to just the number you specified.
Related commits that tried to make it infinite:

https://git.kernel.org/cgit/linux/kernel/git/stable/linux-stable.git/commit/?id=0c2d64fb6cae9aae480f6a46cfe79f8d7d48b59f
https://git.kernel.org/cgit/linux/kernel/git/stable/linux-stable.git/commit/?id=60fd760fb9ff7034360bab7137c917c0330628c2

Looks like it hasn't been touched ever since.

A:

Actually, this limit can be increased. Set fs.nr_open=5242880
in /etc/sysctl.conf, run sysctl -p and login again. Your limit is now
5 million! Set both this and file-max.

