How interesting! Thank you for that.

On Sat, Apr 29, 2017 at 4:04 PM Bryan Henderson <bry...@giraffe-data.com>
wrote:

> A few months ago, I posted here asking why the Ceph program takes so much
> memory (virtual, real, and address space) for what seems to be a simple
> task.
> Nobody knew, but I have done extensive research and I have the answer now,
> and
> thought I would publish it here.
>
> All it takes to do a Ceph "status" command is to create a TCP connection to
> the monitor, do a small login handshake, send a JSON document that says
> "status command", and receive and print the text response.  This could be
> done
> in 64K with maybe a few megabytes of additional address space for the
> shared
> C library.
>
> If you do it with a 'ceph status' command, though, in the Hammer release it
> has a 700M peak address space usage (though it varies a lot from one run to
> the next) and uses 60M of real memory.
>
> The reason for this is that the Ceph program uses facilities in the
> librados
> library that are meant for much more than just performing a command.  These
> facilities are meant to be used by a full-blown server that is a Ceph
> client.
> The facilities deal with locating a monitor within a cluster and failing
> over
> when that monitor dies; they interpret the Ceph configuration file and
> adjust
> dynamically when that file changes; they do logging; and more.  When you
> type
> 'ceph status', you are building a sophisticated command-issuing machine,
> having it issue one command, and then tearing it down.
>
> 'ceph creates about 20 threads.  They are asynchronous enough that in some
> runs, multiple threads exist at the same time and in other ones, they exist
> serially.  This is why peak memory usage varies from one run to the next.
> In
> its quiescent state, ready to perform a command, the program has 13 threads
> standing by for various purposes.  Each of these has 8M of virtual memory
> reserved for its stack and most have 64M for a heap.
>
> Finally, there is a lock auditor facility ("lockdep") that watches for
> locks
> being acquired out of order, as evidence of a bug in the code.  This
> facility
> is not optional; it is always there.  To keep track of all the locking, it
> sets up a 2000x2000 array (2000 being an upper limit on the number of locks
> the program might contain).  That's 32M of real memory.  I read in a forum
> that this has been greatly reduced in later releases.
>
>
> I was able to reduce the usage to 130M address space and 9M of real memory,
> while still using most of the same librados code to do the work, by
> creating a
> stripped-down version of the librados 'MonClient' class, setting the
> maximum
> thread stack size to 1M with rlimits, and making the threads share a heap
> with
> the MALLOC_ARENA_MAX environment variable.  I also disabled lockdep.
>
>
> I just thought this might be interesting to someone searching the archives
> for
> memory usage information.
>
>
> --
> Bryan Henderson                                   San Jose, California
> _______________________________________________
> ceph-users mailing list
> ceph-users@lists.ceph.com
> http://lists.ceph.com/listinfo.cgi/ceph-users-ceph.com
>
_______________________________________________
ceph-users mailing list
ceph-users@lists.ceph.com
http://lists.ceph.com/listinfo.cgi/ceph-users-ceph.com

Reply via email to