Re: [Vserver] Wiki : HowTo graph vserver usage with cacti

From: Herbert Poetzl <herbert_at_13thfloor.at>
Date: Wed 21 Dec 2005 - 16:51:23 GMT
Message-ID: <20051221165123.GF28006@MAIL.13thfloor.at>

On Fri, Dec 16, 2005 at 07:39:16PM +0100, Grzegorz Nosek wrote:
> Hello,
>
> 2005/12/16, Herbert Poetzl <herbert@13thfloor.at>:
> >
> > in general, if there is real interest, and folks (at
> > least 3 parties) are volunteering to test and add the
> > required userspace tools/interfaces, please contact me
> > with a wish list (i.e. what kind of information you
> > would like to monitor) and we can probably get an
> > implementation done ... (of course, funding such
> > features migh be an alternative too :)
> >
>
> Count me in for testing :)

excellent, appreciate that!

> My wishes for vserver monitoring include:
> - loadavg and cpu% (somewhat faster than parsing /proc/virtual/*)

> - network traffic (again, somewhat faster than iptables stats, a'la
> /proc/net/dev maybe)

this will have to wait until ngnet handles it, as with
the current implementation the iptables accounting is
the fastest you get (if you are concerned about on
wire packages) ...

an alternative is the socket accounting, which gives
an userspace view of transmitted data ...

> - reliable memory usage (current implementation apparently doesn't
> account for shared memory, like libraries)

hmm, please elaborate in what way this affects your
results (i.e. why would you want to know about the
shared memory specifically)

> - disk i/o

as in bytes read/written from/to disk(s) by context
or disk operations or bandwidth?

> - process-related stuff, like fork rate might be useful (ideally
> per-user but that'd be quite an overhead probably)

hmm, fork rate can be deduced by looking at the current
processes and the number of forks in a timely manner
(i.e. that should be something the graphing tools do)

> Also (although not a monitoring issue and actually not vserver-related
> really but maybe somebody has a patch handy), I'd love to see per-user
> rlimits (the PAM-enforced ones are really per-login, so e.g. apache
> doesn't obey them at all).

hmm, shouldn't you be able to change the pam to make
them per user? guess this should be an userspace issue

> > please send me the patch (maybe again?) or point me
> > to the url where I can have a look at it ...
>
> Attached (against some older version but should apply quite cleanly)
>
> > latest devel releases support per context CFQ queues,
> > so that might get a little easier there :)
>
> Thanks, I'll look into that.

best,
Herbert

>
> Best regards,
> Grzegorz Nosek

> diff -Naur linux-2.6.13/drivers/block/ll_rw_blk.c linux-2.6.13-diskstat/drivers/block/ll_rw_blk.c
> --- linux-2.6.13/drivers/block/ll_rw_blk.c 2005-08-29 01:41:01.000000000 +0200
> +++ linux-2.6.13-diskstat/drivers/block/ll_rw_blk.c 2005-10-03 16:05:14.000000000 +0200
> @@ -29,6 +29,7 @@
> #include <linux/swap.h>
> #include <linux/writeback.h>
> #include <linux/blkdev.h>
> +#include <linux/vserver/cvirt_diskstat.h>
>
> /*
> * for max sense size
> @@ -2297,6 +2298,20 @@
> disk_round_stats(rq->rq_disk);
> rq->rq_disk->in_flight++;
> }
> +#ifdef CONFIG_VSERVER_DISKSTAT
> + struct vx_info *current_vx_info = lookup_vx_info(rq->xid);
> + if (current_vx_info) {
> + if (rw == READ) {
> + cvirt_acct_add(current_vx_info, read_sectors, nr_sectors);
> + if (!new_io)
> + cvirt_acct_add(current_vx_info, read_merges, 1);
> + } else if (rw == WRITE) {
> + cvirt_acct_add(current_vx_info, write_sectors, nr_sectors);
> + if (!new_io)
> + cvirt_acct_add(current_vx_info, write_merges, 1);
> + }
> + }
> +#endif
> }
>
> /*
> @@ -2659,6 +2674,9 @@
> req->ioprio = prio;
> req->rq_disk = bio->bi_bdev->bd_disk;
> req->start_time = jiffies;
> +#ifdef CONFIG_VSERVER_DISKSTAT
> + req->xid = bio_page(bio)->xid;
> +#endif
>
> spin_lock_irq(q->queue_lock);
> if (elv_queue_empty(q))
> @@ -3175,6 +3193,23 @@
> }
> disk_round_stats(disk);
> disk->in_flight--;
> +#ifdef CONFIG_VSERVER_DISKSTAT
> + if (req->xid) {
> + struct vx_info *current_vx_info = lookup_vx_info(req->xid);
> + if (current_vx_info) {
> + switch (rq_data_dir(req)) {
> + case WRITE:
> + cvirt_acct_add(current_vx_info, writes, 1);
> + cvirt_acct_add(current_vx_info, write_ticks, duration);
> + break;
> + case READ:
> + cvirt_acct_add(current_vx_info, reads, 1);
> + cvirt_acct_add(current_vx_info, read_ticks, duration);
> + break;
> + }
> + }
> + }
> +#endif
> }
> if (req->end_io)
> req->end_io(req);
> diff -Naur linux-2.6.13/include/linux/blkdev.h linux-2.6.13-diskstat/include/linux/blkdev.h
> --- linux-2.6.13/include/linux/blkdev.h 2005-08-29 01:41:01.000000000 +0200
> +++ linux-2.6.13-diskstat/include/linux/blkdev.h 2005-10-03 16:05:55.000000000 +0200
> @@ -195,6 +195,10 @@
> */
> rq_end_io_fn *end_io;
> void *end_io_data;
> +
> +#ifdef CONFIG_VSERVER_DISKSTAT
> + xid_t xid;
> +#endif
> };
>
> /*
> diff -Naur linux-2.6.13/include/linux/mm.h linux-2.6.13-diskstat/include/linux/mm.h
> --- linux-2.6.13/include/linux/mm.h 2005-08-29 01:41:01.000000000 +0200
> +++ linux-2.6.13-diskstat/include/linux/mm.h 2005-10-03 16:04:43.000000000 +0200
> @@ -257,6 +257,9 @@
> void *virtual; /* Kernel virtual address (NULL if
> not kmapped, ie. highmem) */
> #endif /* WANT_PAGE_VIRTUAL */
> +#ifdef CONFIG_VSERVER_DISKSTAT
> + xid_t xid;
> +#endif
> };
>
> /*
> diff -Naur linux-2.6.13/include/linux/vserver/cvirt_def.h linux-2.6.13-diskstat/include/linux/vserver/cvirt_def.h
> --- linux-2.6.13/include/linux/vserver/cvirt_def.h 2005-10-03 15:37:32.000000000 +0200
> +++ linux-2.6.13-diskstat/include/linux/vserver/cvirt_def.h 2005-10-03 16:04:43.000000000 +0200
> @@ -9,6 +9,14 @@
> #include <asm/atomic.h>
>
>
> +struct _vx_disk_stats {
> + unsigned read_sectors, write_sectors;
> + unsigned reads, writes;
> + unsigned read_merges, write_merges;
> + unsigned read_ticks, write_ticks;
> + unsigned in_flight;
> +};
> +
> struct _vx_usage_stat {
> uint64_t user;
> uint64_t nice;
> @@ -56,6 +64,10 @@
>
> atomic_t total_forks; /* number of forks so far */
>
> +#ifdef CONFIG_VSERVER_DISKSTAT
> + struct _vx_disk_stats dkstats[NR_CPUS];
> +#endif
> +
> struct _vx_usage_stat cpustat[NR_CPUS];
>
> struct _vx_syslog syslog;
> diff -Naur linux-2.6.13/include/linux/vserver/cvirt_diskstat.h linux-2.6.13-diskstat/include/linux/vserver/cvirt_diskstat.h
> --- linux-2.6.13/include/linux/vserver/cvirt_diskstat.h 1970-01-01 01:00:00.000000000 +0100
> +++ linux-2.6.13-diskstat/include/linux/vserver/cvirt_diskstat.h 2005-10-03 16:04:43.000000000 +0200
> @@ -0,0 +1,30 @@
> +#ifndef __LINUX_CVIRT_DISKSTAT_H
> +#define __LINUX_CVIRT_DISKSTAT_H
> +
> +#ifdef CONFIG_VSERVER_DISKSTAT
> +#define cvirt_acct_add(VXINFO,FIELD,STEP) \
> +do { \
> + if (VXINFO) \
> + VXINFO->cvirt.dkstats[smp_processor_id()].FIELD += STEP; \
> +} while (0)
> +
> +#define cvirt_vfs_stat_read(CVIRT,field) \
> +({ \
> + typeof(CVIRT->dkstats[0].field) res = 0; \
> + int i; \
> + for (i=0; i < NR_CPUS; i++) { \
> + if (!cpu_possible(i)) \
> + continue; \
> + res += CVIRT->dkstats[i].field; \
> + } \
> + res; \
> +})
> +
> +#else
> +
> +#define cvirt_acct_add(VXINFO,FIELD,STEP)
> +#define cvirt_vfs_stat_read(CVIRT,field) (0)
> +
> +#endif
> +
> +#endif
> diff -Naur linux-2.6.13/kernel/vserver/cvirt_proc.h linux-2.6.13-diskstat/kernel/vserver/cvirt_proc.h
> --- linux-2.6.13/kernel/vserver/cvirt_proc.h 2005-10-03 15:37:32.000000000 +0200
> +++ linux-2.6.13-diskstat/kernel/vserver/cvirt_proc.h 2005-10-03 16:04:43.000000000 +0200
> @@ -3,6 +3,7 @@
>
> #include <linux/sched.h>
>
> +#include <linux/vserver/cvirt_diskstat.h>
>
> #define LOAD_INT(x) ((x) >> FSHIFT)
> #define LOAD_FRAC(x) LOAD_INT(((x) & (FIXED_1-1)) * 100)
> @@ -52,6 +53,24 @@
> ,LOAD_INT(c), LOAD_FRAC(c)
> ,atomic_read(&cvirt->total_forks)
> );
> +#ifdef CONFIG_VSERVER_DISKSTAT
> + length += sprintf(buffer + length,
> + "reads:\t%u\n"
> + "read_sectors:\t%u\n"
> + "read_ticks:\t%u\n"
> + "writes:\t%u\n"
> + "write_sectors:\t%u\n"
> + "write_ticks:\t%u\n"
> + "in_flight:\t%u\n"
> + ,cvirt_vfs_stat_read(cvirt, reads)
> + ,cvirt_vfs_stat_read(cvirt, read_sectors)
> + ,jiffies_to_msecs(cvirt_vfs_stat_read(cvirt, read_ticks))
> + ,cvirt_vfs_stat_read(cvirt, writes)
> + ,cvirt_vfs_stat_read(cvirt, write_sectors)
> + ,jiffies_to_msecs(cvirt_vfs_stat_read(cvirt, write_ticks))
> + ,cvirt_vfs_stat_read(cvirt, in_flight)
> + );
> +#endif
> return length;
> }
>
> diff -Naur linux-2.6.13/kernel/vserver/Kconfig linux-2.6.13-diskstat/kernel/vserver/Kconfig
> --- linux-2.6.13/kernel/vserver/Kconfig 2005-10-03 15:37:32.000000000 +0200
> +++ linux-2.6.13-diskstat/kernel/vserver/Kconfig 2005-10-03 16:04:43.000000000 +0200
> @@ -185,5 +185,12 @@
> This allows you to specify the number of entries in
> the per-CPU history buffer.
>
> +config VSERVER_DISKSTAT
> + bool "VServer Disk Usage Statistics"
> + default n
> + help
> + Enables per-vserver disk usage statistics in
> + /proc/virtual/<xid>/cvirt
> +
> endmenu
>
> diff -Naur linux-2.6.13/mm/page_alloc.c linux-2.6.13-diskstat/mm/page_alloc.c
> --- linux-2.6.13/mm/page_alloc.c 2005-10-03 15:37:32.000000000 +0200
> +++ linux-2.6.13-diskstat/mm/page_alloc.c 2005-10-03 16:04:43.000000000 +0200
> @@ -965,6 +965,9 @@
> return NULL;
> got_pg:
> zone_statistics(zonelist, z);
> +#ifdef CONFIG_VSERVER_DISKSTAT
> + page->xid = current->xid;
> +#endif
> return page;
> }
>
>
>
>
>
>
>
>

> _______________________________________________
> Vserver mailing list
> Vserver@list.linux-vserver.org
> http://list.linux-vserver.org/mailman/listinfo/vserver

_______________________________________________
Vserver mailing list
Vserver@list.linux-vserver.org
http://list.linux-vserver.org/mailman/listinfo/vserver
Received on Wed Dec 21 16:51:42 2005

[Next/Previous Months] [Main vserver Project Homepage] [Howto Subscribe/Unsubscribe] [Paul Sladen's vserver stuff]
Generated on Wed 21 Dec 2005 - 16:51:47 GMT by hypermail 2.1.8