diff options
author | adrian <adrian@FreeBSD.org> | 2015-09-10 04:05:58 +0000 |
---|---|---|
committer | adrian <adrian@FreeBSD.org> | 2015-09-10 04:05:58 +0000 |
commit | 73868b5389f1d9a90888a4960c03d2c05dd21e92 (patch) | |
tree | 359124d34cb5d29cdd600d5a11936b0f4e772b27 | |
parent | 7c47a4f9ce58b69c1e1dfad64c5e9fa721a9108b (diff) | |
download | FreeBSD-src-73868b5389f1d9a90888a4960c03d2c05dd21e92.zip FreeBSD-src-73868b5389f1d9a90888a4960c03d2c05dd21e92.tar.gz |
Also make kern.maxfilesperproc a boot time tunable.
Auto-tuning threshold discussions aside, it turns out that if you want
to lower this on say, rather memory-packed machines, you either set maxusers
or kern.maxfiles, or you set it in sysctl. The former is a non-exact
way to tune this; the latter doesn't actually affect anything in the
startup scripts.
This first occured because I wondered why the hell screen would take upwards
of 10 seconds to spawn a new screen. I then found python doing the same
thing during fork/exec of child processes - it calls close() on each FD
up to the current openfiles limit. On a 1TB machine this is like, 26 million
FDs per process. Ugh.
So:
* This allows it to be set early in /boot/loader.conf;
* It can be used to work around the ridiculous situation of
screen, python, etc doing a close() on potentially millions of FDs
even though you only have four open.
Tested:
* 4GB, 32GB, 64GB, 128GB, 384GB, 1TB systems with autotune, ensuring
screen and python forking doesn't result in some pretty hilariously
bad behaviour.
TODO:
* Note that the default login.conf sets openfiles-cur to unlimited,
effectively obeying kern.maxfilesperproc. Perhaps we should fix
this.
* .. and even if we do, we need to also ensure that daemons get
a soft limit of something reasonable and capped - they can request
more FDs themselves.
MFC after: 1 week
Sponsored by: Norse Corp, Inc.
-rw-r--r-- | sys/kern/subr_param.c | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/sys/kern/subr_param.c b/sys/kern/subr_param.c index 36608d1..52c6f16 100644 --- a/sys/kern/subr_param.c +++ b/sys/kern/subr_param.c @@ -265,7 +265,8 @@ init_param2(long physpages) if (maxfiles > (physpages / 4)) maxfiles = physpages / 4; maxfilesperproc = (maxfiles / 10) * 9; - + TUNABLE_INT_FETCH("kern.maxfilesperproc", &maxfilesperproc); + /* * Cannot be changed after boot. */ |