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)
|