1 # Copyright (c) 2016 Cisco and/or its affiliates.
2 # Licensed under the Apache License, Version 2.0 (the "License");
3 # you may not use this file except in compliance with the License.
4 # You may obtain a copy of the License at:
6 # http://www.apache.org/licenses/LICENSE-2.0
8 # Unless required by applicable law or agreed to in writing, software
9 # distributed under the License is distributed on an "AS IS" BASIS,
10 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11 # See the License for the specific language governing permissions and
12 # limitations under the License.
14 from __future__ import print_function
16 """VPP Huge Page Utilities"""
20 from vpplib.VPPUtil import VPPUtil
23 DEFAULT_VPP_HUGE_PAGE_CONFIG_FILENAME = "/etc/vpp/80-vpp.conf"
24 VPP_HUGEPAGE_CONFIG = """
25 vm.nr_hugepages={nr_hugepages}
26 vm.max_map_count={max_map_count}
27 vm.hugetlb_shm_group=0
28 kernel.shmmax={shmmax}
32 class VppHugePageUtil(object):
37 def hugepages_dryrun_apply(self):
39 Apply the huge page configuration
44 hugepages = node["hugepages"]
46 vpp_hugepage_config = VPP_HUGEPAGE_CONFIG.format(
47 nr_hugepages=hugepages["total"],
48 max_map_count=hugepages["max_map_count"],
49 shmmax=hugepages["shmax"],
52 rootdir = node["rootdir"]
53 filename = rootdir + node["hugepages"]["hugepage_config_file"]
55 cmd = 'echo "{0}" | sudo tee {1}'.format(vpp_hugepage_config, filename)
56 (ret, stdout, stderr) = VPPUtil.exec_command(cmd)
59 "{} failed on node {} {} {}".format(cmd, node["host"], stdout, stderr)
62 def get_actual_huge_pages(self):
64 Get the current huge page configuration
66 :returns the hugepage total, hugepage free, hugepage size,
67 total memory, and total memory free
71 # Get the memory information using /proc/meminfo
72 cmd = "sudo cat /proc/meminfo"
73 (ret, stdout, stderr) = VPPUtil.exec_command(cmd)
76 "{} failed on node {} {} {}".format(
77 cmd, self._node["host"], stdout, stderr
81 total = re.findall(r"HugePages_Total:\s+\w+", stdout)
82 free = re.findall(r"HugePages_Free:\s+\w+", stdout)
83 size = re.findall(r"Hugepagesize:\s+\w+\s+\w+", stdout)
84 memtotal = re.findall(r"MemTotal:\s+\w+\s+\w+", stdout)
85 memfree = re.findall(r"MemFree:\s+\w+\s+\w+", stdout)
87 total = total[0].split(":")[1].lstrip()
88 free = free[0].split(":")[1].lstrip()
89 size = size[0].split(":")[1].lstrip()
90 memtotal = memtotal[0].split(":")[1].lstrip()
91 memfree = memfree[0].split(":")[1].lstrip()
92 return total, free, size, memtotal, memfree
94 def show_huge_pages(self):
96 Print the current huge page configuration
101 hugepages = node["hugepages"]
102 print(" {:30}: {}".format("Total System Memory", hugepages["memtotal"]))
103 print(" {:30}: {}".format("Total Free Memory", hugepages["memfree"]))
104 print(" {:30}: {}".format("Actual Huge Page Total", hugepages["actual_total"]))
105 print(" {:30}: {}".format("Configured Huge Page Total", hugepages["total"]))
106 print(" {:30}: {}".format("Huge Pages Free", hugepages["free"]))
107 print(" {:30}: {}".format("Huge Page Size", hugepages["size"]))
109 def get_huge_page_config(self):
111 Returns the huge page config.
113 :returns: The map max count and shmmax
116 total = self._node["hugepages"]["total"]
117 max_map_count = int(total) * 2 + 1024
118 shmmax = int(total) * 2 * 1024 * 1024
119 return max_map_count, shmmax
121 def __init__(self, node):