Historically the max files limit for processes has always been 1024,
because going beyond this is incompatible with the select() function.
None the less most apps these days will use poll() so should not be
limited in this way.
Since systemd >= 240, the hard limit will be 500k, while the soft
limit remains at 1k. Applications which don't use select() should
raise their soft limit to match the hard limit during their startup.
This function provides a convenient helper to do this limit raising.
Signed-off-by: Daniel P. Berrangé <berrange(a)redhat.com>
---
src/libvirt_private.syms | 1 +
src/util/virprocess.c | 34 ++++++++++++++++++++++++++++++++++
src/util/virprocess.h | 1 +
3 files changed, 36 insertions(+)
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index fb7ad9c855..3071dec13a 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -3171,6 +3171,7 @@ virPortAllocatorSetUsed;
# util/virprocess.h
virProcessAbort;
+virProcessActivateMaxFiles;
virProcessExitWithStatus;
virProcessGetAffinity;
virProcessGetMaxMemLock;
diff --git a/src/util/virprocess.c b/src/util/virprocess.c
index 0462ae8465..a26683f333 100644
--- a/src/util/virprocess.c
+++ b/src/util/virprocess.c
@@ -1048,6 +1048,35 @@ virProcessSetMaxFiles(pid_t pid, unsigned int files)
return 0;
}
+
+void
+virProcessActivateMaxFiles(void)
+{
+ struct rlimit maxfiles = {0};
+
+ /*
+ * Ignore errors since we might be inside a container with seccomp
+ * filters and limits preset to suitable values.
+ */
+ if (getrlimit(RLIMIT_NOFILE, &maxfiles) < 0) {
+ VIR_DEBUG("Unable to fetch process max files limit: %s",
+ g_strerror(errno));
+ return;
+ }
+
+ VIR_DEBUG("Initial max files was %llu", (unsigned long
long)maxfiles.rlim_cur);
+
+ maxfiles.rlim_cur = maxfiles.rlim_max;
+
+ if (setrlimit(RLIMIT_NOFILE, &maxfiles) < 0) {
+ VIR_DEBUG("Unable to set process max files limit to %llu: %s",
+ (unsigned long long)maxfiles.rlim_cur, g_strerror(errno));
+ return;
+ }
+
+ VIR_DEBUG("Raised max files to %llu", (unsigned long
long)maxfiles.rlim_cur);
+}
+
#else /* ! (WITH_SETRLIMIT && defined(RLIMIT_NOFILE)) */
int
virProcessSetMaxFiles(pid_t pid G_GNUC_UNUSED,
@@ -1056,6 +1085,11 @@ virProcessSetMaxFiles(pid_t pid G_GNUC_UNUSED,
virReportSystemError(ENOSYS, "%s", _("Not supported on this
platform"));
return -1;
}
+
+void
+virProcessActivateMaxFiles(void)
+{
+}
#endif /* ! (WITH_SETRLIMIT && defined(RLIMIT_NOFILE)) */
#if WITH_SETRLIMIT && defined(RLIMIT_CORE)
diff --git a/src/util/virprocess.h b/src/util/virprocess.h
index c18f87e80e..6008cca4af 100644
--- a/src/util/virprocess.h
+++ b/src/util/virprocess.h
@@ -81,6 +81,7 @@ int virProcessSetMaxMemLock(pid_t pid, unsigned long long bytes)
G_NO_INLINE;
int virProcessSetMaxProcesses(pid_t pid, unsigned int procs);
int virProcessSetMaxFiles(pid_t pid, unsigned int files);
int virProcessSetMaxCoreSize(pid_t pid, unsigned long long bytes);
+void virProcessActivateMaxFiles(void);
int virProcessGetMaxMemLock(pid_t pid, unsigned long long *bytes) G_NO_INLINE;
--
2.40.1