aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorRobin Haberkorn <robin.haberkorn@googlemail.com>2023-05-14 04:58:28 +0300
committerRobin Haberkorn <robin.haberkorn@googlemail.com>2023-05-14 04:58:28 +0300
commit96b60afcf4293db2e6841b58500fd12d0344e75f (patch)
treea0aecd475c1f9e73ff02f406d4ca761bcc2615f7
parent6333590e0822ccb5e707e4784bfd19ecbae60840 (diff)
downloadsciteco-96b60afcf4293db2e6841b58500fd12d0344e75f.tar.gz
FreeBSD: fixed the poll-thread memory limiting implementation - it's the default now
* On FreeBSD both the dlmalloc replacement and poll-thread via sysctl() work but the poll-thread has been benchmarked to be significantly faster, at least on my machine. You can still ./configure --enable-malloc-replacement of course. * Interestingly, the RSS of the process visible via htop does not decrease after OOMs or command-line terminations - with neither of the implementations.
-rw-r--r--configure.ac8
-rw-r--r--src/memory.c21
2 files changed, 22 insertions, 7 deletions
diff --git a/configure.ac b/configure.ac
index b8e6e38..18b878d 100644
--- a/configure.ac
+++ b/configure.ac
@@ -377,8 +377,10 @@ AC_ARG_ENABLE(malloc-replacement,
[malloc_replacement=$enableval], [malloc_replacement=check])
if [[ $malloc_replacement = check ]]; then
# We currently do not support dlmalloc on Windows and Mac OS.
+ # It works on FreeBSD, but is slower than the polling fallback,
+ # it has been disabled by default.
case $host in
- *-*-darwin* | *-mingw*) malloc_replacement=no;;
+ *-*-*bsd* | *-*-darwin* | *-mingw*) malloc_replacement=no;;
*) malloc_replacement=yes;;
esac
fi
@@ -422,8 +424,8 @@ else
AC_DEFINE(HAVE_PROCFS, 1, [Whether procfs (/proc) is supported])
;;
*-*-*bsd*)
- AC_CHECK_HEADERS([sys/types.h sys/sysctl.h])
- AC_CHECK_FUNCS([sysctl])
+ AC_CHECK_HEADERS([sys/types.h sys/user.h sys/sysctl.h])
+ AC_CHECK_FUNCS([sysconf sysctl])
;;
*-*-darwin*)
AC_CHECK_HEADERS([mach/mach.h mach/message.h mach/kern_return.h mach/task_info.h])
diff --git a/src/memory.c b/src/memory.c
index 6b02a25..6d7645c 100644
--- a/src/memory.c
+++ b/src/memory.c
@@ -60,6 +60,9 @@
#ifdef HAVE_SYS_TYPES_H
#include <sys/types.h>
#endif
+#ifdef HAVE_SYS_USER_H
+#include <sys/user.h>
+#endif
#ifdef HAVE_SYS_SYSCTL_H
#include <sys/sysctl.h>
#endif
@@ -463,23 +466,33 @@ teco_memory_get_usage(void)
#define NEED_POLL_THREAD
-#elif defined(G_OS_UNIX) && defined(HAVE_SYSCTL)
+#elif defined(G_OS_UNIX) && defined(HAVE_SYSCONF) && defined(HAVE_SYSCTL)
/*
* Practically only for FreeBSD.
*
- * FIXME: Is this even critical or can we link in dlmalloc?
+ * The malloc replacement via dlmalloc also works on FreeBSD,
+ * but this implementation has been benchmarked to be up to 4 times faster
+ * (but only if we poll in a separate thread).
+ * On the downside, this will of course be less precise.
*/
static gsize
teco_memory_get_usage(void)
{
+ static long page_size = 0;
+
+ if (G_UNLIKELY(!page_size))
+ page_size = sysconf(_SC_PAGESIZE);
+
struct kinfo_proc procstk;
size_t len = sizeof(procstk);
int pidinfo[] = {CTL_KERN, KERN_PROC, KERN_PROC_PID, getpid()};
- sysctl(pidinfo, G_N_ELEMENTS(pidinfo), &procstk, &len, NULL, 0);
+ if (G_UNLIKELY(sysctl(pidinfo, G_N_ELEMENTS(pidinfo),
+ &procstk, &len, NULL, 0) < 0))
+ return 0;
- return procstk.ki_rssize; // FIXME: Which unit?
+ return procstk.ki_rssize * page_size;
}
#define NEED_POLL_THREAD