~landscape/charms/trusty/neutron-api-odl-vpp/trunk

« back to all changes in this revision

Viewing changes to hooks/charmhelpers/core/hugepage.py

  • Committer: Liam Young
  • Date: 2015-11-03 13:42:27 UTC
  • mfrom: (4.1.1 neutron-api-odl)
  • Revision ID: liam.young@canonical.com-20151103134227-pnazu50qwdizbudp
Sync from lp:charm-helpers and fix services.py to fit with it

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
 
2
 
#!/usr/bin/env python
3
1
# -*- coding: utf-8 -*-
4
2
 
5
3
# Copyright 2014-2015 Canonical Limited.
19
17
# along with charm-helpers.  If not, see <http://www.gnu.org/licenses/>.
20
18
 
21
19
import yaml
22
 
from charmhelpers.core.fstab import Fstab
23
 
from charmhelpers.core.sysctl import (
24
 
    create,
25
 
)
 
20
from charmhelpers.core import fstab
 
21
from charmhelpers.core import sysctl
26
22
from charmhelpers.core.host import (
27
23
    add_group,
28
24
    add_user_to_group,
29
25
    fstab_mount,
30
26
    mkdir,
31
27
)
 
28
from charmhelpers.core.strutils import bytes_from_string
 
29
from subprocess import check_output
 
30
 
32
31
 
33
32
def hugepage_support(user, group='hugetlb', nr_hugepages=256,
34
 
                     max_map_count=65536, mnt_point='/hugepages',
35
 
                     pagesize='2MB', mount=True):
 
33
                     max_map_count=65536, mnt_point='/run/hugepages/kvm',
 
34
                     pagesize='2MB', mount=True, set_shmmax=False):
 
35
    """Enable hugepages on system.
 
36
 
 
37
    Args:
 
38
    user (str)  -- Username to allow access to hugepages to
 
39
    group (str) -- Group name to own hugepages
 
40
    nr_hugepages (int) -- Number of pages to reserve
 
41
    max_map_count (int) -- Number of Virtual Memory Areas a process can own
 
42
    mnt_point (str) -- Directory to mount hugepages on
 
43
    pagesize (str) -- Size of hugepages
 
44
    mount (bool) -- Whether to Mount hugepages
 
45
    """
36
46
    group_info = add_group(group)
37
47
    gid = group_info.gr_gid
38
48
    add_user_to_group(user, group)
 
49
    if max_map_count < 2 * nr_hugepages:
 
50
        max_map_count = 2 * nr_hugepages
39
51
    sysctl_settings = {
40
52
        'vm.nr_hugepages': nr_hugepages,
41
 
        'vm.max_map_count': max_map_count,  # 1GB
 
53
        'vm.max_map_count': max_map_count,
42
54
        'vm.hugetlb_shm_group': gid,
43
55
    }
44
 
    create(yaml.dump(sysctl_settings), '/etc/sysctl.d/10-hugepage.conf')
 
56
    if set_shmmax:
 
57
        shmmax_current = int(check_output(['sysctl', '-n', 'kernel.shmmax']))
 
58
        shmmax_minsize = bytes_from_string(pagesize) * nr_hugepages
 
59
        if shmmax_minsize > shmmax_current:
 
60
            sysctl_settings['kernel.shmmax'] = shmmax_minsize
 
61
    sysctl.create(yaml.dump(sysctl_settings), '/etc/sysctl.d/10-hugepage.conf')
45
62
    mkdir(mnt_point, owner='root', group='root', perms=0o755, force=False)
46
 
    fstab = Fstab()
47
 
    fstab_entry = fstab.get_entry_by_attr('mountpoint', mnt_point)
 
63
    lfstab = fstab.Fstab()
 
64
    fstab_entry = lfstab.get_entry_by_attr('mountpoint', mnt_point)
48
65
    if fstab_entry:
49
 
        fstab.remove_entry(fstab_entry)
50
 
    entry = fstab.Entry('nodev', mnt_point, 'hugetlbfs',
51
 
                        'mode=1770,gid={},pagesize={}'.format(gid, pagesize), 0, 0)
52
 
    fstab.add_entry(entry)
 
66
        lfstab.remove_entry(fstab_entry)
 
67
    entry = lfstab.Entry('nodev', mnt_point, 'hugetlbfs',
 
68
                         'mode=1770,gid={},pagesize={}'.format(gid, pagesize), 0, 0)
 
69
    lfstab.add_entry(entry)
53
70
    if mount:
54
71
        fstab_mount(mnt_point)