别总以为自己很烂

我想写个Unix通用的监控,

Linux上有proc很方便,但BSD上Solaris上没这玩意,
想得到CPU啊Load啊IO等,必须调用Kernel中的相关函数.
更重要的是,
如果从Linux的proc里面把相关数据读出来,
感觉很不体面,不够有技术含量:P

但用了哪些函数呢?
我下载了rstatd和top的源码看看,
看看他们怎么监控的,
不看不知道,以为他们会很技术很NB的调用kernel中的东西呢,结果还是访问proc里面的文件.....

其实自己想到的东西未必有多差,这么流行的东西实现的方式不也很土么.

顺便写下:

top在不同的平台使用了不同的方法得到系统负载,

在linux下面就用了我以为很土其实还不错的proc来得到,代码如下:
/* get load averages */
{
fd = open("loadavg", O_RDONLY);
len = read(fd, buffer, sizeof(buffer)-1);
close(fd);
buffer[len] = '\0';

info->load_avg[0] = strtod(buffer, &p);
info->load_avg[1] = strtod(p, &p);
info->load_avg[2] = strtod(p, &p);
p = skip_token(p); /* skip running/tasks */
p = skip_ws(p);
if (*p)
info->last_pid = atoi(p);
else
info->last_pid = -1;
}


在macos上用sysctl函数得到,代码如下:

    /* get load averages */
{
size_t size = sizeof(load);
static int mib[] = { CTL_VM, VM_LOADAVG };

if (sysctl(mib, 2, &load, &size, NULL, 0) < 0) {
(void) fprintf(stderr, "top: sysctl failed: %s\n", strerror(errno))
;
bzero(&load, sizeof(load));
}
}


再看一下Rstatd监控的实现,以获得load为例:

static void	get_load(struct statsusers *stats) {
FILE *fp;
double avrun[3];
if (NULL == (fp = fopen("/proc/loadavg", "r"))) {
return;
}
if (!fscanf(fp , "%lf %lf %lf", &avrun[0], &avrun[1], &avrun[2])) {
syslog(LOG_CRIT, "unexpected data format in /proc/loadavg");
exit(EXIT_FAILURE);
}
stats->avenrun[0] = avrun[0] * FSCALE;
stats->avenrun[1] = avrun[1] * FSCALE;
stats->avenrun[2] = avrun[2] * FSCALE;
fclose(fp);
}


方法也是土办法.

我就纳闷,频繁的打开文件读取其中的内容本来就是件体力活,
如果被监控的应用的性能本来很高,不耗费什么系统资源,
结果监控出来的数据几乎都是这些监控软件搞出来的,多不严谨啊.

估计大家都认为没必要这么计较吧.

看来,写个通用的监控不容易啊,除非我去扣top的输出,但这更土!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值