[Linux] Cache the memory footprint and only update it after 1 second
authorcarlosgc@webkit.org <carlosgc@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 21 Aug 2018 13:27:42 +0000 (13:27 +0000)
committercarlosgc@webkit.org <carlosgc@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 21 Aug 2018 13:27:42 +0000 (13:27 +0000)
https://bugs.webkit.org/show_bug.cgi?id=188791

Reviewed by Yusuke Suzuki.

Getting the memory footprint is an expensive operation in Linux. When called multiple times, the CPU usage is
too much (see bug #188787). We could cache the result for at least 1 second to ensure we don't call it more than
once per second.

* wtf/linux/MemoryFootprintLinux.cpp:
(WTF::forEachLine):
(WTF::computeMemoryFootprint):
(WTF::memoryFootprint):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@235113 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/WTF/ChangeLog
Source/WTF/wtf/linux/MemoryFootprintLinux.cpp

index d5ead37..59d12f9 100644 (file)
@@ -1,3 +1,19 @@
+2018-08-21  Carlos Garcia Campos  <cgarcia@igalia.com>
+
+        [Linux] Cache the memory footprint and only update it after 1 second
+        https://bugs.webkit.org/show_bug.cgi?id=188791
+
+        Reviewed by Yusuke Suzuki.
+
+        Getting the memory footprint is an expensive operation in Linux. When called multiple times, the CPU usage is
+        too much (see bug #188787). We could cache the result for at least 1 second to ensure we don't call it more than
+        once per second.
+
+        * wtf/linux/MemoryFootprintLinux.cpp:
+        (WTF::forEachLine):
+        (WTF::computeMemoryFootprint):
+        (WTF::memoryFootprint):
+
 2018-08-20  Saam barati  <sbarati@apple.com>
 
         Inline DataView accesses into DFG/FTL
index f27658c..7bc9d7c 100644 (file)
@@ -27,6 +27,7 @@
 #include "MemoryFootprint.h"
 
 #if OS(LINUX)
+#include "MonotonicTime.h"
 #include <stdio.h>
 #include <wtf/StdLibExtras.h>
 #include <wtf/text/StringView.h>
@@ -35,6 +36,8 @@
 namespace WTF {
 
 #if OS(LINUX)
+static const Seconds s_memoryFootprintUpdateInterval = 1_s;
+
 template<typename Functor>
 static void forEachLine(FILE* file, Functor functor)
 {
@@ -45,11 +48,9 @@ static void forEachLine(FILE* file, Functor functor)
     }
     free(buffer);
 }
-#endif
 
-size_t memoryFootprint()
+static size_t computeMemoryFootprint()
 {
-#if OS(LINUX)
     FILE* file = fopen("/proc/self/smaps", "r");
     if (!file)
         return 0;
@@ -86,6 +87,21 @@ size_t memoryFootprint()
     });
     fclose(file);
     return totalPrivateDirtyInKB * KB;
+}
+#endif
+
+size_t memoryFootprint()
+{
+#if OS(LINUX)
+    static size_t footprint = 0;
+    static MonotonicTime previousUpdateTime = { };
+    Seconds elapsed = MonotonicTime::now() - previousUpdateTime;
+    if (elapsed >= s_memoryFootprintUpdateInterval) {
+        footprint = computeMemoryFootprint();
+        previousUpdateTime = MonotonicTime::now();
+    }
+
+    return footprint;
 #endif
     return 0;
 }