[erlang-questions] New OTP app available at GitHub: riak_err

Scott Lystig Fritchie fritchie@REDACTED
Fri Nov 12 18:57:02 CET 2010


Max Lapshin <max.lapshin@REDACTED> wrote:

ml> format("** Generic server ~p terminating \n" ...

ml> Here Msg, State and Reason1 can be horribly big, that is why we
ml> _must_ limit them right here and ...

"Must"?  Hmmm.  That depends.  I agree that it would be a good idea.
But looking at the R13B04 code, that format() call is actually a call to
lib:format(), which sends a message to error_logger with the format
string & args, and then error_logger does the actual formatting.  (I
hope the R14B code doesn't change this pattern....)

If the arguments are big, say X megabytes of heap space, then yes it's
bad that you'll copy X megabytes of stuff onto error_logger's heap via
sending a message.  But X is a much smaller number than the
X*ReallyBadFactor number that we get when io_lib:format() does its naive
thing when formatting the args.

ml> ... and I suppose, that best way is to print into binary inside
ml> failing gen_server because there is one error_logger per all cores
ml> and it may become a bottleneck.

The Hibari project's logging code attempts to do that, since (ignoring
memory for a moment) the formatting is much more CPU-intensive (and can
be done in parallel) than the writing-to-TTY or writing-to-disk stuff
(serialized by gen_event).

I don't know if it would be a positive thing to have the client (i.e.,
the "failing gen_server") use a iolist_to_binary() to flatten the
formatted message into a single binary (which, if larger than 64 bytes)
will be stored in the shared binary heap and thus make the message sent
to error_logger much cheaper.  In theory.  Haven't measured it.

Then there's also the matter of log-level handling, which gets tricky if
the client is making the "should I send this message to error_logger?"
decision.  Assuming a syslog-style logging scheme, if the minimum
logging level is LOG_INFO, then ... the client needs to discover that
logging level before it can decide what to do with a severity LOG_CRIT
or LOG_DEBUG message.  What if The Administrator changes the logging
level?  What if the gen_event server has both syslog-style and
non-syslog-style event handler?  {sigh}  Complexity is, er, um, tough.

-Scott


More information about the erlang-questions mailing list