分享
 
 
 

Unix编程/应用问答中文版---4.系统资源相关问题

王朝system·作者佚名  2008-05-18
窄屏简体版  字體: |||超大  

作者:不祥 [文章出自: www.fanqiang.com]

4. 系统资源相关问题

4.1 主流Unix操作系统上如何编程获取进程的内存、CPU利用状况

4.2 Solaris下如何获知CPU速率

4.3 如何编程获取Solaris系统当前内存大小

--------------------------------------------------------------------------

4. 系统资源相关问题

4.1 主流Unix操作系统上如何编程获取进程的内存、CPU利用状况

Q: Solaris下如何编程获知CPU占用率和内存占用信息呢,可移植吗?

Q: 我想写个程序遍历当前运行中的活动进程,Solaris提供相应系统调用了吗

A: Nicholas Dronen <ndronen@io.frii.com>

不可移植。man -s 4 proc,man -s 3k kstat

如果不是编程,可以用top、mpstat、vmstat、sar(1)等等,还有

/usr/ucb/ps -aux,对于Solaris来说,后者更直接精炼,top不是标准配置。

# /usr/bin/prstat (Solaris 8 prstat(1M)手册页)

# /usr/ucb/ps -aux | head (Solaris 2.x)

Q: 主流Unix操作系统上如何编程获取进程的内存、CPU利用状况,AIX、HP、SUN

process memory usage

process cpu time usage

A: Nate Eldredge <neldredge@hmc.edu>

man -s 3C getrusage

D: 小四 <cloudsky@263.net>

在SPARC/Solaris 2.6/7下结论一致,只支持了ru_utime和ru_stime成员,其他成员

被设置成0。FreeBSD 4.3-RELEASE上测试,则不只支持ru_utime和ru_stime成员。从

FreeBSD的getrusage(2)手册页可以看到,这个函数源自4.2 BSD。

至少对于SPARC/Solaris 2.6/7,getrusage(3C)并无多大意义。

A: Robert Owen Thomas <robt@cymru.com>

对于Solaris,可以利用procfs接口,下面的例子获取指定进程的内存占用情况

--------------------------------------------------------------------------

/*

* @(#)memlook.c 1.0 10 Nov 1997

* Robert Owen Thomas robt@cymru.com

* memlook.c -- A process memory utilization reporting tool.

*

* gcc -Wall -O3 -o memlook memlook.c

*/

#pragma ident "@(#)memlook.c 1.0 10 Nov 1997 Robert Owen Thomas robt@cymru.com"

#include <stdio.h>

#include <stdlib.h>

#include <sys/types.h>

#include <sys/stat.h>

#include <sys/signal.h>

#include <sys/syscall.h>

#include <sys/procfs.h>

#include <sys/param.h>

#include <unistd.h>

#include <fcntl.h>

int counter = 10;

int showUsage ( const char * );

void getInfo ( int, int );

int main ( int argc, char * argv[] )

{

int fd, pid, timeloop = 0;

char pidpath[BUFSIZ]; /* /usr/include/stdio.h: #define BUFSIZ 1024 */

switch ( argc )

{

case 2:

break;

case 3:

timeloop = atoi( argv[2] );

break;

default:

showUsage( argv[0] );

break;

} /* end of switch */

pid = atoi( argv[1] );

sprintf( pidpath, "/proc/%-d", pid ); /* -表示向左靠 */

/*

* /proc/1/是目录,但在这种用法中,就是直接打开目录,不是打开文件

*/

if ( ( fd = open( pidpath, O_RDONLY ) ) < 0 )

{

perror( pidpath );

exit( 1 );

}

if ( 0 < timeloop )

{

for ( ; ; )

{

getInfo( fd, pid );

sleep( timeloop );

}

}

getInfo( fd, pid );

close( fd );

exit( 0 );

} /* end of main */

int showUsage ( const char * progname )

{

fprintf( stderr, "%s: usage: %s < PID > [time delay]\\n", progname, progname

);

exit( 3 );

} /* end of showUsage */

void getInfo ( int fd, int pid )

{

prpsinfo_t prp;

prstatus_t prs;

if ( ioctl( fd, PIOCPSINFO, &prp ) < 0 )

{

perror( "ioctl" );

exit( 5 );

}

if ( ioctl( fd, PIOCSTATUS, &prs ) < 0 )

{

perror( "ioctl" );

exit( 7 );

}

if ( counter > 9 )

{

fprintf( stdout, "PID\\tIMAGE\\t\\tRSS\\t\\tHEAP\\t\\tSTACK\\n" );

counter = 0;

}

fprintf( stdout, "%u\\t%-9u\\t%-9u\\t%-15u\\t%-15u\\n", pid,

( unsigned int )prp.pr_bysize, ( unsigned int )prp.pr_byrssize,

( unsigned int )prs.pr_brksize, ( unsigned int )prs.pr_stksize );

counter++;

} /* end of getInfo */

--------------------------------------------------------------------------

4.2 Solaris下如何获知CPU速率

A: Philip Brown <phil+s3@bolthole.no-bots.com>

psrinfo -v

psrinfo | grep on-line | wc -l 简单给出CPU数目

A: scz <scz@nsfocus.com>

# /usr/platform/`uname -i`/sbin/prtdiag -v

# /usr/platform/`uname -m`/sbin/prtdiag -v

# /usr/bin/netstat -k cpu_info0

A: Tony Walton <tony.walton@uk.sun.com>

如果你装了Sun Workshop,还可以尝试fpversion命令

# /opt/SUNWspro/bin/fpversion

A SPARC-based CPU is available.

CPU's clock rate appears to be approximately 266.1 MHz.

Kernel says CPU's clock rate is 270.0 MHz.

Kernel says main memory's clock rate is 90.0 MHz.

Sun-4 floating-point controller version 0 found.

An UltraSPARC chip is available.

FPU's frequency appears to be approximately 277.1 MHz.

Use "-xtarget=ultra2i -xcache=16/32/1:256/64/1" code-generation option.

Hostid = 0x80BC3CB3.

#

4.3 如何编程获取Solaris系统当前内存大小

Q: 如何编程(或者有什么现成命令)获取Solaris系统当前内存大小?

A: Nithyanandham <m.nithyanandham@blr.spcnl.co.in>

几个现成命令

/usr/platform/`uname -m`/sbin/prtdiag -v | grep Memory

prtconf -v | grep Memory

如果装了GNU top,也可以直接用top命令看到。

D: scz <scz@nsfocus.com>

truss prtconf的输出中有如下内容

sysconfig(_CONFIG_PAGESIZE) = 8192

sysconfig(_CONFIG_PHYS_PAGES) = 16384

Memory size: 128 Megabytes

# /usr/ccs/bin/nm -nx /dev/ksyms | grep "|sysconfig$"

10626] |0x0000100ec110|0x0000000001bc|FUNC |GLOB |0 |ABS |sysconfig

# find /usr/include -type f -name "*.h" | xargs grep -l _CONFIG_PAGESIZE

/usr/include/sys/sysconfig.h

# vi -R /usr/include/sys/sysconfig.h

/*

* cmd values for _sysconfig system call.

* WARNING: This is an undocumented system call,

* therefore future compatibility can not

* guaranteed.

*/

#define _CONFIG_PAGESIZE 6 /* system page size */

#define _CONFIG_PHYS_PAGES 26 /* phys mem installed in pages */

参看sysconf(3C)手册页。

_SC_PAGESIZE

_SC_PAGE_SIZE

_SC_PHYS_PAGES

A: Casper Dik <Casper.Dik@Holland.Sun.COM>

--------------------------------------------------------------------------

/*

* Program to determine the size installed physical memory on Suns.

*

* Casper Dik.

*/

#define MEGABYTE 0x00100000

#define MAXMEM 0x7ff00000

#define THEMEM "/dev/mem"

#include <stdio.h>

#include <fcntl.h>

#include <sys/types.h>

#include <unistd.h>

int main ( int argc, char * argv[] )

{

int fd = open( THEMEM, O_RDONLY );

char c;

unsigned long pos, mapstart = 0;

int totmb = 0;

if ( fd == -1 )

{

perror( THEMEM );

exit( 1 );

}

for ( pos = 0; pos < MAXMEM; pos += MEGABYTE )

{

if (lseek( fd, pos, 0 ) == -1 )

{

perror( "lseek" );

exit( 1 );

}

if ( read( fd, &c, 1 ) == -1 )

{

int size = ( pos - mapstart ) / MEGABYTE;

if ( size != 0 )

{

printf( "found %3d MB starting at 0x%p\\n", size, ( void * )mapst

art );

totmb += size;

}

mapstart = pos + MEGABYTE; /* start of next possible mapping */

}

}

printf( "Total memory size: %d MB\\n", totmb );

exit( 0 );

}

--------------------------------------------------------------------------

由于需要读访问/dev/mem,普通用户用户无法使用该程序。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有