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

Reply via email to