ftp.nice.ch/pub/next/tools/performance/Monitor.1.1.NIHS.bs.tar.gz#/Monitor/sample.c

This is sample.c in view mode; [Download] [Up]

#include <stdio.h>
#include <nlist.h>
#include <mach/machine/vm_types.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <net/if.h>
#include <sys/file.h>
#include <sys/param.h>
#include <sys/dk.h>
#define	KERNEL
#include <sys/time.h>
#undef KERNEL
#include <sys/kernel.h>
#include <sys/vmmeter.h>
#include <sys/vmsystm.h>
#include <mach/vm_statistics.h>

#define	peek(index,value) \
   do {if (lseek(kmem, (index), L_SET) != (off_t) (index)) {fprintf(stderr, "vmstat: cannot seek in /dev/kmem\n"); exit(1);} \
       if (read(kmem, &(value), sizeof(value)) != sizeof(value)) {fprintf(stderr, "vmstat: cannot read from /dev/kmem\n"); exit(1);}} while (0)

struct nlist nl[] =
{
   {{"_avenrun"}, 0, 0, 0, 0},
#define	X_AVENRUN	0

   {{"_boottime"}, 0, 0, 0, 0},
#define	X_BOOTTIME	1

   {{"_cnt"}, 0, 0, 0, 0},
#define	X_CNT		2

   {{"_cp_time"}, 0, 0, 0, 0},
#define	X_CP_TIME	3

   {{"_deficit"}, 0, 0, 0, 0},
#define	X_DEFICIT	4

   {{"_dk_ndrive"}, 0, 0, 0, 0},
#define	X_DK_NDRIVE	5

   {{"_dk_time"}, 0, 0, 0, 0},
#define	X_DK_TIME	6

   {{"_dk_seek"}, 0, 0, 0, 0},
#define	X_DK_SEEK	7

   {{"_dk_xfer"}, 0, 0, 0, 0},
#define	X_DK_XFER	8

   {{"_dk_wds"}, 0, 0, 0, 0},
#define	X_DK_WDS	9

   {{"_dk_bps"}, 0, 0, 0, 0},
#define	X_DK_BPS	10

   {{"_domainname"}, 0, 0, 0, 0},
#define	X_DOMAINNAME	11

   {{"_domainnamelen"}, 0, 0, 0, 0},
#define	X_DOMAINNAMELEN	12

   {{"_forkstat"}, 0, 0, 0, 0},
#define	X_FORKSTAT	13

   {{"_freemem"}, 0, 0, 0, 0},
#define	X_FREEMEM	14

   {{"_hostname"}, 0, 0, 0, 0},
#define	X_HOSTNAME	15

   {{"_hostnamelen"}, 0, 0, 0, 0},
#define	X_HOSTNAMELEN	16

   {{"_hz"}, 0, 0, 0, 0},
#define	X_HZ		17

   {{"_ifnet"}, 0, 0, 0, 0},
#define	X_IFNET		18

   {{"_mach_factor"}, 0, 0, 0, 0},
#define	X_MACH_FACTOR	19

   {{"_mem_size"}, 0, 0, 0, 0},
#define	X_MEM_SIZE	20

   {{"_nproc"}, 0, 0, 0, 0},
#define X_NPROC		21

   {{"_rate"}, 0, 0, 0, 0},
#define	X_RATE		22

   {{"_sum"}, 0, 0, 0, 0},
#define	X_SUM		23

   {{"_total"}, 0, 0, 0, 0},
#define	X_TOTAL		24

   {{"_vm_stat"}, 0, 0, 0, 0},
#define	X_VM_STAT	25

   {{""}, 0, 0, 0, 0}
};

main()
{
   int			kmem;
   int			i;
   char			line[128];
   struct ifnet		ifnet;

   char			hostname[MAXHOSTNAMELEN];
   int			hostnamelen;
   char			domainname[32];
   int			domainnamelen;
   struct timeval	boottime;
   int			hz;
   long			avenrun[3];
   int			nproc;
   long			mach_factor[3];
   long			cp_time[CPUSTATES];
   struct vmmeter	cnt;
   struct vmmeter	rate;
   struct vmmeter	sum;
   struct vmtotal	total;
   struct forkstat	forkstat;
   vm_size_t		mem_size;
   int			freemem;
   int			deficit;
   struct vm_statistics vm_stat;
   int			dk_ndrive;
   long			dk_time[DK_NDRIVE];
   long			dk_seek[DK_NDRIVE];
   long			dk_xfer[DK_NDRIVE];
   long			dk_wds[DK_NDRIVE];
   long			dk_bps[DK_NDRIVE];
   struct ifnet	       *ifnetp;

   if (nlist("/mach", nl)< 0)
   {
      fprintf(stderr, "vmstat: cannot nlist /vmunix\n");
      exit(1);
   }

   for (i = 0; *nl[i].n_un.n_name; i++)
      printf("nlist entry {%s, 0x%x, 0x%x, %d, 0x%x}\n", nl[i].n_un.n_name,
	 nl[i].n_type, nl[i].n_sect, nl[i].n_desc, nl[i].n_value);
   printf("\n");

   if ((kmem = open("/dev/kmem", O_RDONLY)) < 0)
   {
      fprintf(stderr, "vmstat: cannot open /dev/kmem\n");
      exit(1);
   }

   peek(nl[X_HOSTNAME].n_value, hostname);
   peek(nl[X_HOSTNAMELEN].n_value, hostnamelen);
   peek(nl[X_DOMAINNAME].n_value, domainname);
   peek(nl[X_DOMAINNAMELEN].n_value, domainnamelen);

   peek(nl[X_BOOTTIME].n_value, boottime);

   peek(nl[X_HZ].n_value, hz);

   peek(nl[X_AVENRUN].n_value, avenrun);
   peek(nl[X_NPROC].n_value, nproc);
   peek(nl[X_MACH_FACTOR].n_value, mach_factor);

   peek(nl[X_CP_TIME].n_value, cp_time);

   peek(nl[X_CNT].n_value, cnt);
   peek(nl[X_RATE].n_value, rate);
   peek(nl[X_SUM].n_value, sum);

   peek(nl[X_TOTAL].n_value, total);

   peek(nl[X_FORKSTAT].n_value, forkstat);

   peek(nl[X_MEM_SIZE].n_value, mem_size);
   peek(nl[X_FREEMEM].n_value, freemem);
   peek(nl[X_DEFICIT].n_value, deficit);
   peek(nl[X_VM_STAT].n_value, vm_stat);

   peek(nl[X_DK_NDRIVE].n_value, dk_ndrive);
   peek(nl[X_DK_TIME].n_value, dk_time);
   peek(nl[X_DK_SEEK].n_value, dk_seek);
   peek(nl[X_DK_XFER].n_value, dk_xfer);
   peek(nl[X_DK_WDS].n_value, dk_wds);
   peek(nl[X_DK_BPS].n_value, dk_bps);

   peek(nl[X_IFNET].n_value, ifnetp);

   printf("hostname \"%.*s\", domainname \"%.*s\"\n", hostnamelen, hostname, domainnamelen, domainname);
   printf("values returned by struct timeval boottime\n");
      printf("   %ld   %ld   %s", boottime.tv_sec, boottime.tv_usec, ctime(&boottime.tv_sec));
   printf("value returned by int hz\n");
      printf("   %d\n", hz);
   printf("values returned by long avenrun[3]\n");
      printf("   %ld   %ld   %ld\n", avenrun[0], avenrun[1], avenrun[2]);
   printf("value returned by int nproc\n");
      printf("   %d\n", nproc);
   printf("values returned by long mach_factor[3]\n");
      printf("   %ld   %ld   %ld\n", mach_factor[0], mach_factor[1], mach_factor[2]);
   printf("values returned by long cp_time[%d]\n", CPUSTATES);
      for (i = 0; i < CPUSTATES; i++)
	 printf("   %ld", cp_time[i]);
      printf("\n");
   printf("values returned by struct vmmeter cnt\n");
      printf("   context switches %u\n", cnt.v_swtch);
      printf("   calls to trap %u\n", cnt.v_trap);
      printf("   calls to syscall() %u\n", cnt.v_syscall);
      printf("   device interrupts %u\n", cnt.v_intr);
      printf("   software interrupts %u\n", cnt.v_soft);
      printf("   pseudo-dma interrupts %u\n", cnt.v_pdma);
      printf("   pages swapped in %u\n", cnt.v_pswpin);
      printf("   pages swapped out %u\n", cnt.v_pswpout);
      printf("   pageins %u\n", cnt.v_pgin);
      printf("   pageouts %u\n", cnt.v_pgout);
      printf("   pages paged in %u\n", cnt.v_pgpgin);
      printf("   pages paged out %u\n", cnt.v_pgpgout);
      printf("   intransit blocking page faults %u\n", cnt.v_intrans);
      printf("   total page reclaims %u\n", cnt.v_pgrec);
      printf("   found in free list rather than on swapdev %u\n", cnt.v_xsfrec);
      printf("   found in free list rather than in filsys %u\n", cnt.v_xifrec);
      printf("   pages filled on demand from executables %u\n", cnt.v_exfod);
      printf("   pages zero filled on demand %u\n", cnt.v_zfod);
      printf("   fills of pages mapped by vread() %u\n", cnt.v_vrfod);
      printf("   number of exfod's created %u\n", cnt.v_nexfod);
      printf("   number of zfod's created %u\n", cnt.v_nzfod);
      printf("   number of vrfod's created %u\n", cnt.v_nvrfod);
      printf("   page reclaims from free list %u\n", cnt.v_pgfrec);
      printf("   total faults taken %u\n", cnt.v_faults);
      printf("   scans in page out daemon %u\n", cnt.v_scan);
      printf("   revolutions of the hand %u\n", cnt.v_rev);
      printf("   pages taken from sequential programs %u\n", cnt.v_seqfree);
      printf("   pages freed by daemon %u\n", cnt.v_dfree);
      printf("   fast reclaims in locore %u\n", cnt.v_fastpgrec);
      printf("   swapins %u\n", cnt.v_swpin);
      printf("   swapouts %u\n", cnt.v_swpout);
   printf("values returned by struct vmmeter rate\n");
      printf("   context switches %u\n", rate.v_swtch);
      printf("   calls to trap %u\n", rate.v_trap);
      printf("   calls to syscall() %u\n", rate.v_syscall);
      printf("   device interrupts %u\n", rate.v_intr);
      printf("   software interrupts %u\n", rate.v_soft);
      printf("   pseudo-dma interrupts %u\n", rate.v_pdma);
      printf("   pages swapped in %u\n", rate.v_pswpin);
      printf("   pages swapped out %u\n", rate.v_pswpout);
      printf("   pageins %u\n", rate.v_pgin);
      printf("   pageouts %u\n", rate.v_pgout);
      printf("   pages paged in %u\n", rate.v_pgpgin);
      printf("   pages paged out %u\n", rate.v_pgpgout);
      printf("   intransit blocking page faults %u\n", rate.v_intrans);
      printf("   total page reclaims %u\n", rate.v_pgrec);
      printf("   found in free list rather than on swapdev %u\n", rate.v_xsfrec);
      printf("   found in free list rather than in filsys %u\n", rate.v_xifrec);
      printf("   pages filled on demand from executables %u\n", rate.v_exfod);
      printf("   pages zero filled on demand %u\n", rate.v_zfod);
      printf("   fills of pages mapped by vread() %u\n", rate.v_vrfod);
      printf("   number of exfod's created %u\n", rate.v_nexfod);
      printf("   number of zfod's created %u\n", rate.v_nzfod);
      printf("   number of vrfod's created %u\n", rate.v_nvrfod);
      printf("   page reclaims from free list %u\n", rate.v_pgfrec);
      printf("   total faults taken %u\n", rate.v_faults);
      printf("   scans in page out daemon %u\n", rate.v_scan);
      printf("   revolutions of the hand %u\n", rate.v_rev);
      printf("   pages taken from sequential programs %u\n", rate.v_seqfree);
      printf("   pages freed by daemon %u\n", rate.v_dfree);
      printf("   fast reclaims in locore %u\n", rate.v_fastpgrec);
      printf("   swapins %u\n", rate.v_swpin);
      printf("   swapouts %u\n", rate.v_swpout);
   printf("values returned by struct vmmeter sum\n");
      printf("   context switches %u\n", sum.v_swtch);
      printf("   calls to trap %u\n", sum.v_trap);
      printf("   calls to syscall() %u\n", sum.v_syscall);
      printf("   device interrupts %u\n", sum.v_intr);
      printf("   software interrupts %u\n", sum.v_soft);
      printf("   pseudo-dma interrupts %u\n", sum.v_pdma);
      printf("   pages swapped in %u\n", sum.v_pswpin);
      printf("   pages swapped out %u\n", sum.v_pswpout);
      printf("   pageins %u\n", sum.v_pgin);
      printf("   pageouts %u\n", sum.v_pgout);
      printf("   pages paged in %u\n", sum.v_pgpgin);
      printf("   pages paged out %u\n", sum.v_pgpgout);
      printf("   intransit blocking page faults %u\n", sum.v_intrans);
      printf("   total page reclaims %u\n", sum.v_pgrec);
      printf("   found in free list rather than on swapdev %u\n", sum.v_xsfrec);
      printf("   found in free list rather than in filsys %u\n", sum.v_xifrec);
      printf("   pages filled on demand from executables %u\n", sum.v_exfod);
      printf("   pages zero filled on demand %u\n", sum.v_zfod);
      printf("   fills of pages mapped by vread() %u\n", sum.v_vrfod);
      printf("   number of exfod's created %u\n", sum.v_nexfod);
      printf("   number of zfod's created %u\n", sum.v_nzfod);
      printf("   number of vrfod's created %u\n", sum.v_nvrfod);
      printf("   page reclaims from free list %u\n", sum.v_pgfrec);
      printf("   total faults taken %u\n", sum.v_faults);
      printf("   scans in page out daemon %u\n", sum.v_scan);
      printf("   revolutions of the hand %u\n", sum.v_rev);
      printf("   pages taken from sequential programs %u\n", sum.v_seqfree);
      printf("   pages freed by daemon %u\n", sum.v_dfree);
      printf("   fast reclaims in locore %u\n", sum.v_fastpgrec);
      printf("   swapins %u\n", sum.v_swpin);
      printf("   swapouts %u\n", sum.v_swpout);
   printf("values returned by struct vmtotal total\n");
      printf("   length of the run queue %d\n", total.t_rq);
      printf("   jobs in ``disk wait'' (neg priority) %d\n", total.t_dw);
      printf("   jobs in page wait %d\n", total.t_pw);
      printf("   jobs sleeping in core %d\n", total.t_sl);
      printf("   swapped out runnable/short block jobs %d\n", total.t_sw);
      printf("   total virtual memory %ld\n", total.t_vm);
      printf("   active virtual memory %ld\n", total.t_avm);
      printf("   total real memory in use %ld\n", total.t_rm);
      printf("   active real memory %ld\n", total.t_arm);
      printf("   virtual memory used by text %ld\n", total.t_vmtxt);
      printf("   active virtual memory used by text %ld\n", total.t_avmtxt);
      printf("   real memory used by text %ld\n", total.t_rmtxt);
      printf("   active real memory used by text %ld\n", total.t_armtxt);
      printf("   free memory pages %ld\n", total.t_free);
   printf("values returned by struct forkstat forkstat\n");
      printf("   number of forks %d\n", forkstat.cntfork);
      printf("   number of vforks %d\n", forkstat.cntvfork);
      printf("   size of forks %d\n", forkstat.sizfork);
      printf("   size of vforks %d\n", forkstat.sizvfork);
   printf("value returned by vm_size_t mem_size\n");
      printf("   %u\n", mem_size);
   printf("value returned by int freemem\n");
      printf("   %d\n", freemem);
   printf("value returned by int deficit\n");
      printf("   %d\n", deficit);
   printf("values returned by struct vm_statistics vm_stat\n");
      printf("   page size in bytes %ld\n", vm_stat.pagesize);
      printf("   number of pages free %ld\n", vm_stat.free_count);
      printf("   number of pages active %ld\n", vm_stat.active_count);
      printf("   number of pages inactive %ld\n", vm_stat.inactive_count);
      printf("   number of pages wired down %ld\n", vm_stat.wire_count);
      printf("   number of zero fill pages %ld\n", vm_stat.zero_fill_count);
      printf("   number of pages reactivated %ld\n", vm_stat.reactivations);
      printf("   number of pageins %ld\n", vm_stat.pageins);
      printf("   number of pageouts %ld\n", vm_stat.pageouts);
      printf("   number of page faults %ld\n", vm_stat.faults);
      printf("   number of copy-on-write faults %ld\n", vm_stat.cow_faults);
      printf("   number of object cache lookups %ld\n", vm_stat.lookups);
      printf("   number of object cache hits %ld\n", vm_stat.hits);
   printf("values returned by long dk_time[%d]\n", dk_ndrive);
      for (i = 0; i < dk_ndrive; i++)
	 printf("   %ld", dk_time[i]);
      printf("\n");
   printf("values returned by long dk_seek[%d]\n", dk_ndrive);
      for (i = 0; i < dk_ndrive; i++)
	 printf("   %ld", dk_seek[i]);
      printf("\n");
   printf("values returned by long dk_xfer[%d]\n", dk_ndrive);
      for (i = 0; i < dk_ndrive; i++)
	 printf("   %ld", dk_xfer[i]);
      printf("\n");
   printf("values returned by long dk_wds[%d]\n", dk_ndrive);
      for (i = 0; i < dk_ndrive; i++)
	 printf("   %ld", dk_wds[i]);
      printf("\n");
   printf("values returned by long dk_bps[%d]\n", dk_ndrive);
      for (i = 0; i < dk_ndrive; i++)
	 printf("   %ld", dk_bps[i]);
      printf("\n");
   printf("values returned by struct ifnet *ifnet\n");
      for (i = 1; ifnetp; ifnetp = ifnet.if_next, i++)
      {
	 peek(ifnetp, ifnet);
	 peek(ifnet.if_name, line);
	 printf("   name \"%s\"\n", line);
	 printf("   sub-unit for lower level driver %d\n", ifnet.if_unit);
	 printf("   maximum transmission unit %d\n", ifnet.if_mtu);
	 printf("   flags 0x%x\n", ifnet.if_flags);
	 /* printf("   time until watchdog called %d\n", ifnet.if_timer); */
	 printf("   routing metric %d\n", ifnet.if_metric);
	 printf("   packets received on interface %d\n", ifnet.if_ipackets);
	 printf("   input errors on interface %d\n", ifnet.if_ierrors);
	 printf("   packets sent on interface %d\n", ifnet.if_opackets);
	 printf("   output errors on interface %d\n", ifnet.if_oerrors);
	 printf("   collisions on interface %d\n", ifnet.if_collisions);
      }

   close(kmem);
   exit(0);
}

These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.