Title: [102291] trunk/Tools
Revision
102291
Author
e...@webkit.org
Date
2011-12-07 17:50:51 -0800 (Wed, 07 Dec 2011)

Log Message

Use free memory to determine if we have space for DRT instances instead of total memory
https://bugs.webkit.org/show_bug.cgi?id=74021

Reviewed by Adam Barth.

This will hopefully make the Mac buildbots behave better.

I also reduced the expected memory needed per DRT now that
we're properly accounting for the system memory in our calculations.

* Scripts/webkitpy/common/system/platforminfo.py:
(PlatformInfo.total_bytes_memory):
(PlatformInfo._compute_free_bytes_from_vm_stat_output):
* Scripts/webkitpy/common/system/platforminfo_mock.py:
(MockPlatformInfo.total_bytes_memory):
* Scripts/webkitpy/layout_tests/port/base.py:
(Port.default_child_processes):
* Scripts/webkitpy/layout_tests/port/base_unittest.py:
(PortTest.test_default_child_processes):

Modified Paths

Diff

Modified: trunk/Tools/ChangeLog (102290 => 102291)


--- trunk/Tools/ChangeLog	2011-12-08 01:44:52 UTC (rev 102290)
+++ trunk/Tools/ChangeLog	2011-12-08 01:50:51 UTC (rev 102291)
@@ -1,3 +1,25 @@
+2011-12-07  Eric Seidel  <e...@webkit.org>
+
+        Use free memory to determine if we have space for DRT instances instead of total memory
+        https://bugs.webkit.org/show_bug.cgi?id=74021
+
+        Reviewed by Adam Barth.
+
+        This will hopefully make the Mac buildbots behave better.
+
+        I also reduced the expected memory needed per DRT now that
+        we're properly accounting for the system memory in our calculations.
+
+        * Scripts/webkitpy/common/system/platforminfo.py:
+        (PlatformInfo.total_bytes_memory):
+        (PlatformInfo._compute_free_bytes_from_vm_stat_output):
+        * Scripts/webkitpy/common/system/platforminfo_mock.py:
+        (MockPlatformInfo.total_bytes_memory):
+        * Scripts/webkitpy/layout_tests/port/base.py:
+        (Port.default_child_processes):
+        * Scripts/webkitpy/layout_tests/port/base_unittest.py:
+        (PortTest.test_default_child_processes):
+
 2011-12-07  Dirk Pranke  <dpra...@chromium.org>
 
         fix build-webkit --chromium after breakage in r102201

Modified: trunk/Tools/Scripts/webkitpy/common/system/platforminfo.py (102290 => 102291)


--- trunk/Tools/Scripts/webkitpy/common/system/platforminfo.py	2011-12-08 01:44:52 UTC (rev 102290)
+++ trunk/Tools/Scripts/webkitpy/common/system/platforminfo.py	2011-12-08 01:50:51 UTC (rev 102291)
@@ -27,6 +27,7 @@
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
 import platform
+import re
 
 
 # We use this instead of calls to platform directly to allow mocking.
@@ -49,3 +50,19 @@
         if system_name == "Darwin":
             return int(self._executive.run_command(["sysctl", "-n", "hw.memsize"]))
         return None
+
+    def _compute_free_bytes_from_vm_stat_output(self, vm_stat_output):
+        page_size_match = re.search(r"page size of (\d+) bytes", vm_stat_output)
+        free_pages_match = re.search(r"Pages free:\s+(\d+).", vm_stat_output)
+        if not page_size_match or not free_pages_match:
+            return None
+        free_page_count = int(free_pages_match.group(1))
+        page_size = int(page_size_match.group(1))
+        return free_page_count * page_size
+
+    def free_bytes_memory(self):
+        system_name = platform.system()
+        if system_name == "Darwin":
+            vm_stat_output = self._executive.run_command(["vm_stat"])
+            return self._compute_free_bytes_from_vm_stat_output(vm_stat_output)
+        return None

Modified: trunk/Tools/Scripts/webkitpy/common/system/platforminfo_mock.py (102290 => 102291)


--- trunk/Tools/Scripts/webkitpy/common/system/platforminfo_mock.py	2011-12-08 01:44:52 UTC (rev 102290)
+++ trunk/Tools/Scripts/webkitpy/common/system/platforminfo_mock.py	2011-12-08 01:50:51 UTC (rev 102291)
@@ -33,3 +33,6 @@
 
     def total_bytes_memory(self):
         return 2 * 1024 * 1024 * 1024  # 2GB is a reasonable amount of ram to mock.
+
+    def free_bytes_memory(self):
+        return 1 * 1024 * 1024 * 1024  # 1GB is a reasonable amount of ram to mock as free.

Modified: trunk/Tools/Scripts/webkitpy/layout_tests/port/base.py (102290 => 102291)


--- trunk/Tools/Scripts/webkitpy/layout_tests/port/base.py	2011-12-08 01:44:52 UTC (rev 102290)
+++ trunk/Tools/Scripts/webkitpy/layout_tests/port/base.py	2011-12-08 01:50:51 UTC (rev 102291)
@@ -166,10 +166,10 @@
         """Return the number of DumpRenderTree instances to use for this port."""
         cpu_count = self._executive.cpu_count()
         # Make sure we have enough ram to support that many instances:
-        total_memory = self.host.platform.total_bytes_memory()
-        if total_memory:
-            bytes_per_drt = 400 * 1024 * 1024  # Assume each DRT needs 400MB to run.
-            supportable_instances = total_memory / bytes_per_drt
+        free_memory = self.host.platform.free_bytes_memory()
+        if free_memory:
+            bytes_per_drt = 200 * 1024 * 1024  # Assume each DRT needs 200MB to run.
+            supportable_instances = free_memory / bytes_per_drt
             if supportable_instances < cpu_count:
                 # FIXME: The Printer isn't initialized when this is called, so using _log would just show an unitialized logger error.
                 print "This machine could support %s child processes, but only has enough memory for %s." % (cpu_count, supportable_instances)

Modified: trunk/Tools/Scripts/webkitpy/layout_tests/port/base_unittest.py (102290 => 102291)


--- trunk/Tools/Scripts/webkitpy/layout_tests/port/base_unittest.py	2011-12-08 01:44:52 UTC (rev 102290)
+++ trunk/Tools/Scripts/webkitpy/layout_tests/port/base_unittest.py	2011-12-08 01:50:51 UTC (rev 102291)
@@ -55,15 +55,17 @@
 
     def test_default_child_processes(self):
         port = self.make_port()
+        # Even though the MockPlatformInfo shows 1GB free memory (enough for 5 DRT instances)
+        # we're still limited by the 2 mock cores we have:
         self.assertEqual(port.default_child_processes(), 2)
-        bytes_for_drt = 400 * 1024 * 1024
+        bytes_for_drt = 200 * 1024 * 1024
 
-        port.host.platform.total_bytes_memory = lambda: bytes_for_drt
+        port.host.platform.free_bytes_memory = lambda: bytes_for_drt
         expected_stdout = "This machine could support 2 child processes, but only has enough memory for 1.\n"
         child_processes = OutputCapture().assert_outputs(self, port.default_child_processes, (), expected_stdout=expected_stdout)
         self.assertEqual(child_processes, 1)
 
-        port.host.platform.total_bytes_memory = lambda: bytes_for_drt - 1
+        port.host.platform.free_bytes_memory = lambda: bytes_for_drt - 1
         expected_stdout = "This machine could support 2 child processes, but only has enough memory for 0.\n"
         child_processes = OutputCapture().assert_outputs(self, port.default_child_processes, (), expected_stdout=expected_stdout)
         self.assertEqual(child_processes, 0)
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to