From 9af33ee78c395af715e7b861f4e32272559e1fe9 Mon Sep 17 00:00:00 2001 From: Mark Salyzyn Date: Wed, 5 Oct 2016 12:34:37 -0700 Subject: [PATCH] logd: report logging memory overhead On 64 bit system, calculates to roughly 80 bytes of metadata and list overhead for each entry. In unit test example, we report 3388987 bytes of logging data and overhead total, showmap reports 4652K of dirty data. We still want to account for the remainder (fragmentation, other sources of internal allocations etc). Test: see values and check math Bug: 31942525 Change-Id: I75f3162ce691faf1ae5a5dec18939fea535ede7e --- logd/LogStatistics.cpp | 103 +++++++++++++++++++++++++---------------- 1 file changed, 64 insertions(+), 39 deletions(-) diff --git a/logd/LogStatistics.cpp b/logd/LogStatistics.cpp index c6ebd52dc..f69bc5046 100644 --- a/logd/LogStatistics.cpp +++ b/logd/LogStatistics.cpp @@ -21,6 +21,8 @@ #include #include +#include + #include #include "LogStatistics.h" @@ -467,55 +469,86 @@ std::string LogStatistics::format(uid_t uid, pid_t pid, short spaces = 1; log_id_for_each(id) { - if (!(logMask & (1 << id))) { - continue; - } + if (!(logMask & (1 << id))) continue; oldLength = output.length(); - if (spaces < 0) { - spaces = 0; - } + if (spaces < 0) spaces = 0; output += android::base::StringPrintf("%*s%s", spaces, "", android_log_id_to_name(id)); spaces += spaces_total + oldLength - output.length(); } + if (spaces < 0) spaces = 0; + output += android::base::StringPrintf("%*sTotal", spaces, ""); - spaces = 4; - output += "\nTotal"; + static const char TotalStr[] = "\nTotal"; + spaces = 10 - strlen(TotalStr); + output += TotalStr; + size_t totalSize = 0; + size_t totalEls = 0; log_id_for_each(id) { - if (!(logMask & (1 << id))) { - continue; - } + if (!(logMask & (1 << id))) continue; oldLength = output.length(); - if (spaces < 0) { - spaces = 0; - } - output += android::base::StringPrintf("%*s%zu/%zu", spaces, "", - sizesTotal(id), - elementsTotal(id)); + if (spaces < 0) spaces = 0; + size_t szs = sizesTotal(id); + totalSize += szs; + size_t els = elementsTotal(id); + totalEls += els; + output += android::base::StringPrintf("%*s%zu/%zu", spaces, "", szs, els); spaces += spaces_total + oldLength - output.length(); } + if (spaces < 0) spaces = 0; + output += android::base::StringPrintf("%*s%zu/%zu", spaces, "", totalSize, totalEls); - spaces = 6; - output += "\nNow"; + static const char NowStr[] = "\nNow"; + spaces = 10 - strlen(NowStr); + output += NowStr; + totalSize = 0; + totalEls = 0; log_id_for_each(id) { - if (!(logMask & (1 << id))) { - continue; - } + if (!(logMask & (1 << id))) continue; size_t els = elements(id); if (els) { oldLength = output.length(); - if (spaces < 0) { - spaces = 0; - } - output += android::base::StringPrintf("%*s%zu/%zu", spaces, "", - sizes(id), els); + if (spaces < 0) spaces = 0; + size_t szs = sizes(id); + totalSize += szs; + totalEls += els; + output += android::base::StringPrintf("%*s%zu/%zu", spaces, "", szs, els); spaces -= output.length() - oldLength; } spaces += spaces_total; } + if (spaces < 0) spaces = 0; + output += android::base::StringPrintf("%*s%zu/%zu", spaces, "", totalSize, totalEls); + + static const char OverheadStr[] = "\nOverhead"; + spaces = 10 - strlen(OverheadStr); + output += OverheadStr; + + totalSize = 0; + log_id_for_each(id) { + if (!(logMask & (1 << id))) continue; + + size_t els = elements(id); + if (els) { + oldLength = output.length(); + if (spaces < 0) spaces = 0; + // estimate the std::list overhead. + static const size_t overhead = + ((sizeof(LogBufferElement) + sizeof(uint64_t) - 1) & + -sizeof(uint64_t)) + + sizeof(std::list); + size_t szs = sizes(id) + els * overhead; + totalSize += szs; + output += android::base::StringPrintf("%*s%zu", spaces, "", szs); + spaces -= output.length() - oldLength; + } + spaces += spaces_total; + } + if (spaces < 0) spaces = 0; + output += android::base::StringPrintf("%*s%zu", spaces, "", totalSize); // Report on Chattiest @@ -523,9 +556,7 @@ std::string LogStatistics::format(uid_t uid, pid_t pid, // Chattiest by application (UID) log_id_for_each(id) { - if (!(logMask & (1 << id))) { - continue; - } + if (!(logMask & (1 << id))) continue; name = (uid == AID_ROOT) ? "Chattiest UIDs in %s log buffer:" @@ -539,27 +570,21 @@ std::string LogStatistics::format(uid_t uid, pid_t pid, : "Logging for this PID:"; output += pidTable.format(*this, uid, pid, name); name = "Chattiest TIDs"; - if (pid) { - name += android::base::StringPrintf(" for PID %d", pid); - } + if (pid) name += android::base::StringPrintf(" for PID %d", pid); name += ":"; output += tidTable.format(*this, uid, pid, name); } if (enable && (logMask & (1 << LOG_ID_EVENTS))) { name = "Chattiest events log buffer TAGs"; - if (pid) { - name += android::base::StringPrintf(" for PID %d", pid); - } + if (pid) name += android::base::StringPrintf(" for PID %d", pid); name += ":"; output += tagTable.format(*this, uid, pid, name, LOG_ID_EVENTS); } if (enable && (logMask & (1 << LOG_ID_SECURITY))) { name = "Chattiest security log buffer TAGs"; - if (pid) { - name += android::base::StringPrintf(" for PID %d", pid); - } + if (pid) name += android::base::StringPrintf(" for PID %d", pid); name += ":"; output += securityTagTable.format(*this, uid, pid, name, LOG_ID_SECURITY); }