This patchset is the first of several to add a cgroup v1/v2
abstraction layer to libcgroup.  It adds the underlying framework,
and a simple conversion - cpu.shares to cpu.weight and vice versa.
Adding additional conversions is straightforward.  Support for
additional libcgroup tools is also planned.

Why an abstraction layer?

As enterprise systems slowly transition from cgroup v1 to cgroup
v2, higher-level applications (e.g. databases) are in a difficult
position.  These applications have very long lifespans and may
run on a wide variety of systems (both in age and capability.)
Providing a library that can abstract away the cgroup v1/v2
differences will allow these applications to seamlessly work on
vastly disparate systems.

Key requirements of the abstraction layer:

* A user shall be able to specify either cgroup v1 or v2
  settings/values as input parameters
* The abstraction layer shall translate these requested
  settings/values into the proper "on-disk" cgroup version
* When data is returned to the user, it shall be returned in the
  same version originally specified by the user
* If the version is unspecified, the abstraction layer may
  translate the request or may not.  This is an optional feature
  and subject to change.  It's possible that '-1' or '-2' will be
  required in the future

Examples:

On a cgroup v2 system where cpu.weight is set to 200:

        $ ./cgxget -2 -nr cpu.weight foo
        cpu.weight: 200

        $ ./src/tools/cgxget -1 -nr cpu.shares foo
        cpu.shares: 2048

        # As outlined above, failure to provide either -1 or -2
        # is a best-effort behavior and is not guaranteed to
        # succeed
        $ ./cgxget -nr cpu.weight foo
        cpu.weight: 200
        $ ./cgxget -nr cpu.shares foo
        variable file read failed No such file or directory

On a cgroup v1 system where cpu.shares is set to 512:

        $ ./cgxget -1 -nr cpu.shares bar
        cpu.shares: 512

        $ ./cgxget -2 -nr cpu.weight bar
        cpu.weight: 50

        # As outlined above, failure to provide either -1 or -2
        # is a best-effort behavior and is not guaranteed to
        # succeed
        $ ./cgxget -nr cpu.shares bar
        cpu.shares: 512
        $ ./cgxget -nr cpu.weight bar
        variable file read failed No such file or directory

Why the name cgxget?

I'm open to suggestions here, but I like cgx(get|set|...) for
a few reasons:

* It's easy to tab complete and see the various cgroup abstraction
  layer commands that are supported
* I considered cgget2, but I was afraid that it could be
  misconstrued as a cgroup v2-only utility

What's next?

Much like the work to add cgroup v2 support, the abstraction
layer will be added in steps.  I have created a github issue [1]
to track the progress.  Comments, patches, and testing are always
welcome. 

[1] https://github.com/libcgroup/libcgroup/issues/24

The changes to libcgroup are available here:
https://github.com/drakenclimber/libcgroup/tree/issues/cgxget4

The changes to the libcgroup tests are available here:
https://github.com/drakenclimber/libcgroup-tests/tree/issues/cgxget4

Overal code coverage increased 1.7% to 51.7%.  Code coverage of
src/abstraction-common.c is at 75.8%:
https://coveralls.io/builds/41251128

Automated tests are passing and the results are here:
https://github.com/drakenclimber/libcgroup/runs/3030300300

Tom Hromatka (9):
  wrapper.c: Store the version in struct cgroup_controller
  api.c: Remove static from cgroup_copy_controller_values()
  abstraction: Add cgroup_strtol()
  abstraction: Add mapping tables
  abstraction: Add integer conversion function
  abstraction: Add function to convert from one cgroup version to
    another
  abstraction-map: Add cpu.shares <-> cpu.weight mapping
  cgxget: Introduce cgxget
  cgxset: Introduce cgxset

 src/Makefile.am          |   2 +-
 src/abstraction-common.c | 213 +++++++++++++++++++++++++++++++++++++++
 src/abstraction-common.h |  81 +++++++++++++++
 src/abstraction-map.c    |  44 ++++++++
 src/abstraction-map.h    |  52 ++++++++++
 src/api.c                |  10 +-
 src/libcgroup-internal.h |  25 +++--
 src/libcgroup.map        |   4 +
 src/tools/Makefile.am    |  12 ++-
 src/tools/cgconfig.c     |   7 ++
 src/tools/cgget.c        | 115 +++++++++++++++++++--
 src/tools/cgset.c        |  47 +++++++++
 src/wrapper.c            |  11 +-
 13 files changed, 595 insertions(+), 28 deletions(-)
 create mode 100644 src/abstraction-common.c
 create mode 100644 src/abstraction-common.h
 create mode 100644 src/abstraction-map.c
 create mode 100644 src/abstraction-map.h

-- 
2.25.1



_______________________________________________
Libcg-devel mailing list
Libcg-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/libcg-devel

Reply via email to