diff options
author | Christian Trautman <ctrautma@redhat.com> | 2016-07-14 14:46:43 -0400 |
---|---|---|
committer | Maryam Tahhan <maryam.tahhan@intel.com> | 2016-08-09 08:03:20 +0000 |
commit | 31f0a3e0a25e147e285d14e2e262ac48aa83ce65 (patch) | |
tree | 4c497db2655e0f2fc60ced59cb415feaeca10fc9 /tools | |
parent | 18253fb2133ae1bd294689d297b0182481c174c2 (diff) |
hugepage_detect: Change hugepage detection to check for free hugepages
Change hugepage detection to check if hugepages are configured. Also
verifies enough free hugepages are available based on test
configuration. Will result in an exception if not enough hugepages
are found. This performs the check based on the guest memory configs
as well as the dpdk socket configs.
Adds some new methods to check for free hugepages based on all
hugepages or for socket free hugepages.
Adds new logging indicitaing needed and free hugepages as well as info
level event if hugepages are not configured at recommended 1GB size.
JIRA: VSPerf-255
Change-Id: I80d5605308861070c412568d8d40339f01b9718b
Signed-off-by: Christian Trautman <ctrautma@redhat.com>
Diffstat (limited to 'tools')
-rw-r--r-- | tools/hugepages.py | 75 |
1 files changed, 55 insertions, 20 deletions
diff --git a/tools/hugepages.py b/tools/hugepages.py index 119f94b5..02e4f29c 100644 --- a/tools/hugepages.py +++ b/tools/hugepages.py @@ -31,6 +31,7 @@ _LOGGER = logging.getLogger(__name__) # hugepage management # + def get_hugepage_size(): """Return the size of the configured hugepages """ @@ -48,7 +49,6 @@ def get_hugepage_size(): return 0 - def allocate_hugepages(): """Allocate hugepages on the fly """ @@ -72,31 +72,65 @@ def allocate_hugepages(): return False +def get_free_hugepages(socket=None): + """Get the free hugepage totals on the system. + + :param socket: optional socket param to get free hugepages on a socket. To + be passed a string. + :returns: hugepage amount as int + """ + hugepage_free_re = re.compile(r'HugePages_Free:\s+(?P<free_hp>\d+)$') + if socket: + if os.path.exists( + '/sys/devices/system/node/node{}/meminfo'.format(socket)): + meminfo_path = '/sys/devices/system/node/node{}/meminfo'.format( + socket) + else: + _LOGGER.info('No hugepage info found for socket {}'.format(socket)) + return 0 + else: + meminfo_path = '/proc/meminfo' + + with open(meminfo_path, 'r') as fh: + data = fh.readlines() + for line in data: + match = hugepage_free_re.search(line) + if match: + _LOGGER.info('Hugepages free: %s %s', match.group('free_hp'), + 'on socket {}'.format(socket) if socket else '') + return int(match.group('free_hp')) + else: + _LOGGER.info('Could not parse for hugepage size') + return 0 + + def is_hugepage_available(): - """Check if hugepages are available on the system. + """Check if hugepages are configured/available on the system. """ - hugepage_re = re.compile(r'^HugePages_Free:\s+(?P<num_hp>\d+)$') + hugepage_size_re = re.compile(r'^Hugepagesize:\s+(?P<size_hp>\d+)\s+kB', + re.IGNORECASE) # read in meminfo with open('/proc/meminfo') as mem_file: mem_info = mem_file.readlines() - # first check if module is loaded + # see if the hugepage size is the recommended value for line in mem_info: - result = hugepage_re.match(line) - if not result: - continue - - num_huge = result.group('num_hp') - if num_huge == '0': - _LOGGER.info('No free hugepages.') - if not allocate_hugepages(): - return False - else: - _LOGGER.info('Found \'%s\' free hugepage(s).', num_huge) - return True - - return False + match_size = hugepage_size_re.match(line) + if match_size: + if match_size.group('size_hp') != '1048576': + _LOGGER.info( + '%s%s%s kB', + 'Hugepages not configured for recommend 1GB size. ', + 'Currently set at ', match_size.group('size_hp')) + num_huge = get_free_hugepages() + if num_huge == 0: + _LOGGER.info('No free hugepages.') + if not allocate_hugepages(): + return False + else: + _LOGGER.info('Found \'%s\' free hugepage(s).', num_huge) + return True def is_hugepage_mounted(): @@ -112,10 +146,11 @@ def is_hugepage_mounted(): def mount_hugepages(): - """Ensure hugepages are mounted. + """Ensure hugepages are mounted. Raises RuntimeError if no configured + hugepages are available. """ if not is_hugepage_available(): - return + raise RuntimeError('No Hugepages configured.') if is_hugepage_mounted(): return |