I posted the following a week ago:
> Does anyone have a quick program that returns the amount of physical RAM
>on a SparcStation? I know you can get it from the messages log file, but
>we rotate it weekly into the bitbucket, and the information isn't there if
>the machine has been up a long time.
and rec'd several responses. Thanks to everyone who responded. Especially
to Ingolf and Richard for both the C programs (at end of this posting) that return
the answer directly.
Thanks again for the helpful info.
Paul Ferroni
Allen-Bradley, Inc
Highland Hts, OH
Below is a summary of various methods:
-------------------
Per aad@dvorak.amd.com (Anthony A. Datri),
"Anna Pluzhnikov" <besp@midway.uchicago.edu>,
carl@oversteer.library.uwa.edu.au (Carl Brewer),
and guy@auspex.com (Guy Harris):
> Use a program called sysinfo which can be FTP'ed from "usc.edu", in the
> directory "pub/sysinfo"
You need to have read permissions on /dev/kmem unless you're root...
-------------------
Per doc <josh@pogo.cqs.washington.edu>,
and edavid@clipper.ens.fr (Erwan David) :
> grep for mem from dmesg output.
This is OK if your dmesg buffer isn't overrun with other messages
(which mine are, since le0 is complaining of giant packets
occassionally -- another problem for another time...)
-------------------
Per jth@ll.mit.edu (Joe Healey):
>
> BSD derived systems, like SunOS 4.X, have a kernel variable named:
> _physmem
>
> This stores the number of physical pages. So
> _physmem * pagesize = physical memory.
>
> Now there is a gotcha in SunOS. The prom monitor "steals" a
> few pages at system powerup/bootup.
>
> The following script should help. I ran it on my 670MP.
>
> You can use the kvm(3) libraries to access the kernel physmem
> variable.
>
> --------------script------------------------
> Script started on Fri Oct 22 20:20:39 1993
> dspsim1% adb /vmunix /dev/kmem
> not core file = /dev/kmem
> physmem/D
> _physmem:
> _physmem: 32676
> $q
> dspsim1% uname -a
> SunOS dspsim1 4.1.2 1 sun4m
> dspsim1%
> dspsim1% pagesize
> 4096
> dspsim1% ^D
> script done on Fri Oct 22 20:21:27 1993
-------------------
Per Dan Stromberg <strombrg@hydra.acs.uci.edu>:
> adb -w -k /vmunix /dev/mem should give a relevant report, upon
> invocation. It's not total memory, but memory left after OS overhead.
>
-------------------
Also per Dan Stromberg <strombrg@hydra.acs.uci.edu>
and venaas@nvg.unit.no (Stig Venaas):
> What about wc -c /dev/mem
> Doing the wc /dev/mem works on some machines, not others; I don't know
> about sparcs. If the memory address space is fragmented, this should
> give a seg violation or something. If the memory space contains
> memory-mapped I/O registers that do interesting things on read, you
> could well crash the machine or even zot some info on some media, like
> a disk - though it's not that likely, odder designs have been known.
This works, but takes relatively lots of time and cpu to get an answer
on a larger machine.
-------------------
Per rossen@sfu.ca:
> You know, that should be a really simple bit of information to find, but
> I've been looking through the online manuals for two days now and I STILL
> can't find a command or program to do this! This is one way that I found
> to get a rough estimate: go "ps -u" and you will get the long version
> of the process info for anything you have going. In the RSS column they
> give "resident set storage" (or something like that) in kilobytes that
> tells you how much real memory the process is using. There is also a
> %MEM column that tells you what fraction of the real memory your process is
> taking up. REAL_MEM(kbytes)=RSS/(%MEM*0.01). This gives about 6 megs for
> my machine.
-------------------
Per stevek@apertus.com (Steve Kappel)
> The "node 'memory' Size" produced by /usr/etc/devinfo -v (on SunOS 4.1) is > the hex size of RAM.
-------------------
Per markhof@ls12i.informatik.uni-dortmund.de
/*
* mem.c - print physical memory installed in a machine
*
* $Author: kensmith $
*
* $Date: 90/03/12 14:18:18 $
*
* $Log: mem.c,v $
* Revision 1.2 90/03/12 14:18:18 kensmith
* misc. cleanup
*
* Revision 1.1 90/02/09 21:43:41 kensmith
* Initial revision
*
*/
#include <stdio.h>
#include <sys/param.h>
#include <sys/types.h>
#include <sys/file.h>
#include <nlist.h>
static char rcsid[] = "$Id: mem.c,v 1.2 90/03/12 14:18:18 kensmith Exp Locker: kensmith $";
struct nlist nls[] = {
{ "_physmem" },
#define PHYSMEM 0
{ "" },
};
int fd, physmem;
char *name; /* program name */
char *rindex();
main(argc, argv)
int argc;
char *argv[];
{
if ((name = rindex(argv[0], '/')) == NULL)
name = argv[0];
else
name++;
if (nlist("/vmunix", nls) < 0) {
perror("nlist");
exit(1);
}
if ((fd = open("/dev/kmem", O_RDONLY)) <= 0) {
perror("/dev/kmem");
exit(1);
}
if (nls[PHYSMEM].n_type == 0) {
fprintf(stderr, "%s: physmem symbol not found\n", name);
exit(1);
}
lseek(fd, nls[PHYSMEM].n_value, L_SET);
read(fd, &physmem, sizeof(physmem));
printf("%dK bytes of memory\n", ctob(physmem) / 1024);
}
-------------------
Per richard@langeoog.gmd.de (Richard Czech)
/*
* Figure out how much memory there is on a machine. This works under
* Berkeley UNIX. It should work under System V if you change the
* UNIX define to "/unix" instead of "/vmunix".
*
* Of course, if you don't have read permission on the kernel and
* kernel memory, this won't work.
*
* Dave Curry
* Purdue University
* Engineering Computer Network
*
* Hacked by Larry Breniser 10/1/91
* Pagesize is now determied dynamically, not at compile
* time, as it varies from host to host (server vs workstation)
*
* davy@intrepid.ecn.purdue.edu
* $Header: /usr2/larryb/c/RCS/physmem.c,v 1.3 91/10/02 17:51:10 larryb Exp $
* $Log: physmem.c,v $
* Revision 1.3 91/10/02 17:51:10 larryb
* Added Version string to executable for ident.
*
* Revision 1.2 91/10/02 17:46:21 larryb
* Added RCS log comments.
*
*/
#include <sys/param.h>
#include <sys/types.h>
#include <nlist.h>
#include <stdio.h>
char version[] = "$Header: /usr2/larryb/c/RCS/physmem.c,v 1.3 91/10/02 17:51:10 larryb Exp $";
#define UNIX "/vmunix"
#define KMEM "/dev/kmem"
struct nlist nl[] = {
#define X_PHYSMEM 0
{ "_physmem" },
#define X_MAXMEM 1
{ "_maxmem" },
{ NULL }
};
main()
{
int kmem;
int maxmem, physmem;
int pagesize;
/*
* Look up addresses of variables.
*/
if ((nlist(UNIX, nl) < 0) || (nl[0].n_type == 0)) {
fprintf(stderr, "%s: no namelist.\n", UNIX);
exit(1);
}
/*
* Open kernel memory.
*/
if ((kmem = open(KMEM, 0)) < 0) {
perror(KMEM);
exit(1);
}
/*
* Read variables.
*/
lseek(kmem, (long) nl[X_PHYSMEM].n_value, 0);
read(kmem, (char *) &physmem, sizeof(int));
lseek(kmem, (long) nl[X_MAXMEM].n_value, 0);
read(kmem, (char *) &maxmem, sizeof(int));
close(kmem);
pagesize=getpagesize();
/*
* Print the numbers. The internal representation is
* in units of core clicks; convert to bytes.
*/
printf("Pagesize: %d\n", pagesize);
printf("Physical machine memory: %d\n", pagesize * physmem);
printf("Max memory available to a process: %d\n", pagesize * maxmem);
exit(0);
}
This archive was generated by hypermail 2.1.2 : Fri Sep 28 2001 - 23:08:27 CDT