| Index: base/trace_event/memory_peak_detector.h
|
| diff --git a/base/trace_event/memory_peak_detector.h b/base/trace_event/memory_peak_detector.h
|
| index b91429583322549619e7f91da7eb45af953696aa..d2da9ca0c9985b028f00f6e429dcf545d63757ba 100644
|
| --- a/base/trace_event/memory_peak_detector.h
|
| +++ b/base/trace_event/memory_peak_detector.h
|
| @@ -23,6 +23,13 @@ namespace trace_event {
|
|
|
| struct MemoryDumpProviderInfo;
|
|
|
| +// Detects temporally local memory peaks. Peak detection is based on
|
| +// continuously querying memory usage using MemoryDumpprovider(s) that support
|
| +// fast polling (e.g., ProcessMetricsDumpProvider which under the hoods reads
|
| +// /proc/PID/statm on Linux) and using a cobination of:
|
| +// - An static threshold (currently 1% of total system memory).
|
| +// - Sliding window stddev analysis.
|
| +// Design doc: https://goo.gl/0kOU4A .
|
| // This class is NOT thread-safe, the caller has to ensure linearization of
|
| // the calls to the public methods. In any case, the public methods do NOT have
|
| // to be called from the |task_runner| on which the polling tasks run.
|
| @@ -39,6 +46,21 @@ class BASE_EXPORT MemoryPeakDetector {
|
| RUNNING // After Start(). The PollMemoryAndDetectPeak() task is scheduled.
|
| };
|
|
|
| + // Peak detector configuration, passed to Start().
|
| + struct Config {
|
| + // The rate at which memory will be polled. Polls will happen on the task
|
| + // runner passed to Setup().
|
| + uint32_t polling_interval_ms;
|
| +
|
| + // Two consecutive peak detection callbacks will happen at least
|
| + // |min_time_between_peaks_ms| apart from each other.
|
| + uint32_t min_time_between_peaks_ms;
|
| +
|
| + // When enabled causes a TRACE_COUNTER event to be injected in the trace
|
| + // for each poll (if tracing is enabled).
|
| + bool enable_verbose_poll_tracing;
|
| + };
|
| +
|
| static MemoryPeakDetector* GetInstance();
|
|
|
| // Configures the peak detector, binding the polling tasks on the given
|
| @@ -66,7 +88,7 @@ class BASE_EXPORT MemoryPeakDetector {
|
| // If not, the detector remains in the ENABLED state and will start polling
|
| // automatically (i.e. without requiring another call to Start()) on the
|
| // next call to NotifyMemoryDumpProvidersChanged().
|
| - void Start();
|
| + void Start(Config);
|
|
|
| // Stops the polling on the task runner (if was active at all). This doesn't
|
| // wait for the task runner to drain pending tasks, so it is possible that
|
| @@ -75,24 +97,34 @@ class BASE_EXPORT MemoryPeakDetector {
|
| // with the task runner.
|
| void Stop();
|
|
|
| + // If Start()-ed, prevents that a peak callback is triggered before the next
|
| + // |min_time_between_peaks_ms|. No-op if the peak detector is not enabled.
|
| + void Throttle();
|
| +
|
| // Used by MemoryDumpManager to notify that the list of polling-capable dump
|
| // providers has changed. The peak detector will reload the list on the next
|
| // polling task. This function can be called before Setup(), in which
|
| // case will be just a no-op.
|
| void NotifyMemoryDumpProvidersChanged();
|
|
|
| + void SetStaticThresholdForTesting(uint64_t static_threshold_bytes);
|
| +
|
| private:
|
| friend class MemoryPeakDetectorTest;
|
|
|
| + static constexpr uint32_t kSlidingWindowNumSamples = 50;
|
| +
|
| MemoryPeakDetector();
|
| ~MemoryPeakDetector();
|
|
|
| // All these methods are always called on the |task_runner_|.
|
| - void StartInternal();
|
| + void StartInternal(Config);
|
| void StopInternal();
|
| void TearDownInternal();
|
| void ReloadDumpProvidersAndStartPollingIfNeeded();
|
| void PollMemoryAndDetectPeak(uint32_t expected_generation);
|
| + bool DetectPeakUsingSlidingWindowStddev(uint64_t last_sample_bytes);
|
| + void ResetPollHistory(bool keep_last_sample = false);
|
|
|
| // It is safe to call these testing methods only on the |task_runner_|.
|
| State state_for_testing() const { return state_; }
|
| @@ -127,7 +159,15 @@ class BASE_EXPORT MemoryPeakDetector {
|
| uint32_t generation_;
|
|
|
| State state_;
|
| - uint32_t polling_interval_ms_;
|
| +
|
| + // Config passed to Start(), only valid when |state_| = {ENABLED, RUNNING}.
|
| + Config config_;
|
| +
|
| + uint64_t static_threshold_bytes_;
|
| + uint32_t skip_polls_;
|
| + uint64_t last_dump_memory_total_;
|
| + uint64_t samples_bytes_[kSlidingWindowNumSamples];
|
| + uint32_t samples_index_;
|
| uint32_t poll_tasks_count_for_testing_;
|
|
|
| DISALLOW_COPY_AND_ASSIGN(MemoryPeakDetector);
|
|
|