Bug#741505: ulatencyd: On group active unable to set cpu.share from configuration
Package: ulatencyd
Version: 0.5.0-8
Severity: normal
On subgroup active result of cpu.share is1024 instead of 1500.
-- System Information:
Debian Release: jessie/sid
APT prefers stable-updates
APT policy: (500, 'stable-updates'), (500, 'testing'), (500, 'stable')
Architecture: amd64 (x86_64)
Foreign Architectures: i386
Kernel: Linux 3.12-1-amd64 (SMP w/2 CPU cores)
Locale: LANG=en_US.UTF-8, LC_CTYPE=en_US.UTF-8 (charmap=UTF-8)
Shell: /bin/sh linked to /bin/dash
Versions of packages ulatencyd depends on:
ii dbus 1.8.0-2
ii dpkg 1.17.6
ii libc6 2.18-4
ii libdbus-1-3 1.8.0-2
ii libdbus-glib-1-2 0.102-1
ii libglib2.0-0 2.38.2-5
ii liblua5.1-0 5.1.5-5
ii libpolkit-gobject-1-0 0.105-4
ii libxau6 1:1.0.8-1
ii libxcb1 1.10-2
ii lua-posix 29-7
ii lua5.1 [lua] 5.1.5-5
Versions of packages ulatencyd recommends:
ii consolekit 0.4.6-4
ulatencyd suggests no packages.
-- Configuration Files:
/etc/init.d/ulatencyd [Errno 2] No such file or directory: u'/etc/init.d/ulatencyd'
/etc/ulatencyd/scheduler/20-desktop.lua changed:
--[[
Copyright 2010,2011 ulatencyd developers
This file is part of ulatencyd.
License: GNU General Public License 3 or later
]]--
SCHEDULER_MAPPING_DESKTOP = {
info = {
description = "a good default desktop configuration"
}
}
-- cpu & memory configuration
SCHEDULER_MAPPING_DESKTOP["cpu"] =
{
{
name = "rt_tasks",
cgroups_name = "rt_tasks",
param = { ["cpu.shares"]="3048", ["?cpu.rt_runtime_us"] = "949500" },
check = function(proc)
local rv = proc.received_rt or check_label({"sched.rt"}, proc) or proc.vm_size == 0
return rv
end,
},
{
name = "system_essential",
cgroups_name = "sys_essential",
param = { ["cpu.shares"]="3048" },
label = { "system.essential" }
},
{
name = "user",
cgroups_name = "usr_${euid}",
check = function(proc)
return ( proc.euid > 999 )
end,
param = { ["cpu.shares"]="3048", ["?cpu.rt_runtime_us"] = "100" },
children = {
{
name = "poison",
param = { ["cpu.shares"]="10" },
label = { "user.poison" },
cgroups_name = "psn_${pid}",
},
{
name = "poison_group",
param = { ["cpu.shares"]="300" },
cgroups_name = "pgr_${pgrp}",
check = function(proc)
local rv = ulatency.find_flag(ulatency.list_flags(), {name = "user.poison.group",
value = proc.pgrp})
return rv ~= nil
end,
},
{
name = "bg_high",
param = { ["cpu.shares"]="1000", ["?cpu.rt_runtime_us"] = "1"},
label = { "user.bg_high" },
cgroups_name = "bg_h_${pid}",
},
{
name = "media",
param = { ["cpu.shares"]="2600", ["?cpu.rt_runtime_us"] = "1"},
label = { "user.media" },
cgroups_name = "med_${pid}",
},
{
name = "ui",
param = { ["cpu.shares"]="2000", ["?cpu.rt_runtime_us"] = "1"},
label = { "user.ui" },
cgroups_name = "ui_${pid}",
},
{
name = "active",
param = { ["cpu.shares"]="1500", ["?cpu.rt_runtime_us"] = "1"},
cgroups_name = "usr_${euid}_active",
check = function(proc)
return proc.is_active
end
},
{
name = "idle",
param = { ["cpu.shares"]="200"},
label = { "user.idle" },
cgroups_name = "idl_${pid}",
},
{
name = "group",
param = { ["cpu.shares"]="600", ["?cpu.rt_runtime_us"] = "1"},
cgroups_name = "grp_${pgrp}",
check = function(proc)
return true
end,
},
},
},
{
name = "system",
cgroups_name = "sys_idle",
label = { "daemon.idle" },
param = { ["cpu.shares"]="1"},
},
{
name = "system",
cgroups_name = "sys_bg",
label = { "daemon.bg" },
param = { ["cpu.shares"]="600"},
},
{
name = "system",
cgroups_name = "sys_daemon",
check = function(proc)
-- don't put kernel threads into a cgroup
return (proc.ppid ~= 0 or proc.pid == 1)
end,
param = { ["cpu.shares"]="800",
["?cpu.rt_runtime_us"] = "1"},
}
}
SCHEDULER_MAPPING_DESKTOP["memory"] =
{
{
name = "system_essential",
cgroups_name = "sys_essential",
param = { ["?memory.swappiness"] = "0" },
label = { "system.essential" }
},
{
name = "user",
cgroups_name = "usr_${euid}",
check = function(proc)
return ( proc.euid > 999 )
end,
children = {
{
name = "poison",
label = { "user.poison" },
cgroups_name = "psn_${pid}",
adjust_new = function(cgroup, proc)
cgroup:add_task(proc.pid)
cgroup:commit()
bytes = cgroup:get_value("memory.usage_in_bytes")
if not bytes then
ulatency.log_warning("can't access memory subsystem")
return
end
bytes = math.floor(bytes*(tonumber(ulatency.get_config("memory", "process_downsize")) or 0.95))
cgroup:set_value("memory.soft_limit_in_bytes", bytes)
-- we use soft limit, but without limit we can't set the memsw limit
local max_rss = math.floor(num_or_percent(ulatency.get_config("memory", "max_rss"),
Scheduler.meminfo.kb_main_total,
false) * 1024)
local total_limit = math.max(math.floor(num_or_percent(ulatency.get_config("memory", "total_limit"),
Scheduler.meminfo.kb_main_total + Scheduler.meminfo.kb_swap_total) * 1024),
max_rss)
ulatency.log_info("memory container created: ".. cgroup.name .. " max_rss:" .. tostring(max_rss) .. " max_total:" .. tostring(total_limit) .. " soft_limit:".. tostring(bytes))
cgroup:set_value("memory.limit_in_bytes", max_rss)
cgroup:set_value("?memory.memsw.limit_in_bytes", total_limit, max_rss)
cgroup:commit()
end
},
{
name = "poison_group",
cgroups_name = "pgr_${pgrp}",
check = function(proc)
local rv = ulatency.find_flag(ulatency.list_flags(), {name = "user.poison.group",
value = proc.pgrp})
return rv ~= nil
end,
adjust_new = function(cgroup, proc)
local flag = ulatency.find_flag(ulatency.list_flags(),
{ name = "user.poison.group",
value = proc.pgrp })
cgroup:add_task(proc.pid)
cgroup:set_value("memory.soft_limit_in_bytes", math.ceil(flag.threshold*(tonumber(ulatency.get_config("memory", "group_downsize") or 0.95))))
-- we use soft limit, but without limit we can't set the memsw limit
local max_rss = math.floor(num_or_percent(ulatency.get_config("memory", "max_rss"),
Scheduler.meminfo.kb_main_total,
false) * 1024)
local total_limit = math.max(math.floor(num_or_percent(ulatency.get_config("memory", "total_limit"),
Scheduler.meminfo.kb_main_total + Scheduler.meminfo.kb_swap_total) * 1024),
max_rss)
ulatency.log_info("memory container created: ".. cgroup.name .. " max_rss:" .. tostring(max_rss) .. " max_total:" .. tostring(total_limit) .. " soft_limit:".. tostring(bytes))
cgroup:set_value("memory.limit_in_bytes", max_rss)
cgroup:set_value("?memory.memsw.limit_in_bytes", total_limit, max_rss)
cgroup:commit()
end
},
{
name = "bg_high",
param = { ["?memory.swappiness"] = "20" },
label = { "user.bg_high" },
},
{
name = "media",
param = { ["?memory.swappiness"] = "40" },
label = { "user.media" },
},
{
name = "ui",
param = { ["?memory.swappiness"] = "0" },
label = { "user.ui" }
},
{
name = "active",
param = { ["?memory.swappiness"] = "0" },
check = function(proc)
return proc.is_active
end
},
{
name = "idle",
param = { ["?memory.swappiness"] = "100" },
},
{
name = "group",
param = {["?memory.swappiness"] = "60" },
cgroups_name = "default",
check = function(proc)
return true
end,
},
},
},
{
name = "system",
cgroups_name = "sys_idle",
label = { "daemon.idle" },
param = { ["?memory.swappiness"] = "100" },
},
{
name = "system",
cgroups_name = "sys_bg",
label = { "daemon.bg" },
param = { ["?memory.swappiness"] = "100" },
},
{
name = "system",
cgroups_name = "sys_daemon",
check = function(proc)
-- don't put kernel threads into a cgroup
return (proc.ppid ~= 0 or proc.pid == 1)
end,
param = { ["?memory.swappiness"] = "70" },
},
{
name = "kernel",
cgroups_name = "",
check = function(proc)
return (proc.vm_size == 0)
end
},
}
-- io configuration. blkio does not support hirarchies
SCHEDULER_MAPPING_DESKTOP["blkio"] =
{
{
name = "poison",
label = { "user.poison" },
cgroups_name = "psn_${pid}",
param = { ["blkio.weight"]="10" },
adjust = function(cgroup, proc)
save_io_prio(proc, 7, ulatency.IOPRIO_CLASS_IDLE)
end,
},
{
name = "poison_group",
label = { "user.poison.group" },
cgroups_name = "psn_${pgrp}",
param = { ["blkio.weight"]="10" },
adjust = function(cgroup, proc)
save_io_prio(proc, 7, ulatency.IOPRIO_CLASS_IDLE)
end,
},
{
name = "active",
cgroups_name = "usr_${euid}_active",
param = { ["blkio.weight"]="1000" },
check = function(proc)
return proc.is_active
end,
adjust = function(cgroup, proc)
save_io_prio(proc, 3, ulatency.IOPRIO_CLASS_BE)
end,
},
{
name = "ui",
label = { "user.ui" },
cgroups_name = "ui_${pid}",
adjust = function(cgroup, proc)
save_io_prio(proc, 2, ulatency.IOPRIO_CLASS_BE)
end,
},
{
name = "idle",
param = { ["blkio.weight"]="10" },
label = { "daemon.idle", "user.idle" },
adjust = function(cgroup, proc)
save_io_prio(proc, 5, ulatency.IOPRIO_CLASS_IDLE)
end,
},
{
name = "media",
param = { ["blkio.weight"]="300" },
cgroups_name = "med_${pid}",
label = { "user.media"},
adjust = function(cgroup, proc)
save_io_prio(proc, 7, ulatency.IOPRIO_CLASS_RT)
end,
},
{
name = "group",
param = { ["blkio.weight"]="300" },
cgroups_name = "grp_${pgrp}",
check = function(proc)
return proc.pgrp > 0
end,
adjust = function(cgroup, proc)
restore_io_prio(proc)
end,
},
{
name = "kernel",
cgroups_name = "",
check = function(proc)
return (proc.vm_size == 0)
end
},
}
-- no debconf information
Reply to: