[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