<br><br><div class="gmail_quote">On Thu, Mar 19, 2009 at 10:42 AM, Ladislav Lenart <span dir="ltr"><<a href="mailto:lenartlad@volny.cz">lenartlad@volny.cz</a>></span> wrote:<br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
Hi,<br>
<br>
here are my thought vut I am by no means an Erlang expert...<br>
<br>
1. I'd say that using gen_server has no visible memory or performance<br>
overhead compared to raw Erlang processes. It is more a question of<br>
whether gen_server way of handling incoming messages in order as they<br>
come suits your needs. Also you can make a raw Erlang process into an<br>
OTP-aware process using proc_lib.<br>
<br>
2. I think that process_info reports all memory allocated by the<br>
process. From my experience a process roughly uses twice as much<br>
memory as it needs.</blockquote><div><br>Doubling memory footprint depends in way how Erlang GC works. It is trade-off between scalability and soft real-time characteristics and memory footprint.<br><br></div><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
This can be quite a lot for a large number of<br>
processes. If only a handful of processes are active in any given<br>
time, you could use erlang:hibernate/3 for a raw Erlang process<br>
or specify hibernate instead of timeout in gen_server return tuple.<br>
<br>
3. This is the most interesting part. Just to clarify, by closure I<br>
mean fun (...) -> ... end. If you are sending funs between processes<br>
then things can get interesting because beside the code pointer also<br>
the lexical scope of the function is sent over the wire. And in order<br>
to be sent it has to be serialized first. During this serialization,<br>
the "data identity" is not preserved. So if you use complex structure<br>
that contains multiple identical parts the scope will be larger after<br>
the serialization. This is true for any Erlang term. Example: [A, A,<br>
A, A] where A is bound to some tuple. If you send this as a message,<br>
the receiver will get [A1, A2, A3, A4, A5] where all received As are<br>
equal but no longer point to the same memory location.<br>
<br>
4. None that I know of.<br>
<br>
<br>
HTH,<br>
<br>
Ladislav Lenart<br>
<div class="im"><br>
<br>
Matt Handler wrote:<br>
> I'm trying to cut down on the process memory usage for a non-relational<br>
> database i'm working on.  essentially there are 10,000 processes (setup<br>
> as gen_servers) that send information to each other in various ways.  i<br>
> have several questions:<br>
><br>
</div>>    1. how much of an overhead does using the gen_server model assert?<br>
<div class="im">>       if i'm not as worried about dynamic code loading, supervising,<br>
>       etc... am i wasting memory and processing using the gen_server?<br>
</div>>    2. how/where can i find out more information about the memory usage<br>
<div class="im">>       of a process?  i've used process_info/2 heavily to gather some of<br>
>       this information, but my problem is that if i look at the rough<br>
>       size of the state of a process (using erlang:iolist_size/1), it's<br>
>       significantly less than the size of the process as reported by<br>
>       process_info/2.  i want to know where the rest of the memory is<br>
>       being eaten up (initially the processes are only 1k), on average,<br>
>       the process size is about 4x the state size.<br>
</div>>    3. i am passing around many closures between the nodes of the<br>
<div class="im">>       database, and they are getting to be quite large (start out as<br>
>       100bytes, end up as 40kbytes).  these are what is taking up most<br>
>       of the memory of the state, and so i'm wondering if there is some<br>
>       inner workings of the erlang system that make this a bad way of<br>
>       programming in terms of memory usage.  it seems like there are<br>
>       certain situations that make closures take up a lot of memory, but<br>
>       i'm having trouble pinpointing when.<br>
</div>>    4. is there a good tool out there for profiling the memory usage<br>
<div class="im">>       rather than executiontime usage?<br>
><br>
> thanks for the help,<br>
> -matt handler<br>
><br>
><br>
</div>> ------------------------------------------------------------------------<br>
><br>
> _______________________________________________<br>
> erlang-questions mailing list<br>
> <a href="mailto:erlang-questions@erlang.org">erlang-questions@erlang.org</a><br>
> <a href="http://www.erlang.org/mailman/listinfo/erlang-questions" target="_blank">http://www.erlang.org/mailman/listinfo/erlang-questions</a><br>
<br>
<br>
_______________________________________________<br>
erlang-questions mailing list<br>
<a href="mailto:erlang-questions@erlang.org">erlang-questions@erlang.org</a><br>
<a href="http://www.erlang.org/mailman/listinfo/erlang-questions" target="_blank">http://www.erlang.org/mailman/listinfo/erlang-questions</a><br>
</blockquote></div><br><br clear="all"><br>-- <br>--Hynek (Pichi) Vychodil<br><br>Analyze your data in minutes. Share your insights instantly. Thrill your boss.  Be a data hero!<br>Try Good Data now for free: <a href="http://www.gooddata.com">www.gooddata.com</a><br>