diff options
author | Shinichiro Hamaji <shinichiro.hamaji@gmail.com> | 2017-07-06 14:52:13 +0900 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-07-06 14:52:13 +0900 |
commit | 96f6656551860c40c746c1946a4e4cb131e1f4a4 (patch) | |
tree | a9621933e112d1afdd955bbbd2c77107384707f4 /src/logging.cc | |
parent | 80bec2ba45a3243180659da28dbd8ae34915b56b (diff) | |
parent | dacd29679633c9b845708e7015bd2c79367a6ea2 (diff) | |
download | glog-96f6656551860c40c746c1946a4e4cb131e1f4a4.tar.gz glog-96f6656551860c40c746c1946a4e4cb131e1f4a4.tar.bz2 glog-96f6656551860c40c746c1946a4e4cb131e1f4a4.zip |
Merge pull request #145 from pixelb/rate-limit-posix-fadvise
rate limit calls to posix_fadvise()
Diffstat (limited to 'src/logging.cc')
-rw-r--r-- | src/logging.cc | 25 |
1 files changed, 14 insertions, 11 deletions
diff --git a/src/logging.cc b/src/logging.cc index 32a5791..46a0f5a 100644 --- a/src/logging.cc +++ b/src/logging.cc @@ -114,11 +114,6 @@ GLOG_DEFINE_bool(drop_log_memory, true, "Drop in-memory buffers of log contents. "Logs can grow very quickly and they are rarely read before they " "need to be evicted from memory. Instead, drop them from memory " "as soon as they are flushed to disk."); -_START_GOOGLE_NAMESPACE_ -namespace logging { -static const int64 kPageSize = getpagesize(); -} -_END_GOOGLE_NAMESPACE_ #endif // By default, errors (including fatal errors) get logged to stderr as @@ -438,6 +433,7 @@ class LogFileObject : public base::Logger { FILE* file_; LogSeverity severity_; uint32 bytes_since_flush_; + uint32 dropped_mem_length_; uint32 file_length_; unsigned int rollover_attempt_; int64 next_flush_time_; // cycle count at which to flush log @@ -839,6 +835,7 @@ LogFileObject::LogFileObject(LogSeverity severity, file_(NULL), severity_(severity), bytes_since_flush_(0), + dropped_mem_length_(0), file_length_(0), rollover_attempt_(kRolloverAttemptFrequency-1), next_flush_time_(0) { @@ -976,7 +973,7 @@ void LogFileObject::Write(bool force_flush, PidHasChanged()) { if (file_ != NULL) fclose(file_); file_ = NULL; - file_length_ = bytes_since_flush_ = 0; + file_length_ = bytes_since_flush_ = dropped_mem_length_ = 0; rollover_attempt_ = kRolloverAttemptFrequency-1; } @@ -1116,11 +1113,17 @@ void LogFileObject::Write(bool force_flush, (CycleClock_Now() >= next_flush_time_) ) { FlushUnlocked(); #ifdef OS_LINUX - if (FLAGS_drop_log_memory) { - if (file_length_ >= logging::kPageSize) { - // don't evict the most recent page - uint32 len = file_length_ & ~(logging::kPageSize - 1); - posix_fadvise(fileno(file_), 0, len, POSIX_FADV_DONTNEED); + // Only consider files >= 3MiB + if (FLAGS_drop_log_memory && file_length_ >= (3 << 20)) { + // Don't evict the most recent 1-2MiB so as not to impact a tailer + // of the log file and to avoid page rounding issue on linux < 4.7 + uint32 total_drop_length = (file_length_ & ~((1 << 20) - 1)) - (1 << 20); + uint32 this_drop_length = total_drop_length - dropped_mem_length_; + if (this_drop_length >= (2 << 20)) { + // Only advise when >= 2MiB to drop + posix_fadvise(fileno(file_), dropped_mem_length_, this_drop_length, + POSIX_FADV_DONTNEED); + dropped_mem_length_ = total_drop_length; } } #endif |