[Users] OOM and /etc/vz/oom-groups.conf
Kir Kolyshkin
kir at openvz.org
Thu Oct 3 19:21:51 PDT 2013
On 10/03/2013 12:03 PM, Mark J. wrote:
> On Thu, Oct 03, 2013 at 10:41:41AM -0700, Kir Kolyshkin wrote:
>>>> Also, I wonder how much RAM do you have on your server, and how
>>>> many such containers do you run on it?
>>> Nodes have 32G on them, this particular node only allows up to 40 vm's due to the cPanel vm's having either 2, 3, or 4G depending on the plan.
>> This is severe oversell -- you have 32G but sell that as 80 to 160G.
>> At the very least you have to have an adequate amount of swap
>> on the node -- so that RAM+swap on the node should be more
>> than sum of all RAM and SWAP for all containers. Currently there
>> is no tool for that, but it's pretty easy to write such a script.
I went ahead and mocked up something. Please run the attached script on
your node
and share your results.
-------------- next part --------------
#!/bin/sh
ram=$(awk '/^MemTotal:/ {print $2/4}' < /proc/meminfo)
swap=$(awk '/^SwapTotal:/ {print $2/4}' < /proc/meminfo)
awk -v ram=$ram -v swap=$swap < /proc/bc/resources '
# converts a value to human-readable form
# v: value
# m: 1 if value is in 4K pages, 0 if in bytes
function hr(v, m) {
if ((v == 9223372036854775807) || (v == 2147483647) || (v == 0))
return "- ";
i=1
# translate pages to KB
if (m) {
v = v*4
i++
}
while (v >= 1024) {
v=v/1024
i++
}
fmt="%d%c"
if (v < 100)
fmt="%.3g%c"
return sprintf(fmt, v, substr(" KMGTPEZY", i, 1))
}
# hr() for pages
function hp(v) {
return hr(v, 1);
}
# hr() for bytes
function hb(v) {
return hr(v, 0);
}
function dp(p, d) {
if ((d == 0) || (d == 9223372036854775807) || (d == 2147483647))
return "- "
r = sprintf("%.1f", p / d * 100);
fmt="%d"
if (r < 10)
fmt="%.1g"
r = sprintf(fmt, r)
if (r == 0)
return "- "
return r "%"
}
function header() {
printf(" --------- RAM --------- -------- Swap --------- Flags\n");
printf(" used peak limit fails used peak limit fails\n");
}
function footer() {
printf(" ----- ----- ----- ----- ----- ----- ----- -----\n");
printf(" TOTAL %5s %5s %5s %5s %5s %5s %5s %5s\n\n",
hp(t_ram_held), hp(t_ram_maxheld),
hp(t_ram_limit), hb(t_ram_failcnt),
hp(t_swap_held), hp(t_swap_maxheld),
hp(t_swap_limit), hb(t_swap_failcnt));
printf("RAM available: %5s allocated: %5s oversell: %s\n",
hp(ram), hp(t_ram_limit), dp(t_ram_limit, ram));
printf("Swap available: %5s allocated: %5s oversell: %s\n",
hp(swap), hp(t_swap_limit), dp(t_swap_limit, swap));
printf("RAM+Swap available: %5s allocated: %5s oversell: %s\n",
hp(ram+swap), hp(t_ram_limit+t_swap_limit),
dp(t_ram_limit+t_swap_limit, ram+swap));
}
function process_ct() {
if (bcid <= 0)
return
flags=""
if (ram_limit == 0 || ram_limit == 2147483647 || ram_limit == 9223372036854775807) {
# Non-VSwap config!
flags="X"
# TODO: guess limit based on privvmpages / vm_overcommit
}
if (swap_failcnt > 0)
flags=flags"F"
else if (ram_failcnt < 0)
flags=flags"f"
t_ram_held += ram_held;
t_ram_maxheld += ram_maxheld;
t_ram_limit += ram_limit;
t_ram_failcnt += ram_failcnt;
t_swap_held += swap_held;
t_swap_maxheld += swap_maxheld;
t_swap_limit += swap_limit;
t_swap_failcnt += swap_failcnt;
printf("%10d %5s %5s %5s %5s %5s %5s %5s %5s %s\n",
bcid,
hp(ram_held), hp(ram_maxheld),
hp(ram_limit), hb(ram_failcnt),
hp(swap_held), hp(swap_maxheld),
hp(swap_limit), hb(swap_failcnt),
flags);
}
BEGIN {
bcid=-1
header()
}
/^Version: / {
if ($2 != "2.5") {
print "Error: unknown version:",
$2 > "/dev/stderr"
exit 1
}
next
}
/^[[:space:]]*uid / {
next
}
/^[[:space:]]*dummy/ {
next
}
/^[[:space:]]*[0-9]+:/ {
bcid=int($1)
}
/^[[:space:]]*physpages/ {
ram_held=$2
ram_maxheld=$3
ram_limit=$5
ram_failcnt=$6
}
/^[[:space:]]*swappages/ {
swap_held=$2
swap_maxheld=$3
swap_limit=$5
swap_failcnt=$6
process_ct()
}
END {
footer()
}'
More information about the Users
mailing list