多Unix客户端CPU/内存占用监控适配方案咨询
适配多Unix系统的CPU/内存监控命令及实现方案
针对你开发跨Unix客户端监控程序时遇到的命令适配问题,我整理了各系统原生的替代命令,以及更可靠的C语言API实现方案,帮你解决Solaris 9/10、HP-UX、AIX的兼容性问题:
Solaris 9/10(无top命令)
Solaris自带的mpstat、prstat、vmstat都是原生可用的工具,无需额外安装:
CPU使用率获取
使用mpstat采样一次CPU状态,计算非空闲占比:
# 输出CPU使用率(100减去空闲率) mpstat 1 1 | awk 'NR==3 {print 100-$12}'
说明:
mpstat第3行是采样数据,第12列idle为CPU空闲百分比,100减去该值即为使用率。
内存使用率获取
用prstat快速获取系统级内存数据:
# 输出内存使用率(已用内存/总内存*100) prstat -n 1 1 1 | awk 'NR==4 {print $4/$3*100}'
或者用vmstat计算:
vmstat 1 1 | awk 'NR==3 {used=$3+$4+$5; total=used+$6; print used/total*100}'
HP-UX(避免依赖grep,单次执行命令)
HP-UX原生的sar、vmstat可以替代top,且无需依赖grep,直接用awk处理输出:
CPU使用率获取
# 单次采样CPU状态,计算使用率 sar -u 1 1 | awk 'NR==3 {print 100-$5}'
说明:
sar -u输出的第3行是采样数据,第5列%idle为空闲占比。
内存使用率获取
# 通过vmstat计算已用内存占比 vmstat 1 1 | awk 'NR==3 {used=$3+$4; total=used+$5; print used/total*100}'
AIX(topas适配问题)
AIX推荐用sar、vmstat或svmon(原生自带)来获取监控数据:
CPU使用率获取
用sar采样:
sar -u 1 1 | awk 'NR==3 {print 100-$4}'
或者vmstat:
vmstat 1 1 | awk 'NR==3 {print 100-$15}'
内存使用率获取
用svmon直接获取系统内存统计:
svmon -G | awk 'NR==2 {print $3/$2*100}'
或者vmstat计算:
vmstat 1 1 | awk 'NR==3 {used=$4+$5+$6; total=used+$7; print used/total*100}'
更可靠的C语言实现方案(避免依赖外部命令)
如果想彻底摆脱系统命令的兼容性问题,推荐直接调用各Unix系统的原生API读取数据,效率更高且更稳定:
- Solaris:使用
kstatAPI(头文件<kstat.h>),可以获取CPU、内存等系统资源的详细统计;也可以读取/proc文件系统下的/proc/stat、/proc/meminfo(部分版本支持)。 - HP-UX:调用
sysmp()系统调用获取内存信息,getloadavg()获取负载,或使用perfmon相关API;也可以读取/dev/kmem(需要root权限)。 - AIX:使用
perfstatAPI(头文件<perfstat.h>),通过perfstat_cpu_total()获取CPU使用率,perfstat_memory_total()获取内存统计。
在C代码中可以通过条件编译适配不同系统:
#ifdef __sun__ // Solaris kstat 实现逻辑 #elif defined(__hpux) // HP-UX sysmp 实现逻辑 #elif defined(_AIX) // AIX perfstat 实现逻辑 #endif
这种方式不需要调用popen()执行外部命令,避免了命令注入风险,也不会因为系统命令版本差异导致输出解析失败。
内容的提问来源于stack exchange,提问作者김진영
相关产品推荐
相关产品推荐

