core: add global settings for enabling CPUAccounting=, MemoryAccounting=, BlockIOAccounting= for all units at once

This commit is contained in:
Lennart Poettering 2014-02-24 23:50:10 +01:00
parent 4e72e29a39
commit 085afe36cb
13 changed files with 92 additions and 23 deletions

View file

@ -292,7 +292,7 @@
<varname>TimeoutStartSec=</varname>,
<varname>TimeoutStopSec=</varname> and
<varname>RestartSec=</varname> (for
service units, see
services, see
<citerefentry><refentrytitle>systemd.service</refentrytitle><manvolnum>5</manvolnum></citerefentry>
for details on the per-unit
settings). For non-service units,
@ -301,18 +301,20 @@
<varname>TimeoutSec=</varname> value.
</para></listitem>
</varlistentry>
<varlistentry>
<term><varname>DefaultStartLimitInterval=</varname></term>
<term><varname>DefaultStartLimitBurst=</varname></term>
<listitem><para>Configure the default start rate
limiting, as configured per-service by
<varname>StartLimitInterval=</varname> and
<listitem><para>Configure the default
unit start rate limiting, as
configured per-service by
<varname>StartLimitInterval=</varname>
and
<varname>StartLimitBurst=</varname>. See
<citerefentry><refentrytitle>systemd.service</refentrytitle><manvolnum>5</manvolnum></citerefentry>
for details on the per-service
settings).
</para></listitem>
settings.</para></listitem>
</varlistentry>
<varlistentry>
@ -337,6 +339,23 @@
<literal>VAR3</literal>.</para></listitem>
</varlistentry>
<varlistentry>
<term><varname>DefaultCPUAccounting=</varname></term>
<term><varname>DefaultBlockIOAccounting=</varname></term>
<term><varname>DefaultMemoryAccounting=</varname></term>
<listitem><para>Configure the default
resource accounting settings, as
configured per-unit by
<varname>CPUAccounting=</varname>,
<varname>BlockIOAccounting=</varname>
and
<varname>MemoryAccounting=</varname>. See
<citerefentry><refentrytitle>systemd.resource-control</refentrytitle><manvolnum>5</manvolnum></citerefentry>
for details on the per-unit
settings.</para></listitem>
</varlistentry>
<varlistentry>
<term><varname>DefaultLimitCPU=</varname></term>
<term><varname>DefaultLimitFSIZE=</varname></term>

View file

@ -105,8 +105,11 @@ along with systemd; If not, see <http://www.gnu.org/licenses/>.
<para>Turn on CPU usage accounting for this unit. Takes a
boolean argument. Note that turning on CPU accounting for
one unit might also implicitly turn it on for all units
contained in the same slice and for all its parent slices and
the units contained therein.</para>
contained in the same slice and for all its parent slices
and the units contained therein. The system default for this
setting maybe controlled with
<varname>DefaultCPUAccounting=</varname> in
<citerefentry><refentrytitle>systemd-system.conf</refentrytitle><manvolnum>5</manvolnum></citerefentry>.</para>
</listitem>
</varlistentry>
@ -132,8 +135,10 @@ along with systemd; If not, see <http://www.gnu.org/licenses/>.
<para>Turn on process and kernel memory accounting for this
unit. Takes a boolean argument. Note that turning on memory
accounting for one unit might also implicitly turn it on for
all units contained in the same slice and for all its parent
slices and the units contained therein.</para>
all its parent slices. The system default for this setting
maybe controlled with
<varname>DefaultMemoryAccounting=</varname> in
<citerefentry><refentrytitle>systemd-system.conf</refentrytitle><manvolnum>5</manvolnum></citerefentry>.</para>
</listitem>
</varlistentry>
@ -164,8 +169,11 @@ along with systemd; If not, see <http://www.gnu.org/licenses/>.
<para>Turn on Block IO accounting for this unit. Takes a
boolean argument. Note that turning on block IO accounting
for one unit might also implicitly turn it on for all units
contained in the same slice and all for its parent slices and
the units contained therein.</para>
contained in the same slice and all for its parent slices
and the units contained therein. The system default for this
setting maybe controlled with
<varname>DefaultBlockIOAccounting=</varname> in
<citerefentry><refentrytitle>systemd-system.conf</refentrytitle><manvolnum>5</manvolnum></citerefentry>.</para>
</listitem>
</varlistentry>

View file

@ -107,6 +107,9 @@ static uint64_t arg_capability_bounding_set_drop = 0;
static nsec_t arg_timer_slack_nsec = (nsec_t) -1;
static Set* arg_syscall_archs = NULL;
static FILE* arg_serialization = NULL;
static bool arg_default_cpu_accounting = false;
static bool arg_default_blockio_accounting = false;
static bool arg_default_memory_accounting = false;
static void nop_handler(int sig) {}
@ -673,6 +676,9 @@ static int parse_config_file(void) {
{ "Manager", "DefaultLimitNICE", config_parse_limit, 0, &arg_default_rlimit[RLIMIT_NICE] },
{ "Manager", "DefaultLimitRTPRIO", config_parse_limit, 0, &arg_default_rlimit[RLIMIT_RTPRIO] },
{ "Manager", "DefaultLimitRTTIME", config_parse_limit, 0, &arg_default_rlimit[RLIMIT_RTTIME] },
{ "Manager", "DefaultCPUAccounting", config_parse_bool, 0, &arg_default_cpu_accounting },
{ "Manager", "DefaultBlockIOAccounting", config_parse_bool, 0, &arg_default_blockio_accounting },
{ "Manager", "DefaultMemoryAccounting", config_parse_bool, 0, &arg_default_memory_accounting },
{}
};
@ -1591,6 +1597,9 @@ int main(int argc, char *argv[]) {
m->default_timeout_stop_usec = arg_default_timeout_stop_usec;
m->default_start_limit_interval = arg_default_start_limit_interval;
m->default_start_limit_burst = arg_default_start_limit_burst;
m->default_cpu_accounting = arg_default_cpu_accounting;
m->default_blockio_accounting = arg_default_blockio_accounting;
m->default_memory_accounting = arg_default_memory_accounting;
m->runtime_watchdog = arg_runtime_watchdog;
m->shutdown_watchdog = arg_shutdown_watchdog;
m->userspace_timestamp = userspace_timestamp;

View file

@ -212,12 +212,15 @@ struct Manager {
ExecOutput default_std_output, default_std_error;
usec_t default_restart_usec, default_timeout_start_usec,
default_timeout_stop_usec;
usec_t default_restart_usec, default_timeout_start_usec, default_timeout_stop_usec;
usec_t default_start_limit_interval;
unsigned default_start_limit_burst;
bool default_cpu_accounting;
bool default_memory_accounting;
bool default_blockio_accounting;
struct rlimit *rlimit[RLIMIT_NLIMITS];
/* non-zero if we are reloading or reexecuting, */

View file

@ -141,6 +141,8 @@ static void mount_init(Unit *u) {
kill_context_init(&m->kill_context);
cgroup_context_init(&m->cgroup_context);
unit_cgroup_context_init_defaults(u, &m->cgroup_context);
if (unit_has_name(u, "-.mount")) {
/* Don't allow start/stop for root directory */
u->refuse_manual_start = true;
@ -577,7 +579,7 @@ static int mount_add_extras(Mount *m) {
if (r < 0)
return r;
r = unit_exec_context_defaults(u, &m->exec_context);
r = unit_exec_context_patch_defaults(u, &m->exec_context);
if (r < 0)
return r;

View file

@ -54,6 +54,8 @@ static void scope_init(Unit *u) {
cgroup_context_init(&s->cgroup_context);
kill_context_init(&s->kill_context);
unit_cgroup_context_init_defaults(u, &s->cgroup_context);
UNIT(s)->ignore_on_isolate = true;
UNIT(s)->ignore_on_snapshot = true;
}

View file

@ -147,9 +147,9 @@ static void service_init(Unit *u) {
kill_context_init(&s->kill_context);
cgroup_context_init(&s->cgroup_context);
RATELIMIT_INIT(s->start_limit,
u->manager->default_start_limit_interval,
u->manager->default_start_limit_burst);
unit_cgroup_context_init_defaults(u, &s->cgroup_context);
RATELIMIT_INIT(s->start_limit, u->manager->default_start_limit_interval, u->manager->default_start_limit_burst);
s->control_command_id = _SERVICE_EXEC_COMMAND_INVALID;
}
@ -1235,7 +1235,7 @@ static int service_load(Unit *u) {
return r;
}
r = unit_exec_context_defaults(u, &s->exec_context);
r = unit_exec_context_patch_defaults(u, &s->exec_context);
if (r < 0)
return r;
}

View file

@ -43,6 +43,7 @@ static void slice_init(Unit *u) {
assert(u->load_state == UNIT_STUB);
cgroup_context_init(&s->cgroup_context);
unit_cgroup_context_init_defaults(u, &s->cgroup_context);
}
static void slice_done(Unit *u) {

View file

@ -96,6 +96,8 @@ static void socket_init(Unit *u) {
kill_context_init(&s->kill_context);
cgroup_context_init(&s->cgroup_context);
unit_cgroup_context_init_defaults(u, &s->cgroup_context);
s->control_command_id = _SOCKET_EXEC_COMMAND_INVALID;
}
@ -338,7 +340,7 @@ static int socket_add_extras(Socket *s) {
if (r < 0)
return r;
r = unit_exec_context_defaults(u, &s->exec_context);
r = unit_exec_context_patch_defaults(u, &s->exec_context);
if (r < 0)
return r;

View file

@ -124,6 +124,8 @@ static void swap_init(Unit *u) {
kill_context_init(&s->kill_context);
cgroup_context_init(&s->cgroup_context);
unit_cgroup_context_init_defaults(u, &s->cgroup_context);
s->parameters_proc_swaps.priority = s->parameters_fragment.priority = -1;
s->control_command_id = _SWAP_EXEC_COMMAND_INVALID;
@ -352,7 +354,7 @@ static int swap_load(Unit *u) {
return r;
}
r = unit_exec_context_defaults(u, &s->exec_context);
r = unit_exec_context_patch_defaults(u, &s->exec_context);
if (r < 0)
return r;
}

View file

@ -31,6 +31,9 @@
#DefaultStartLimitInterval=10s
#DefaultStartLimitBurst=5
#DefaultEnvironment=
#DefaultCPUAccounting=no
#DefaultBlockIOAccounting=no
#DefaultMemoryAccounting=no
#DefaultLimitCPU=
#DefaultLimitFSIZE=
#DefaultLimitDATA=

View file

@ -2777,13 +2777,30 @@ void unit_ref_unset(UnitRef *ref) {
ref->unit = NULL;
}
int unit_exec_context_defaults(Unit *u, ExecContext *c) {
int unit_cgroup_context_init_defaults(Unit *u, CGroupContext *c) {
assert(u);
assert(c);
/* Copy in the manager defaults into the cgroup context,
* _before_ the rest of the settings have been initialized */
c->cpu_accounting = u->manager->default_cpu_accounting;
c->blockio_accounting = u->manager->default_blockio_accounting;
c->memory_accounting = u->manager->default_memory_accounting;
return 0;
}
int unit_exec_context_patch_defaults(Unit *u, ExecContext *c) {
unsigned i;
int r;
assert(u);
assert(c);
/* Patch in the manager defaults into the exec context,
* _after_ the rest of the settings have been initialized */
/* This only copies in the ones that need memory */
for (i = 0; i < RLIMIT_NLIMITS; i++)
if (u->manager->rlimit[i] && !c->rlimit[i]) {

View file

@ -602,7 +602,8 @@ void unit_ref_unset(UnitRef *ref);
#define UNIT_DEREF(ref) ((ref).unit)
#define UNIT_ISSET(ref) (!!(ref).unit)
int unit_exec_context_defaults(Unit *u, ExecContext *c);
int unit_exec_context_patch_defaults(Unit *u, ExecContext *c);
int unit_cgroup_context_init_defaults(Unit *u, CGroupContext *c);
ExecContext *unit_get_exec_context(Unit *u) _pure_;
KillContext *unit_get_kill_context(Unit *u) _pure_;