Hi Lucas,
On Wed, Jun 15, 2011 at 09:18:34PM -0300, Lucas Meneghel Rodrigues wrote:
> +class THPNotSupportedError(THPError):
> + """
> + Thrown when host does not support tansparent hugepages.
> + """
> + pass
s/tansparent/transparent/
> +class THPWriteConfigError(THPError):
> + """
> + Thrown when host does not support tansparent hugepages.
> + """
> + pass
same as above.
> +class TransparentHugePageConfig(object):
> + def __init__(self, test, params):
> + """
> + Find paths for transparent hugepages and kugepaged configuration.
> Also,
> + back up original host configuration so it can be restored during
> + cleanup.
> + """
> + self.params = params
> +
> + RH_THP_PATH = "/sys/kernel/mm/redhat_transparent_hugepage"
> + UPSTREAM_THP_PATH = "/sys/kernel/mm/transparent_hugepage"
> + if os.path.isdir(RH_THP_PATH):
> + self.thp_path = RH_THP_PATH
> + elif os.path.isdir(UPSTREAM_THP_PATH):
> + self.thp_path = UPSTREAM_THP_PATH
> + else:
> + raise THPNotSupportedError("System doesn't support transparent "
> + "hugepages")
> +
> + # test_cfg holds all the desired host config values we want to set
> + # before THP tests
> + test_cfg={"%s/defrag" % self.thp_path: "yes",
upstream >=3.0.0 this would value would be 1 (on 2.6.38 it's still "yes").
> + "%s/enabled" % self.thp_path: "always",
> + "%s/khugepaged/defrag" % self.thp_path: "yes",
Upstream >=3.0.0 it's 1.
> + "%s/khugepaged/scan_sleep_millisecs" % self.thp_path:
> "100",
So this is meant to increase khugepaged scan rate compared to the
default.
> + "%s/khugepaged/pages_to_scan" % self.thp_path: "4096",
> + "%s/khugepaged/alloc_sleep_millisecs" % self.thp_path:
> "100",
An allocation failure is not very likely and it's generally better to
keep this bigger than the scan_sleep_millisecs. I would keep a factor
of 6 of difference, so you could set it to 600 if scan_sleep_millisecs
is set to 100.
> + "/sys/kernel/mm/ksm/run": "1",
> + "/proc/sys/vm/nr_hugepages":"0"}
nr_hugepages is unlikely to matter.
> + if os.path.isfile("%s/khugepaged/enabled" % self.thp_path):
> + test_cfg["%s/khugepaged/enabled" % self.thp_path] = "always"
> + if os.path.isfile("%s/khugepaged/max_ptes_none" % self.thp_path):
> + test_cfg["%s/khugepaged/max_ptes_none" % self.thp_path] = "511"
> + test_cfg["%s/defrag" % self.thp_path] = "always"
> +
> + tmp_list = []
> + test_config = self.params.get("test_config", None)
> + if test_config is not None:
> + tmp_list = re.split(';', test_config)
> + while len(tmp_list) > 0:
> + tmp_cfg = tmp_list.pop()
> + test_cfg[re.split(":", tmp_cfg)[0]] = sre.split(":", tmp_cfg)[1]
> +
> + self.original_config = {}
> + # Save host current config, so we can restore it during cleanup
> + for path in test_cfg:
> + param = open(path, 'r').read()
> + if ("enabled" in param) or ("defrag" in param):
> + param = re.split("\[|\]", param)[1] + '\n'
> + self.original_config[path] = param
> +
> + self.test_config = test_cfg
> +
> +
> + def set_env(self):
> + """
> + Applies test configuration on the host.
> + """
> + if self.test_config:
> + for path in self.test_config.keys():
> + file(path, 'w').write(self.test_config[path])
> +
> +
> + def set_params(self, path_dict={}, filename="", value=""):
> + """
> + Sets the value of a config file for a given path.
> +
> + @param path_dict: Dict of files' paths {path : value}
> + @param filename: Name of file to setup
> + @param value: Value set to the configuration files
> + """
> + for path in path_dict.keys():
> + if path in filename:
> + try:
> + file(path, "w").write(value)
> + except IOError, e:
> + raise THPWriteConfigError("Can not set %s to %s: %s" %
> + (value, filename, e))
> +
> +
> + def khugepaged_test(self):
> + """
> + Start, stop and frequency change test for khugepaged.
> + """
> + status_list = ["never", "always", "never"]
> + for status in status_list:
> + self.set_params(self.test_config, "enabled", status)
> + try:
> + utils.run('pgrep khugepaged')
> + except error.CmdError:
> + raise THPKhugepagedError("khugepaged can not be set to "
> + "status %s" % status)
khugepaged will quit when enabled is set to never, but it's not a bug
(it's to save the memory of the kernel thread stack when THP is
disabled). So I'm unsure if the pgrep is going to create spurious errors.
--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html