82 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			82 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Python
		
	
	
	
| # Copyright (c) 2014 The Chromium OS Authors. All rights reserved.
 | |
| # Use of this source code is governed by a BSD-style license that can be
 | |
| # found in the LICENSE file.
 | |
| 
 | |
| import logging
 | |
| 
 | |
| from autotest_lib.client.bin import test
 | |
| from autotest_lib.client.bin import utils
 | |
| from autotest_lib.client.common_lib import error
 | |
| from autotest_lib.client.cros import service_stopper
 | |
| 
 | |
| 
 | |
| class hardware_RamFio(test.test):
 | |
|     """
 | |
|     Create ram disk and use FIO to test for ram throughput
 | |
|     """
 | |
| 
 | |
|     version = 1
 | |
| 
 | |
|     _MB = 1024 * 1024
 | |
|     _DEFAULT_SIZE = 1024 * _MB
 | |
|     _RESERVED_RAM_SIZE = 200 * _MB
 | |
|     _RAMDISK = '/tmp/ramdisk'
 | |
|     _RAMFS_OVERHEAD = 0.2
 | |
| 
 | |
|     def initialize(self):
 | |
|         # This test grabs a lot of system memory. Lets move Chrome out of the
 | |
|         # picture to avoid interference with OOM killer.
 | |
|         self._services = service_stopper.ServiceStopper(['ui'])
 | |
|         self._services.stop_services()
 | |
| 
 | |
|     def cleanup(self):
 | |
|         if self._services:
 | |
|             self._services.restore_services()
 | |
| 
 | |
|     def run_once(self, size=_DEFAULT_SIZE, requirements=None, dry_run=False):
 | |
|         """Call hardware_StorageFio to test on ram drive
 | |
| 
 | |
|         @param size: size to test in byte
 | |
|                      0 means all usable memory
 | |
|         @param requirements: requirement to pass to hardware_StorageFio
 | |
|         """
 | |
|         usable_mem = utils.usable_memtotal() * 1024
 | |
|         logging.info('Found %d bytes of usable memory.', usable_mem)
 | |
|         # Assume 20% overhead with ramfs.
 | |
|         usable_mem *= 1 - self._RAMFS_OVERHEAD
 | |
| 
 | |
|         # crbug.com/762315 Reserved 200 MiB to prevent OOM error.
 | |
|         if usable_mem <= self._RESERVED_RAM_SIZE:
 | |
|             raise error.TestNAError(
 | |
|                 'Usable memory (%d MiB) is less than reserved size (%d MiB).' %
 | |
|                 (usable_mem / self._MB, self._RESERVED_RAM_SIZE / self._MB))
 | |
|         usable_mem -= self._RESERVED_RAM_SIZE
 | |
| 
 | |
|         if size == 0:
 | |
|             size = usable_mem
 | |
|         elif usable_mem < size:
 | |
|             logging.info('Not enough memory. Want: %d, Usable: %d', size,
 | |
|                          usable_mem)
 | |
|             size = usable_mem
 | |
|         self.write_perf_keyval({'Size': size})
 | |
| 
 | |
|         if dry_run:
 | |
|             return
 | |
| 
 | |
|         utils.run('mkdir -p %s' % self._RAMDISK)
 | |
|         # Don't throw an exception on errors.
 | |
|         result = utils.run('mount -t ramfs -o context=u:object_r:tmpfs:s0 '
 | |
|                            'ramfs %s' % self._RAMDISK, ignore_status = True)
 | |
|         if result.exit_status:
 | |
|             logging.info('cannot mount ramfs with context=u:object_r:tmpfs:s0,'
 | |
|                          ' trying plain mount')
 | |
|             # Try again without selinux options.  This time fail on error.
 | |
|             utils.run('mount -t ramfs ramfs %s' % self._RAMDISK)
 | |
| 
 | |
|         self.job.run_test('hardware_StorageFio',
 | |
|                           dev='%s/test_file' % self._RAMDISK,
 | |
|                           size=size,
 | |
|                           requirements=requirements)
 | |
| 
 | |
|         utils.run('umount %s' % self._RAMDISK)
 |