Changeset: 56ffc131a4c0 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=56ffc131a4c0
Modified Files:
configure.ag
gdk/ChangeLog.Apr2019
gdk/gdk_utils.c
Branch: Apr2019
Log Message:
Use cgroups and resource limits to initialize some memory-related values.
diffs (85 lines):
diff --git a/configure.ag b/configure.ag
--- a/configure.ag
+++ b/configure.ag
@@ -2594,6 +2594,7 @@ AC_CHECK_FUNCS([\
getlogin \
getopt \
getopt_long \
+ getrlimit \
gettimeofday \
getuid \
localtime_r \
diff --git a/gdk/ChangeLog.Apr2019 b/gdk/ChangeLog.Apr2019
--- a/gdk/ChangeLog.Apr2019
+++ b/gdk/ChangeLog.Apr2019
@@ -1,3 +1,8 @@
# ChangeLog file for MonetDB
# This file is updated with Maddlog
+* Mon Jul 15 2019 Sjoerd Mullender <[email protected]>
+- We now look at the limits imposed by cgroups and the setrlimit system
+ call to initialize some internal values related to how much (virtual)
+ memory we think is available.
+
diff --git a/gdk/gdk_utils.c b/gdk/gdk_utils.c
--- a/gdk/gdk_utils.c
+++ b/gdk/gdk_utils.c
@@ -41,6 +41,9 @@ int GDKverbose = 0;
#ifdef HAVE_SYS_SYSCTL_H
# include <sys/sysctl.h>
#endif
+#if defined(HAVE_SYS_RESOURCE_H) && defined(HAVE_GETRLIMIT)
+#include <sys/resource.h>
+#endif
#ifdef __CYGWIN__
#include <sysinfoapi.h>
@@ -392,6 +395,48 @@ MT_init(void)
#else
# error "don't know how to get the amount of physical memory for your OS"
#endif
+ /* limit values to whatever cgroups gives us */
+ FILE *f;
+ /* limit of memory usage */
+ f = fopen("/sys/fs/cgroup/memory/memory.limit_in_bytes", "r");
+ if (f != NULL) {
+ uint64_t mem;
+ if (fscanf(f, "%" SCNu64, &mem) == 1
+ && mem < (uint64_t) _MT_pagesize * _MT_npages) {
+ _MT_npages = (size_t) (mem / _MT_pagesize);
+ }
+ fclose(f);
+ }
+ /* soft limit of memory usage */
+ f = fopen("/sys/fs/cgroup/memory/memory.soft_limit_in_bytes", "r");
+ if (f != NULL) {
+ uint64_t mem;
+ if (fscanf(f, "%" SCNu64, &mem) == 1
+ && mem < (uint64_t) _MT_pagesize * _MT_npages) {
+ _MT_npages = (size_t) (mem / _MT_pagesize);
+ }
+ fclose(f);
+ }
+ /* limit of memory+swap usage
+ * we use this as maximum virtual memory size */
+ f = fopen("/sys/fs/cgroup/memory/memory.memsw.limit_in_bytes", "r");
+ if (f != NULL) {
+ uint64_t mem;
+ if (fscanf(f, "%" SCNu64, &mem) == 1
+ && mem < (uint64_t) GDK_vm_maxsize) {
+ GDK_vm_maxsize = (size_t) mem;
+ }
+ fclose(f);
+ }
+#if defined(HAVE_SYS_RESOURCE_H) && defined(HAVE_GETRLIMIT) &&
defined(RLIMIT_AS)
+ struct rlimit l;
+ /* address space (virtual memory) limit */
+ if (getrlimit(RLIMIT_AS, &l) == 0
+ && l.rlim_cur != RLIM_INFINITY
+ && l.rlim_cur < GDK_vm_maxsize) {
+ GDK_vm_maxsize = l.rlim_cur;
+ }
+#endif
}
/*
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list