别总以为自己很烂
我想写个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 = '\0';info->load_avg = strtod(buffer, &p);info->load_avg = strtod(p, &p);info->load_avg = 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 voidget_load(struct statsusers *stats) {FILE*fp;doubleavrun;if (NULL == (fp = fopen("/proc/loadavg", "r"))) {return;}if (!fscanf(fp , "%lf %lf %lf", &avrun, &avrun, &avrun)) {syslog(LOG_CRIT, "unexpected data format in /proc/loadavg");exit(EXIT_FAILURE);}stats->avenrun = avrun * FSCALE;stats->avenrun = avrun * FSCALE;stats->avenrun = avrun * FSCALE;fclose(fp);}
方法也是土办法.
我就纳闷,频繁的打开文件读取其中的内容本来就是件体力活,
如果被监控的应用的性能本来很高,不耗费什么系统资源,
结果监控出来的数据几乎都是这些监控软件搞出来的,多不严谨啊.
估计大家都认为没必要这么计较吧.
看来,写个通用的监控不容易啊,除非我去扣top的输出,但这更土!
页:
[1]