From 58b8be8906f903ac3d83c41bcb0fb9c7841945f0 Mon Sep 17 00:00:00 2001 From: Mark Salyzyn Date: Wed, 30 Sep 2015 07:40:09 -0700 Subject: [PATCH] logd: correct for number of elements in prune Chatty logs would distort the average log size by elevating the elements, but not the size. Add statistical collection for the number of elements that report chatty, and subtract that from the number of elements to improve the pruning estimate. Pick minElements as 1% rather than 10% of the total with this more accurate number of elements, to a minumum of 4. Bug: 24511000 Change-Id: I3f36558138aa0b2a50e4fac6440c3a8505d95276 --- logd/LogBuffer.cpp | 7 +++++-- logd/LogBuffer.h | 1 + logd/LogStatistics.cpp | 5 +++++ logd/LogStatistics.h | 10 +++++++++- 4 files changed, 20 insertions(+), 3 deletions(-) diff --git a/logd/LogBuffer.cpp b/logd/LogBuffer.cpp index 1b6838656..1de8e640f 100644 --- a/logd/LogBuffer.cpp +++ b/logd/LogBuffer.cpp @@ -225,8 +225,11 @@ void LogBuffer::maybePrune(log_id_t id) { unsigned long maxSize = log_buffer_size(id); if (sizes > maxSize) { size_t sizeOver = sizes - ((maxSize * 9) / 10); - size_t elements = stats.elements(id); - size_t minElements = elements / 10; + size_t elements = stats.realElements(id); + size_t minElements = elements / 100; + if (minElements < minPrune) { + minElements = minPrune; + } unsigned long pruneRows = elements * sizeOver / sizes; if (pruneRows < minElements) { pruneRows = minElements; diff --git a/logd/LogBuffer.h b/logd/LogBuffer.h index 5223b4047..7ed92e999 100644 --- a/logd/LogBuffer.h +++ b/logd/LogBuffer.h @@ -86,6 +86,7 @@ public: private: + static constexpr size_t minPrune = 4; static constexpr size_t maxPrune = 256; void maybePrune(log_id_t id); diff --git a/logd/LogStatistics.cpp b/logd/LogStatistics.cpp index c3b10ad36..fdb2576d6 100644 --- a/logd/LogStatistics.cpp +++ b/logd/LogStatistics.cpp @@ -27,6 +27,7 @@ LogStatistics::LogStatistics() : enable(false) { log_id_for_each(id) { mSizes[id] = 0; mElements[id] = 0; + mDroppedElements[id] = 0; mSizesTotal[id] = 0; mElementsTotal[id] = 0; } @@ -93,6 +94,9 @@ void LogStatistics::subtract(LogBufferElement *element) { unsigned short size = element->getMsgLen(); mSizes[log_id] -= size; --mElements[log_id]; + if (element->getDropped()) { + --mDroppedElements[log_id]; + } if (log_id == LOG_ID_KERNEL) { return; @@ -119,6 +123,7 @@ void LogStatistics::drop(LogBufferElement *element) { log_id_t log_id = element->getLogId(); unsigned short size = element->getMsgLen(); mSizes[log_id] -= size; + ++mDroppedElements[log_id]; uidTable[log_id].drop(element->getUid(), element); diff --git a/logd/LogStatistics.h b/logd/LogStatistics.h index 8b90c53b5..6943820e3 100644 --- a/logd/LogStatistics.h +++ b/logd/LogStatistics.h @@ -374,6 +374,7 @@ struct TagEntry : public EntryBase { class LogStatistics { size_t mSizes[LOG_ID_MAX]; size_t mElements[LOG_ID_MAX]; + size_t mDroppedElements[LOG_ID_MAX]; size_t mSizesTotal[LOG_ID_MAX]; size_t mElementsTotal[LOG_ID_MAX]; bool enable; @@ -404,7 +405,11 @@ public: // entry->setDropped(1) must follow this call void drop(LogBufferElement *entry); // Correct for coalescing two entries referencing dropped content - void erase(LogBufferElement *e) { --mElements[e->getLogId()]; } + void erase(LogBufferElement *element) { + log_id_t log_id = element->getLogId(); + --mElements[log_id]; + --mDroppedElements[log_id]; + } std::unique_ptr sort(size_t len, log_id id) { return uidTable[id].sort(len); @@ -413,6 +418,9 @@ public: // fast track current value by id only size_t sizes(log_id_t id) const { return mSizes[id]; } size_t elements(log_id_t id) const { return mElements[id]; } + size_t realElements(log_id_t id) const { + return mElements[id] - mDroppedElements[id]; + } size_t sizesTotal(log_id_t id) const { return mSizesTotal[id]; } size_t elementsTotal(log_id_t id) const { return mElementsTotal[id]; }