Index: components/memory_pressure/direct_memory_pressure_calculator_linux.cc |
diff --git a/components/memory_pressure/direct_memory_pressure_calculator_linux.cc b/components/memory_pressure/direct_memory_pressure_calculator_linux.cc |
deleted file mode 100644 |
index 358d655c1e67d8577fe04f18c2c813a99ac976c4..0000000000000000000000000000000000000000 |
--- a/components/memory_pressure/direct_memory_pressure_calculator_linux.cc |
+++ /dev/null |
@@ -1,169 +0,0 @@ |
-// Copyright 2016 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "components/memory_pressure/direct_memory_pressure_calculator_linux.h" |
- |
-#include "base/files/file_util.h" |
-#include "base/process/process_metrics.h" |
-#include "base/strings/string_number_conversions.h" |
-#include "base/strings/string_split.h" |
-#include "base/strings/string_util.h" |
-#include "base/sys_info.h" |
-#include "base/threading/thread_restrictions.h" |
- |
-namespace memory_pressure { |
- |
-namespace { |
- |
-const int kKiBperMiB = 1024; |
- |
-// Used to calculate a moving average of faults/sec. Our sample times are |
-// inconsistent because MemoryPressureMonitor calls |
-// CalculateCurrentPressureLevel more frequently when memory pressure is high, |
-// and because we're measuring CPU time instead of real time. So our |
-// exponentially weighted moving average is generalized to a low-pass filter. |
-// |
-// Represents the amount of CPU time, in seconds, for a sample to be 50% |
-// forgotten in our moving average. Systems with more CPUs that are under high |
-// load will have a moving average that changes more quickly than a system with |
-// fewer CPUs under the same load. Do not normalize based on the number of CPUs |
-// because this behavior is accurate: if a system with a large number of CPUs |
-// is getting lots of work done without page faulting, it must not be under |
-// memory pressure. |
-// |
-// TODO(thomasanderson): Experimentally determine the correct value for this |
-// constant. |
-const double kLowPassHalfLife = 30.0; |
- |
-// Returns the amount of memory that is available for use right now, or that can |
-// be easily reclaimed by the OS, in MBs. |
-int GetAvailableSystemMemoryMiB(const base::SystemMemoryInfoKB* mem_info) { |
- return mem_info->available |
- ? mem_info->available / kKiBperMiB |
- : (mem_info->free + mem_info->buffers + mem_info->cached) / |
- kKiBperMiB; |
-} |
- |
-} // namespace |
- |
-// Thresholds at which we consider the system being under moderate/critical |
-// memory pressure. They represent the percentage of system memory in use. |
-const int DirectMemoryPressureCalculator::kDefaultModerateThresholdPc = 70; |
-const int DirectMemoryPressureCalculator::kDefaultCriticalThresholdPc = 90; |
- |
-DirectMemoryPressureCalculator::DirectMemoryPressureCalculator() |
- : moderate_threshold_mb_(0), |
- critical_threshold_mb_(0) { |
- InferThresholds(); |
- InitPageFaultMonitor(); |
-} |
- |
-DirectMemoryPressureCalculator::DirectMemoryPressureCalculator( |
- int moderate_threshold_mb, |
- int critical_threshold_mb) |
- : moderate_threshold_mb_(moderate_threshold_mb), |
- critical_threshold_mb_(critical_threshold_mb) { |
- DCHECK_GE(moderate_threshold_mb_, critical_threshold_mb_); |
- DCHECK_LE(0, critical_threshold_mb_); |
- InitPageFaultMonitor(); |
-} |
- |
-DirectMemoryPressureCalculator::MemoryPressureLevel |
-DirectMemoryPressureCalculator::PressureCausedByThrashing( |
- const base::SystemMemoryInfoKB& mem_info) { |
- base::TimeDelta new_user_exec_time = GetUserCpuTimeSinceBoot(); |
- if (new_user_exec_time == base::TimeDelta()) |
- return MemoryPressureListener::MEMORY_PRESSURE_LEVEL_NONE; |
- uint64_t new_major_page_faults = mem_info.pgmajfault; |
- if (new_user_exec_time != base::TimeDelta() && new_major_page_faults && |
- (new_user_exec_time - last_user_exec_time_) != base::TimeDelta()) { |
- double delta_user_exec_time = |
- (new_user_exec_time - last_user_exec_time_).InSecondsF(); |
- double delta_major_page_faults = |
- new_major_page_faults - last_major_page_faults_; |
- |
- double sampled_faults_per_second = |
- delta_major_page_faults / delta_user_exec_time; |
- |
- double adjusted_ewma_coefficient = |
- 1 - exp2(-delta_user_exec_time / low_pass_half_life_seconds_); |
- |
- current_faults_per_second_ = |
- adjusted_ewma_coefficient * sampled_faults_per_second + |
- (1 - adjusted_ewma_coefficient) * current_faults_per_second_; |
- |
- last_user_exec_time_ = new_user_exec_time; |
- last_major_page_faults_ = new_major_page_faults; |
- } |
- |
- if (current_faults_per_second_ > |
- critical_multiplier_ * AverageFaultsPerSecond()) { |
- return MemoryPressureListener::MEMORY_PRESSURE_LEVEL_CRITICAL; |
- } |
- if (current_faults_per_second_ > |
- moderate_multiplier_ * AverageFaultsPerSecond()) { |
- return MemoryPressureListener::MEMORY_PRESSURE_LEVEL_MODERATE; |
- } |
- return MemoryPressureListener::MEMORY_PRESSURE_LEVEL_NONE; |
-} |
- |
-DirectMemoryPressureCalculator::MemoryPressureLevel |
-DirectMemoryPressureCalculator::PressureCausedByOOM( |
- const base::SystemMemoryInfoKB& mem_info) { |
- int phys_free = GetAvailableSystemMemoryMiB(&mem_info); |
- |
- if (phys_free <= critical_threshold_mb_) |
- return MemoryPressureListener::MEMORY_PRESSURE_LEVEL_CRITICAL; |
- if (phys_free <= moderate_threshold_mb_) |
- return MemoryPressureListener::MEMORY_PRESSURE_LEVEL_MODERATE; |
- return MemoryPressureListener::MEMORY_PRESSURE_LEVEL_NONE; |
-} |
- |
-DirectMemoryPressureCalculator::MemoryPressureLevel |
-DirectMemoryPressureCalculator::CalculateCurrentPressureLevel() { |
- base::SystemMemoryInfoKB mem_info = {}; |
- if (!GetSystemMemoryInfo(&mem_info)) |
- return MemoryPressureListener::MEMORY_PRESSURE_LEVEL_NONE; |
- |
- return std::max(PressureCausedByThrashing(mem_info), |
- PressureCausedByOOM(mem_info)); |
-} |
- |
-bool DirectMemoryPressureCalculator::GetSystemMemoryInfo( |
- base::SystemMemoryInfoKB* mem_info) const { |
- return base::GetSystemMemoryInfo(mem_info); |
-} |
- |
-base::TimeDelta DirectMemoryPressureCalculator::GetUserCpuTimeSinceBoot() |
- const { |
- return base::GetUserCpuTimeSinceBoot(); |
-} |
- |
-void DirectMemoryPressureCalculator::InferThresholds() { |
- base::SystemMemoryInfoKB mem_info = {}; |
- if (!GetSystemMemoryInfo(&mem_info)) |
- return; |
- |
- moderate_threshold_mb_ = |
- mem_info.total * (100 - kDefaultModerateThresholdPc) / 100 / kKiBperMiB; |
- critical_threshold_mb_ = |
- mem_info.total * (100 - kDefaultCriticalThresholdPc) / 100 / kKiBperMiB; |
-} |
- |
-void DirectMemoryPressureCalculator::InitPageFaultMonitor() { |
- low_pass_half_life_seconds_ = kLowPassHalfLife; |
- last_user_exec_time_ = GetUserCpuTimeSinceBoot(); |
- base::SystemMemoryInfoKB mem_info = {}; |
- last_major_page_faults_ = |
- GetSystemMemoryInfo(&mem_info) ? mem_info.pgmajfault : 0; |
- current_faults_per_second_ = AverageFaultsPerSecond(); |
-} |
- |
-double DirectMemoryPressureCalculator::AverageFaultsPerSecond() const { |
- return last_major_page_faults_ == 0 |
- ? last_user_exec_time_.InSecondsF() / last_major_page_faults_ |
- : 0; |
-} |
- |
-} // namespace memory_pressure |