[lxc-devel] [PATCH] /proc/stat in lxcfs

Serge Hallyn serge.hallyn at ubuntu.com
Mon Feb 16 15:15:22 UTC 2015


Quoting Christian Brauner (christianvanbrauner at gmail.com):
> Hello,
> 
> /proc/stat mounted at /var/lib/lxcfs/ is currently missing
> (a) the cpu average-line from the hosts /proc/stat
> and
> (b) the numbering of the cores starts with 1 and not with the 0.
> (This will e.g.  cause confusion for top/htop in the container.) I wrote a
> minimally invasive patch for that:
> 
> Signed-off-by: Christian Brauner <christianvanbrauner at gmail.com>
> Date:   Sun Feb 15 10:34:41 2015 +0100
> 
>     Bring the cpu-average line to /proc/stat mounted by lxcfs and let the
>     core numbering start at 0.
> 
> diff --git a/lxcfs.c b/lxcfs.c
> index d6fb101..ab296e7 100644
> --- a/lxcfs.c
> +++ b/lxcfs.c
> @@ -1642,7 +1642,7 @@ static int proc_stat_read(char *buf, size_t size, off_t offset,
>     nih_local char *cpuset = NULL;
>     char *line = NULL;
>     size_t linelen = 0, total_len = 0;
> -   int curcpu = 0;
> +   int curcpu = -1; /* cpu numbering starts at 0 */

Thanks, this looks good;

>     FILE *f;
>  
>     if (offset)
> @@ -1662,16 +1662,22 @@ static int proc_stat_read(char *buf, size_t size, off_t offset,
>     while (getline(&line, &linelen, f) != -1) {
>         size_t l;
>         int cpu;
> +        char cpu_char[10]; /* That's a lot of cores */
>         char *c;
>  
> -       if (sscanf(line, "cpu%d", &cpu) != 1) {
> -           /* not a ^cpu line, just print it */
> +       if (sscanf(line, "cpu%9[^ ]", cpu_char) != 1) {
> +           /* not a ^cpuN line containing a number N, just print it */

Ok, so that will print the "cpu  1025201 6863 262753 7391275 7423 2 1333 0 2773 0"
line, fixing that bug.

>             l = snprintf(buf, size, "%s", line);
>             buf += l;
>             size -= l;
>             total_len += l;
>             continue;
>         }
> +        else if (sscanf(cpu_char, "%d", &cpu) != 1) {

This is an unorthodox (for lxc) coding style.  Could you explain
exactly what you're doing here?  I would expect just:

	if (sscanf(cpu_char, "%d", &cpu) != 1))
		continue;
	if (!cpu_in_cpuset(cpu, cpuset))
		continue;

> +        }
> +        else {
> +        }
> +
>         if (!cpu_in_cpuset(cpu, cpuset))
>             continue;
>         curcpu ++;
> 
> Best,
> Christian
> 
> > ----- Forwarded message from Serge Hallyn <serge.hallyn at ubuntu.com> -----
> > 
> > Date: Fri, 13 Feb 2015 04:14:11 +0000
> > From: Serge Hallyn <serge.hallyn at ubuntu.com>
> > To: Christian Brauner <christianvanbrauner at gmail.com>
> > Subject: Re: cpusets in non-unified hierarchy broken?
> > User-Agent: Mutt/1.5.21 (2010-09-15)
> > 
> > Quoting Christian Brauner (christianvanbrauner at gmail.com):
> > > On Thu, Feb 12, 2015 at 11:44:32PM +0000, Serge Hallyn wrote:
> > > > Quoting Christian Brauner (christianvanbrauner at gmail.com):
> > > > > Hi Serge,
> > > > > 
> > > > > There is random misreporting at times from top/htop inside of the
> > > > > container.  Whereas e.g. cat /proc/self/status show Cpus_allowed 0-3,
> > > > > top/htop will show only 1 core.
> > > > 
> > > > It may be getting it from /proc/stat, which you *may* be getting through
> > > > lxcfs.  It would then be filtering it through the container's cgroup
> > > > info.
> > > > 
> > > > When you start the container, does uptime say 1 minute, or does it match
> > > > the host's uptime?
> > > > 
> > > It says uptime 0 minutes aka it does not match the host's uptime.
> > > /proc/stat is looking different in the container than on the host
> > > (probably because of the cgroup filtering you mentioned).
> > > 
> > > I mentioned "random misreporting" mainly because the number of cores as
> > > displayed by top/htop in the container does not match the number of cores on
> > > the host. It is always less than on the host. I think this is caused by the
> > > implementation of /proc/stat by lxcfs.
> > > 
> > > E.g. on the host
> > > 
> > >     [chb at conventiont ~]$ cat /proc/stat | grep cpu
> > > 
> > > will show
> > > 
> > >     cpu  2061 0 1623 259471 4879 0 38 0 0 0
> > >     cpu0 568 0 458 63949 1905 0 12 0 0 0
> > >     cpu1 584 0 371 65044 1018 0 8 0 0 0
> > >     cpu2 410 0 390 65450 786 0 12 0 0 0
> > >     cpu3 498 0 403 65026 1169 0 5 0 0 0
> > > 
> > > whereas in the container
> > > 
> > >     root at vivid:~# cat /proc/stat | grep cpu
> > > 
> > > will show
> > > 
> > >     cpu1  580 0 473 68799 1906 0 12 0 0 0
> > >     cpu2  600 0 384 69836 1080 0 8 0 0 0
> > >     cpu3  434 0 413 70268 786 0 12 0 0 0
> > >     cpu4  545 0 428 69839 1169 0 5 0 0 0
> > > 
> > > So
> > > (a) the cpu average-line from the hosts /proc/stat is missing.
> > > and
> > > (b) the numbering of the cores seems to be different in the container
> > > 
> > > I guess this causes top/htop in the container to e.g. only show three cores on
> > > a four core system. Maybe, it doesn't show cpu0 at all because it thinks cpu0
> > > is actually cpu (average)? Lxcfs bug maybe?
> > 
> > Seems very likely.  If you have time to write a patch for that that'd be
> > awesome :)
> > 
> > (Else I'll keep it on my list)
> > 
> > thanks,
> > -serge
> > 
> > ----- End forwarded message -----



> _______________________________________________
> lxc-devel mailing list
> lxc-devel at lists.linuxcontainers.org
> http://lists.linuxcontainers.org/listinfo/lxc-devel



More information about the lxc-devel mailing list