All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Pádraig Brady" <P@draigBrady.com>
To: Bernhard Voelker <mail@bernhard-voelker.de>,
	Coreutils <coreutils@gnu.org>, bug-gnulib <bug-gnulib@gnu.org>,
	util-linux <util-linux@vger.kernel.org>,
	Fridolin Pokorny <fpokorny@redhat.com>
Subject: large overhead in libmount
Date: Tue, 20 Jan 2015 02:01:13 +0000	[thread overview]
Message-ID: <54BDB6E9.4070500@draigBrady.com> (raw)
In-Reply-To: <54A321DC.4020300@bernhard-voelker.de>

[-- Attachment #1: Type: text/plain, Size: 1863 bytes --]

On 30/12/14 22:06, Bernhard Voelker wrote:
> I just pulled the recent gnulib update, and now the above, expensive
> test fails:
> 
>    + ulimit -v 40000
>    + du -sh d
>    du: fts_read failed: d: Cannot allocate memory
>    + fail=1
> 
> I guess this due to the inclusion of libmount?

Yes I get the same issue in that test:
http://git.sv.gnu.org/gitweb/?p=coreutils.git;a=blob;f=tests/rm/many-dir-entries-vs-OOM.sh

Indeed there is significant overhead in using libmount as shown below.
This is a crazy amount of overhead just to read /proc/self/mountinfo,
and is the sort of creeping dependencies I hate.  The proposed solution
in the attached gnulib patch, is to require ./configure --with-libmount
to enable this feature. I.E. it's disabled by default.

cheers,
Pádraig

======= without =========
$ (ulimit -v 5380; du -s .)

$ ldd /usr/bin/du
linux-vdso.so.1 =>  (0x00007fff0d7fe000)
libc.so.6 => /lib64/libc.so.6 (0x00007fd414a32000)
/lib64/ld-linux-x86-64.so.2 (0x00007fd414e0b000)

$ time du -s src/du.c >/dev/null
real    0m0.003s
user    0m0.000s
sys     0m0.003s

======= with =========
$ (ulimit -v 23250; src/du -s .)

$ ldd src/du
linux-vdso.so.1 =>  (0x00007fff76ca8000)
libc.so.6 => /lib64/libc.so.6 (0x00007f2a1f742000)
/lib64/ld-linux-x86-64.so.2 (0x00007f2a1fd61000)
 libmount.so.1 => /lib64/libmount.so.1 (0x00007f2a1faff000)
  libblkid.so.1 => /lib64/libblkid.so.1 (0x00007f2a1f501000)
  libuuid.so.1 => /lib64/libuuid.so.1 (0x00007f2a1f2fc000)
  libselinux.so.1 => /lib64/libselinux.so.1 (0x00007f2a1f0d7000)
  libpcre.so.1 => /lib64/libpcre.so.1 (0x00007f2a1ee69000)
  liblzma.so.5 => /lib64/liblzma.so.5 (0x00007f2a1ec44000)
  libdl.so.2 => /lib64/libdl.so.2 (0x00007f2a1ea40000)
  libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f2a1e823000)

$ time src/du -s src/du.c >/dev/null
real    0m0.006s
user    0m0.001s
sys     0m0.005s


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: gnulib-optional-libmount.patch --]
[-- Type: text/x-patch; name="gnulib-optional-libmount.patch", Size: 3189 bytes --]

From dcfce9422ae2b1e9eb0c8c0bc70562f48b54fad4 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?P=C3=A1draig=20Brady?= <P@draigBrady.com>
Date: Tue, 20 Jan 2015 01:40:54 +0000
Subject: [PATCH] mountlist: only use libmount when specified

libmount can propagate device IDs provided by Linux in
/proc/self/mountinfo.  However there are currently many
shared libs dependencies introduced by libmount with
associated runtime and virt mem overhead.  Therefore don't
enable by default.

* m4/ls-mntd-fs.m4: Use --with-libmount to enable at build time.
Note the ac_cv_lib_libmount_mnt_table_parse_stream cache variable
had a typo and so was ineffective, thus there is no backwards
compatibility issue.
---
 ChangeLog        |  8 ++++++++
 m4/ls-mntd-fs.m4 | 26 ++++++++++++++++----------
 2 files changed, 24 insertions(+), 10 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 3a7ee14..801f7c0 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2015-01-20  Pádraig Brady  <P@draigBrady.com>
+
+	mountlist: only use libmount when specified
+	There are currently many shared libs dependencies introduced by
+	libmount with associated runtime and virt mem overhead.
+	Therefore don't enable by default.
+	* m4/ls-mntd-fs.m4: Use --with-libmount to enable at build time.
+
 2015-01-15  Paul Eggert  <eggert@cs.ucla.edu>
 
 	time: port to MinGW32 3.21
diff --git a/m4/ls-mntd-fs.m4 b/m4/ls-mntd-fs.m4
index 0cc7ae2..59a951e 100644
--- a/m4/ls-mntd-fs.m4
+++ b/m4/ls-mntd-fs.m4
@@ -153,17 +153,23 @@ if test $ac_cv_func_getmntent = yes; then
          (4.3BSD, SunOS, HP-UX, Dynix, Irix)])
       AC_CHECK_FUNCS([hasmntopt])
 
+      AC_ARG_WITH([libmount],
+        [AS_HELP_STRING([--with-libmount],
+          [use libmount if available to parse the system mount list.])],
+        [],
+        dnl libmount has the advantage of propagating accurate device IDs for
+        dnl each entry, but the disadvantage of many dependent shared libs
+        dnl with associated runtime startup overhead and virt mem usage.
+        [with_libmount=no])
+
       # Check for libmount to support /proc/self/mountinfo on Linux
-      AC_CACHE_VAL([ac_cv_lib_libmount_mnt_table_parse_stream],
-        [AC_CHECK_LIB([mount], [mnt_new_table_from_file],
-          ac_cv_lib_mount_mnt_table_parse_stream=yes,
-          ac_cv_lib_mount_mnt_table_parse_stream=no)])
-      if test $ac_cv_lib_mount_mnt_table_parse_stream = yes; then
-         AC_DEFINE([MOUNTED_PROC_MOUNTINFO], [1],
-           [Define if want to use /proc/self/mountinfo on Linux.])
-         LIBS="-lmount $LIBS"
-      elif test -f /proc/self/mountinfo; then
-         AC_MSG_WARN([/proc/self/mountinfo present but libmount is missing.])
+      if test "x$with_libmount" != xno; then
+        AC_CHECK_LIB([mount], [mnt_new_table_from_file],
+           [AC_DEFINE([MOUNTED_PROC_MOUNTINFO], [1],
+             [Define if want to use /proc/self/mountinfo on Linux.])
+            LIBS="-lmount $LIBS"],
+           [test -f /proc/self/mountinfo &&
+             AC_MSG_WARN([/proc/self/mountinfo present but libmount missing.])])
       fi
     fi
   fi
-- 
2.1.0


       reply	other threads:[~2015-01-20  2:01 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <54A321DC.4020300@bernhard-voelker.de>
2015-01-20  2:01 ` Pádraig Brady [this message]
2015-04-02 10:05   ` large overhead in libmount Karel Zak
2015-04-02 11:36     ` Pádraig Brady
2015-04-07 10:29       ` Karel Zak
2015-04-07 11:00         ` Daniel J Walsh

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=54BDB6E9.4070500@draigBrady.com \
    --to=p@draigbrady.com \
    --cc=bug-gnulib@gnu.org \
    --cc=coreutils@gnu.org \
    --cc=fpokorny@redhat.com \
    --cc=mail@bernhard-voelker.de \
    --cc=util-linux@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.