Add rootwrap-daemon-mode blueprint
blueprint rootwrap-daemon-mode Co-Authored-By: Miguel Ángel Ajo <mangelajo@redhat.com> Change-Id: I8079a010ca221f48dc59c9aabaa094fdc4b9ea30
This commit is contained in:
parent
eea45b5493
commit
1ea7b7cf8f
287
specs/kilo/rootwrap-daemon-mode.rst
Normal file
287
specs/kilo/rootwrap-daemon-mode.rst
Normal file
@ -0,0 +1,287 @@
|
|||||||
|
..
|
||||||
|
This work is licensed under a Creative Commons Attribution 3.0 Unported
|
||||||
|
License.
|
||||||
|
|
||||||
|
http://creativecommons.org/licenses/by/3.0/legalcode
|
||||||
|
|
||||||
|
====================
|
||||||
|
rootwrap daemon mode
|
||||||
|
====================
|
||||||
|
|
||||||
|
https://blueprints.launchpad.net/neutron/+spec/rootwrap-daemon-mode
|
||||||
|
|
||||||
|
Neutron is one of projects that heavily depends on executing actions on network
|
||||||
|
nodes that require root priviledges on Linux system. Currently this is achieved
|
||||||
|
with oslo.rootwrap that has to be run with sudo. Both sudo and rootwrap produce
|
||||||
|
significant performance overhead. This blueprint covers mitigating the sudo
|
||||||
|
and rootwrap introduced part of the overhead by using the new mode of
|
||||||
|
rootwrap operation called 'daemon mode'.
|
||||||
|
|
||||||
|
Problem Description
|
||||||
|
===================
|
||||||
|
|
||||||
|
As Miguel Angel Ajo stated in [#ml]_:
|
||||||
|
|
||||||
|
..
|
||||||
|
|
||||||
|
On a database with 1 public network, 192 private networks, 192 routers, and
|
||||||
|
192 nano VMs, with OVS plugin:
|
||||||
|
|
||||||
|
Network node setup time (rootwrap): 24 minutes
|
||||||
|
|
||||||
|
Network node setup time (sudo): 10 minutes
|
||||||
|
|
||||||
|
As you can see, rootwrap presents major overhead comparing to plain sudo usage
|
||||||
|
and most of this overhead is due to long Python interpreter startup time
|
||||||
|
required for every request.
|
||||||
|
Details of the overhead are covered in [#rw_bp]_.
|
||||||
|
|
||||||
|
Proposed Change
|
||||||
|
===============
|
||||||
|
|
||||||
|
This blueprint proposes adopting oslo.rootwrap daemon model which allows
|
||||||
|
to run rootwrap as a daemon. The daemon works just as a usual rootwrap but
|
||||||
|
will accept commands to be run over authenticated UNIX domain socket instead of
|
||||||
|
command line, running continuously in background.
|
||||||
|
An overview of rootwrap daemon is at [#rw_eth]_.
|
||||||
|
|
||||||
|
Two new configuration options should be added:
|
||||||
|
|
||||||
|
* ``rootwrap_mode`` = daemon | process will make agents use daemon
|
||||||
|
or the usual rootwrap process; daemon will be enabled by default.
|
||||||
|
This option could be deprecated in the future if we consider the daemon
|
||||||
|
mode performs as we expect.
|
||||||
|
|
||||||
|
* ``rootwrap_config`` will provide path to rootwrap config file used to run
|
||||||
|
daemon, by default it will point to the neutron provider rootwrap files.
|
||||||
|
|
||||||
|
Since ``root_helper`` is passed around in Neutron (as opposed to use of global
|
||||||
|
config in other projects) we have to make root_helper as some object
|
||||||
|
encapsulating all necessary info to run commands with root priviledges.
|
||||||
|
This is done in the first patch [#cr_rh]_.
|
||||||
|
|
||||||
|
The patch introduces two root helper classes:
|
||||||
|
|
||||||
|
* ``ProcessHelper`` (base) simply runs command as is, with no wrappers;
|
||||||
|
* ``WrappedProcessHelper`` runs commands with a wrapper just as ``root_helper``
|
||||||
|
option used to do.
|
||||||
|
|
||||||
|
These classes have two interface methods:
|
||||||
|
|
||||||
|
* ``create_process`` starts a process and returns Popen instance associated
|
||||||
|
with it;
|
||||||
|
* ``execute`` starts a process (using ``create_process`` by default), feeds it
|
||||||
|
some input and captures return code along with stdout and stderr output.
|
||||||
|
|
||||||
|
Note that ``create_process`` and ``execute`` methods in the
|
||||||
|
``neutron.agent.linux.utils`` module are still there but they just preprocess
|
||||||
|
arguments and pass them to appropriate methods of ``root_helper``.
|
||||||
|
|
||||||
|
The second step [#cr_rw]_ would be to create those configuration options and
|
||||||
|
add another root helper class ``RootwrapDaemonHelper``. This class would employ
|
||||||
|
one rootwrap client for all instances with same rootwrap_config. Its
|
||||||
|
``execute`` method would just call ``execute`` method of rootwrap client that
|
||||||
|
would pass request to the daemon.
|
||||||
|
|
||||||
|
Note that we can't currently start long-running processes using daemon so
|
||||||
|
``create_process`` will use usual rootwrap to start the process. Also the gain
|
||||||
|
for long running processes is negligible.
|
||||||
|
|
||||||
|
Data Model Impact
|
||||||
|
-----------------
|
||||||
|
|
||||||
|
None
|
||||||
|
|
||||||
|
REST API Impact
|
||||||
|
---------------
|
||||||
|
|
||||||
|
None
|
||||||
|
|
||||||
|
Security Impact
|
||||||
|
---------------
|
||||||
|
|
||||||
|
This change will start oslo rootwrap daemons running as root, and available
|
||||||
|
to neutron via a well authenticated (OTP) unix domain socket.
|
||||||
|
|
||||||
|
Therefore ``neutron-rootwrap-daemon`` should be added to the ``sudoers`` file,
|
||||||
|
with the same settings used for neutron-rootwrap.
|
||||||
|
|
||||||
|
Security is handled by oslo-rootwrap which is quite well proven.
|
||||||
|
|
||||||
|
All security issues with using client+daemon instead of plain rootwrap are
|
||||||
|
covered in [#rw_bp]_.
|
||||||
|
|
||||||
|
Notifications Impact
|
||||||
|
--------------------
|
||||||
|
|
||||||
|
None
|
||||||
|
|
||||||
|
Other End User Impact
|
||||||
|
---------------------
|
||||||
|
|
||||||
|
None
|
||||||
|
|
||||||
|
Performance Impact
|
||||||
|
------------------
|
||||||
|
|
||||||
|
This change introduces performance boost for agents that rely on calling a huge
|
||||||
|
amount of commands with rootwrap. Current state of rootwrap daemon shows over
|
||||||
|
10x speedup comparing to usual ``sudo rootwrap`` call. Total speedup for agents
|
||||||
|
will be less impressive but should be very noticeable. The rootwrap daemon
|
||||||
|
implementation includes a benchmark which generated the speedup results.
|
||||||
|
|
||||||
|
Other Deployer Impact
|
||||||
|
---------------------
|
||||||
|
|
||||||
|
This change introduces two new config variables:
|
||||||
|
|
||||||
|
* ``rootwrap_mode`` using ``daemon`` as default;
|
||||||
|
* ``rootwrap_config`` must point to ``rootwrap.conf`` deployed for Neutron
|
||||||
|
(default ``/etc/neutron/rootwrap.conf``).
|
||||||
|
|
||||||
|
Note that by default ``use_rootwrap_daemon`` will be turned off so to get the
|
||||||
|
speedup one will have to turn it on. With it turned on ``root_helper`` config
|
||||||
|
option is ignored and ``neutron-rootwrap-daemon`` is used to run most commands
|
||||||
|
that require root priviledges.
|
||||||
|
|
||||||
|
This change also introduces new binary ``neutron-rootwrap-daemon`` that should
|
||||||
|
be deployed beside ``neutron-rootwrap`` and added to ``sudoers``.
|
||||||
|
|
||||||
|
Developer Impact
|
||||||
|
----------------
|
||||||
|
|
||||||
|
None
|
||||||
|
|
||||||
|
Community Impact
|
||||||
|
----------------
|
||||||
|
|
||||||
|
The community is broadly interested in faster agent operation.
|
||||||
|
|
||||||
|
Alternatives
|
||||||
|
------------
|
||||||
|
|
||||||
|
* Use sudo without rootwrap, at the cost of lower security, or
|
||||||
|
by implementing specific sudo plugins to allow equivalent
|
||||||
|
equivalent rootwrap filtering. That would require maintaining
|
||||||
|
C sudo plugins specific for openstack.
|
||||||
|
|
||||||
|
* Rewrite rootwrap into C, but that requires code auditing, and
|
||||||
|
also deviates from the standard python of the openstack community.
|
||||||
|
|
||||||
|
* Automatically translate rootwrap into C++, and obtain a compiled
|
||||||
|
version, this option has been explored, and seems to be possible
|
||||||
|
via shedskin with small modifications to rootwrap to avoid dynamic
|
||||||
|
typing. By the way, shedskin is experimental, and some python
|
||||||
|
modules are not implemented. Also the C++ produced code is not easily
|
||||||
|
human readable, and may need a security assesment. This solution
|
||||||
|
doesn't eliminate the sudo performance impact, which is not negligible.
|
||||||
|
|
||||||
|
Other Solutions
|
||||||
|
----------------
|
||||||
|
|
||||||
|
Other solutions are mostly related to rootwrap optimizations and are
|
||||||
|
covered in [#rw_bp]_ (some of them are covered in [#eth]_).
|
||||||
|
|
||||||
|
This is not the only option of what can be done on the Neutron side besides
|
||||||
|
switching to rootwrap daemon (see [#eth]_ for details):
|
||||||
|
|
||||||
|
* Avoid unnecessary locking in router processing in L3 agent
|
||||||
|
* Avoid unnecessary calls
|
||||||
|
* Consolidate system calls: Carl Baldwin explored this option, and proved to
|
||||||
|
be very difficult and invasive to the code base.
|
||||||
|
|
||||||
|
All of these can be done with rootwrap daemon as well since every call to the
|
||||||
|
daemon still impose some overhead.
|
||||||
|
|
||||||
|
IPv6 Impact
|
||||||
|
-----------
|
||||||
|
|
||||||
|
None
|
||||||
|
|
||||||
|
Implementation
|
||||||
|
==============
|
||||||
|
|
||||||
|
Assignee(s)
|
||||||
|
-----------
|
||||||
|
|
||||||
|
Primary assignee:
|
||||||
|
* twilson (Terry Wilson, otherwiseguy @ freenode)
|
||||||
|
|
||||||
|
Original contributor:
|
||||||
|
* yorik-sar (Yuriy Taraday, YorikSar @ freenode)
|
||||||
|
|
||||||
|
|
||||||
|
Work Items
|
||||||
|
----------
|
||||||
|
|
||||||
|
* Abstract out root_helper calls to classes - done [#cr_rh]_;
|
||||||
|
* Implement rootwrap daemon support - done, needs rebase [#cr_rw]_;
|
||||||
|
|
||||||
|
Dependencies
|
||||||
|
============
|
||||||
|
|
||||||
|
None
|
||||||
|
|
||||||
|
Testing
|
||||||
|
=======
|
||||||
|
|
||||||
|
Tempest Tests
|
||||||
|
-------------
|
||||||
|
|
||||||
|
This change doesn't change APIs so it doesn't require additional integration
|
||||||
|
tests. If tempest is happy with ``use_rootwrap_daemon`` turned on, the feature
|
||||||
|
works.
|
||||||
|
|
||||||
|
Functional Tests
|
||||||
|
----------------
|
||||||
|
|
||||||
|
Existing functional tests will exercise the rootwrap client side when performing
|
||||||
|
agents functional testing. Rootwrap also has it's own functional testing for
|
||||||
|
the rootwrap client/daemon pieces [#rw_func]_.
|
||||||
|
|
||||||
|
|
||||||
|
API Tests
|
||||||
|
---------
|
||||||
|
|
||||||
|
No API tests are required.
|
||||||
|
|
||||||
|
Documentation Impact
|
||||||
|
====================
|
||||||
|
|
||||||
|
User Documentation
|
||||||
|
------------------
|
||||||
|
|
||||||
|
As we are including two new configuration settings, those need to be
|
||||||
|
properly documented.
|
||||||
|
|
||||||
|
Developer Documentation
|
||||||
|
-----------------------
|
||||||
|
|
||||||
|
Developer documentation may be updated to describe how to use the
|
||||||
|
new interface to execute system commands, if any change were made to the
|
||||||
|
interface.
|
||||||
|
|
||||||
|
|
||||||
|
References
|
||||||
|
==========
|
||||||
|
|
||||||
|
.. [#rw_bp] oslo.rootwrap blueprint:
|
||||||
|
https://blueprints.launchpad.net/oslo.rootwrap/+spec/rootwrap-daemon-mode
|
||||||
|
|
||||||
|
.. [#ml] Original mailing list thread:
|
||||||
|
http://lists.openstack.org/pipermail/openstack-dev/2014-March/029017.html
|
||||||
|
|
||||||
|
.. [#rw_eth] Daemon design overview:
|
||||||
|
https://etherpad.openstack.org/p/rootwrap-agent
|
||||||
|
|
||||||
|
.. [#cr_rh] Change request "Abstract out root_helper calls to classes":
|
||||||
|
https://review.openstack.org/82787
|
||||||
|
|
||||||
|
.. [#cr_rw] Change request "Implement rootwrap daemon support":
|
||||||
|
https://review.openstack.org/84667
|
||||||
|
|
||||||
|
.. [#eth] Original problem statement summarized here:
|
||||||
|
https://etherpad.openstack.org/p/neutron-agent-exec-performance
|
||||||
|
|
||||||
|
.. [#rw_func] Rootwrap daemon functional testing
|
||||||
|
https://github.com/openstack/oslo.rootwrap/blob/master/tests/test_functional.py
|
Loading…
Reference in New Issue
Block a user