性能问题:Solaris和AIX下面如何编程虚拟内存的大小、单个CPU占用率?

Netguy 2003-11-20 09:29:06
Solaris 5.8和AIX 4.3下面如何获得虚拟内存的大小、单个CPU占用率?

用prtconf或者sysconf()函数可以获得物理内存的总数,用vmstat可以得到空闲虚拟内存的总数。

但是如何得到虚拟内存总数、单个CPU(或平均的)的占用率呢?谢谢
...全文
235 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
sexroute 2003-12-12
  • 打赏
  • 举报
回复
// sys_info_v1.cpp: implementation of the sys_info_v1 class.
// coded by 赵大力 12-10-2003
//////////////////////////////////////////////////////////////////////

#include "sys_info_v1.h"

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

sys_info_v1::sys_info_v1()
{

}

sys_info_v1::~sys_info_v1()
{

}
//////////////////////////////////////////////////////////////////////////
// 获得整数型系统参数
//////////////////////////////////////////////////////////////////////////
long sys_info_v1::m_i_getPara(kstat_ctl_t *kc, char *szFirstClass, char *szSecondClass, char *szThirdClass)
{
if(this->m_i_isInit!=1){
this->m_i_initKstat();
}
kstat_t *ksp;
kstat_named_t *knp;
/*查询大类*/
if (!(ksp = kstat_lookup(kc, szFirstClass, -1, szSecondClass))) {
cout<<"zdl lookup "<<szFirstClass<<"failed!"<<endl;
exit(1);
}else{

}
if (kstat_read(kc,ksp,NULL)<0) {
cout<<"zdl read "<<szFirstClass<<"failed!"<<endl;
exit(1);
}else{
}
/*查询小类*/
knp = (kstat_named_t*)kstat_data_lookup(ksp, szThirdClass);

return knp->value.i32;
}
//////////////////////////////////////////////////////////////////////////
// 获得字符串型系统参数
//////////////////////////////////////////////////////////////////////////
char * sys_info_v1::m_sz_getPara(kstat_ctl_t *kc, char *szFirstClass, char *szSecondClass, char *szThirdClass)
{
if(this->m_i_isInit!=1){
this->m_i_initKstat();
}
kstat_t *ksp;
kstat_named_t *knp;
/*查询大类*/
if (!(ksp = kstat_lookup(kc, szFirstClass, -1, szSecondClass))) {
cout<<"zdl lookup "<<szFirstClass<<"failed!"<<endl;
exit(1);
}else{

}
if (kstat_read(kc,ksp,NULL)<0) {
cout<<"zdl read "<<szFirstClass<<"failed!"<<endl;
exit(1);
}else{
}
/*查询小类*/
knp = (kstat_named_t*)kstat_data_lookup(ksp, szThirdClass);

return knp->value.c;
}
//////////////////////////////////////////////////////////////////////////
// 获得系统基本信息cpu数量、主频、类型、物理内存容量
//////////////////////////////////////////////////////////////////////////
int sys_info_v1::getBaseInfo(_sysInfo *pSysinfo)
{
//////////////////////////////////////////////////////////////////////////
//利用uname api获得系统信息
//////////////////////////////////////////////////////////////////////////
struct utsname buf;
int href=uname ( &buf);
pSysinfo->buf=buf;
//////////////////////////////////////////////////////////////////////////
//得到内存页大小
//////////////////////////////////////////////////////////////////////////
int pagesize=this->pagesize;
pSysinfo->cCpuType=this->m_sz_getPara(this->kc,"cpu_info",NULL,"cpu_type");
pSysinfo->cCpuSpeed=this->m_i_getPara(this->kc,"cpu_info",NULL,"clock_MHz");
pSysinfo->cCpuNo=this->m_i_getPara(this->kc,"unix","system_misc","ncpus");
pSysinfo->cTotalMemory=(this->m_i_getPara(this->kc,"unix","system_pages","physmem")*(pagesize)/1024/1024);
return 0;
}



int sys_info_v1::m_i_initKstat()
{
this->kc=NULL;
//////////////////////////////////////////////////////////////////////////
// 获得系统页大小
//////////////////////////////////////////////////////////////////////////
this->pagesize= sysconf(_SC_PAGESIZE);
//////////////////////////////////////////////////////////////////////////
// 初始化kstat
//////////////////////////////////////////////////////////////////////////
if (!this->kc) {
if (!(this->kc = kstat_open())) {;
cout<<"kstat_open() failed! "<<endl;
exit(1);
}
}

if (kstat_chain_update(this->kc) < 0) {
cout<<"kstat_chain_update() failed! "<<endl;
exit(1);
}
this->m_i_isInit=1;
return 0;
}
int main(){
sys_info_v1 *p=new sys_info_v1();
_sysInfo *baseInfo=new _sysInfo();
//////////////////////////////////////////////////////////////////////////
// 初始化 kstat
//////////////////////////////////////////////////////////////////////////
p->m_i_initKstat();
//////////////////////////////////////////////////////////////////////////
// 获得基本信息
//////////////////////////////////////////////////////////////////////////
p->getBaseInfo(baseInfo);
cout<<baseInfo->cCpuSpeed<<endl;
cout<<baseInfo->cCpuType<<endl;
cout<<baseInfo->cTotalMemory<<endl;
cout<<baseInfo->cCpuNo<<endl;
cout<<(&(baseInfo->buf))->machine<<endl;
cout<<(&(baseInfo->buf))->nodename<<endl;
cout<<(&(baseInfo->buf))->release<<endl;
cout<<(&(baseInfo->buf))->sysname<<endl;
cout<<(&(baseInfo->buf))->version<<endl;
//////////////////////////////////////////////////////////////////////////
//
//////////////////////////////////////////////////////////////////////////

return 0;
}
blueflame 2003-11-24
  • 打赏
  • 举报
回复
mosaic(影子),请问要让AIX有perfstat.h,需要安装哪几个安装包?谢谢!
mosaic 2003-11-24
  • 打赏
  • 举报
回复
我没装过,我用的机器上有bos.perf.libperfstat这个fileset.

7805yhb 2003-11-21
  • 打赏
  • 举报
回复
那SCO和LINUX和FreeBSD上呢?
linaxing 2003-11-21
  • 打赏
  • 举报
回复
solarisCPU的占用率:
kstat_open, kstat_chain_update, kstat_read, kstat_close
mosaic 2003-11-20
  • 打赏
  • 举报
回复
Aix上你可以参考一下perfstat_memory_total和perfstat_cpu_total两个函数的帮助。
HPUX上可以用pstat_getstatic和pstat_getdynamic两个函数
solaris上不清楚。
Netguy 2003-11-20
  • 打赏
  • 举报
回复
紧急啊,哪位达人帮帮忙!谢谢!
常见问题及处理方案 CPU使用率高的问题 通过操作系统命令top topas glance等查看top进程号,确认是系统进程还是oracle应用进程,查询当前top进程执行的操作和sql语句进行分析。 根据进程号获取正在执行的sql SELECT a.osuser, a.username,b.address,b.hash_value, b.sql_text from v$session a, v$sqltext b, v$process p where p.spid = &spid and p.addr = a.paddr and a.STATUS = 'ACTIVE' and a.sql_address =b.address order by address, piece; 数据库无法连接 数据库无法连接,一般可能是如下原因造成: (1)数据库宕了 (2)监听异常 (3)数据库挂起 (4)归档目录满 (5)数据库或应用主机的网卡出现问题不能正常工作 (6)应用主机到数据库主机的网络出现问题。 1、数据库宕了 立即启动数据库。 Startup 2、监听异常 此时一般体现为: 监听进程占用CPU资源大;d 监听日志异常。 此时,立即重启监听,监听重启一般能在1分钟之内完成。 Lsnrctl restart 3、数据库挂起 立即重启数据库。 Startup 4、归档目录满 (1)在没有部署OGG数据同步的情况下,立即清理归档日志文件。 (2)如果部署了OGG数据同步,查看OGG正在读取的归档日志文件,立即 清理OGG不再需要的日志文件。 5、数据库或应用主机的网卡出现问题不能正常工作。 立即联系主机工程师处理。 6、应用主机到数据库主机的网络出现问题。 立即联系网络维护人员查看。 CRS/GI无法启动 对于10g及11gR1版本的CRS问题 1、进入/tmp目录下,看是否产生了crsctl.xxxxx文件 如果有的话,看文件内容,一般会提示OCR无法访问,或者心跳IP无法 正常绑定等信息。 2、如果/tmp目录下没有crsctl.xxxxx文件 此时查看ocssd.log文件,看是否能从中得到有价值的信息。 可能的问题:网络心跳不通。 3、/tmp目录无crsctl.xxxxx且日志中没有报错信息,只有停CRS时的日志信 息。 此时可能是RAC两个节点对并发裸设备的访问有问题,此时考虑: (1)停掉两个节点的CRS。 (2)两个节点先同时去激活并发VG,然后再激活VG。 (3)重新启动CRS。 对于11gR2的GI问题 分析$GRID_HOME/log/nodename目录下的日志文件,看是否能从中找出无法启动的原因。 常见问题: 1、心跳IP不同。 2、ASM实例无法启动。 对CRS的故障诊断和分析,参加本文档中RAC部分的MOS文档. 数据库响应慢 应急处理步骤: (1)找到占用CPU资源大的sql或者模块,然后停掉此应用模块。 (2)如果属于由于种种原因引起的数据库hang住情况,立即重启数据 库,此时重启需要约15分钟时间。 重要说明: 如果重启数据库的话,会有如下负面影响: (1)要kill掉所有连接到数据库中的会话,所有会话都会回滚。 (2)立即重启的话,不能获取并保留分析数据库挂起原因的信息,在后续分析问题时,没有足够信息用于分析问题产生的根本原因。 一般正常重启的话,都需要手动获取用于分析数据库重启原因的信息,以便编写分析报告,但是在最长情况下,获取日志信息可能就要40分钟时间。此时一般做systemstate dump,且如果是rac情况的话,需要2个节点都做,且需要做2次或以上。 常规处理步骤,分如下几种情况处理: (1)所有业务模块都慢。 (2)部分业务模块慢。 (3)数据库hang住。 所有业务模块都慢 此时首先查看系统资源,看是否属于CPU资源使用率100%的问题,如果是,参考本章“CPU使用率高的问题”解决办法。如果系统资源正常,那很可能是数据库hang住了,此时参考数据库Hang部分。 部分业务模块慢 分析运行慢的模块的sql语句: (1)看是否是新上的sql。 (2)看执行计划是否高效。 (3)优化运行慢的模块的sql语句。 数据库hang住 应急处理方式:重启数据库。 常规处理方式: (1)分析alert日志,看是否能从alert日志中,可以很快找到引起问题的原 因。 (2)做3级别的hanganalyze,先做一次,然后隔一分钟以后再做一次。 并分析hanganalyze 生成的trace文件,看是否可以找到引起数据库hang 住的会话的信息。 (3)做systemstate dump 此时生成systemstate dump的时间会比较长,尤其是在会话数量较多的情 况下。且生成dump文件的大小较大,在G级别以上。在生成一次以 后,过一分钟再收集一次,另外如果是RAC,那么两个节点都需要收 集。 对hang做dump请参考“对数据库HANG做DUMP一章”。 数据误删除 此问题,没有应急办法,只能按如下步骤处理: 1、对于10g及以上版本,看是否可以通过闪回进行恢复。 2、查看测试环境数据库,看其中是否有需要的数据。 3、使用备份进行恢复,此方法一般花费时间较长。 快速shutdown数据库 1. 停止监听 2. 做一个检查点操作 SQL> alter system checkpoint; 3. 杀掉所有LOCAL=NO的操作系统进程 AIX、HP-UX、Linux、Solaris: $ ps -ef|grep $ORACLE_SID| grep LOCAL=NO | grep -v grep |awk '{print $2}'|xargs -i kill -9 {} Windows: SQL> select 'orakill ' || (select value from v$parameter where name = 'instance_name') || ' ' ||p.spid from v$process p, v$bgprocess bp where p.ADDR = bp.PADDR(+) and bp.PADDR is null and p.SPID is not null; 在命令行执行: C:\> orakill db1 7642 C:\> orakill db1 7644 4. 停止数据库 SQL> shutdown immediate 清理分布式事务 -- 9i需要设置_sum_debug_mode SQL> alter session set "_smu_debug_mode" = 4; alter session set nls_date_format='YYYY-MM-DD HH24:MI:SS'; column local_trna_id format a20 column global_tran_id format a25 SELECT LOCAL_TRAN_ID, GLOBAL_TRAN_ID, FAIL_TIME,STATE, MIXED FROM DBA_2PC_PENDING; LOCAL_TRAN_ID GLOBAL_TRAN_ID FAIL_TIME STATE MIX -------------- ------------------------- -------------------- ---------------- --- 12.29.103137 TAXIS.9572b613.12.29.103137 30-aug-2011 10:09:11 collecting no SQL> commit force '12.29.103137'; Commit complete. SQL> EXECUTE DBMS_TRANSACTION.PURGE_LOST_DB_ENTRY('12.29.103137'); PL/SQL procedure successfully completed. SQL> commit; -- 清理每个分布式事务都需要commit; 数据泵 1. 相关参数 PARALLEL参数考虑 可以设置成物理CPU(不是逻辑CPU)数的两倍数目,然后调整 对于Data Pump Export,PARALLEL参数必须要小于等于dump files数 对于Data Pump Import,PARALLEL不要比dump文件数大很多,可以大一些。这个参数也指定了导入时创建索引的并行度。 PARALLEL只允许在企业版使用。 nohup expdp system/manager schemas=kdjm DIRECTORY=DUMP_FILES PARALLEL=3 dumpfile=expCASES_%U.dmp logfile=nnsiexp2008_12_28.log & 通配符 %U,它指示文件将按需要创建,格式将为expCASES_nn.dmp,其中nn 从 01 开始,然后按需要向上增加 相关监控 -- 监控长事务 set linesize 120 column opname heading 'Operation' format a25 column target heading 'Target' format a15 column pct heading 'Percent' format 999 column es heading 'Elapsed|Seconds' format 999999 column tr heading 'Time|Remaining|Seconds' format 99999 column program format a30 column machine format a16 select L.sid ssid, substr(opname,1,25) opname, target, trunc((sofar/totalwork)*100) pct, to_char(60*sofar*8192/(24*60*(last_update_time-start_time))/1024/1024/60, '9999.0') Rate, round(elapsed_seconds/60, 2) es, round(time_remaining/60, 2) tr, program, machine from v$session_longops L, v$session s where time_remaining > 0 and l.sid = s.sid order by start_time; 坏块恢复 在遇到坏块的时,一般应按以下的流程来处理: 1 如果坏块的对象是索引,重建索引 2 使用备份来进行恢复 3 使用10231事件,或者DBMS_REPAIR.SKIP_CORRUPT_BLOCKS过程,让oracle跳过坏块,然后用exp导出表和使用CREATE TABLE AS创建新表。 4 尝试使用SQL脚本将完好的数据复制到一个新表中,或者用EXP配合QUERY参数导出完好的数据。 5 手工修改坏块。 有两种情况是不能使用事件10231和DBMS_REPAIR.SKIP_CORRUPT_BLOCKS来跳过坏块的: 1 硬件问题造成OS层不能读取数据。 2 表中的非数据块,或者说是元数据块。比如段头,Extent Map块。这种坏块是不能跳过的。 3 在表中存在有其他异常的块,从单个块来看都没有损坏,checksum值也是正确的,但是有的块在段内却是有问题的。比

23,124

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧