通过程序采集服务器性能指标,并以此数据为基础构建监控系统,是运维的普遍需求。本文介绍了各种关键绩效指标的具体采集方法和技术。原文:系统性能指标采集方法(Linux篇)CPUCPU抽样指标分为整体指标和单核(core)指标。通过读取/proc/stat文件,可以得到整体数据和各个核心的数据。usernicesysidlewaitirqsoft_irqstealcpu26308002121043184712500cpu01170436106054811371700cpu114603641060494710170cpu占用时间片在这里在上图中。在具体计算利用率的时候,我们可以将前后两个值相减,再除以前后两个总tick的差值,来计算cpu在不同方面的利用率。CPU相对于loadavg还有一个指标,可以通过/proc/loadavg文件得到:0.000.010.051/1052126这表示CPU一般1分钟、5分钟有任务队列中的任务数,平均15分钟。在单核CPU的情况下,如果这个数超过1,说明CPU有等待任务,CPU资源不足。如果你使用的是多核CPU,需要将这些数字除以核心数,然后与1比较。整体内存使用信息可以通过/proc/meminfo获取:MemTotal:1922052kBMemFree:1679456kBBuffers:67560kBCached:61752kBlinux在内存管理方面有一些特殊的功能。在读写文件时,内核会使用一些内存,将文件缓存在这部分内存中,以便下次更快的IO。当系统内存不足时,内核会释放这部分内存。IO缓冲和其他缓冲共同构成了上面的Buffers和Cached。也就是说,我们在计算系统实际剩余的物理内存时,应该加上Buffers和Cached。否则,随着系统的运行,可用内存可能总是很低,但这并不意味着系统内存不足。Swapswap分区是一个特殊的分区。Unix系统用于在物理内存告急时将内存数据调出,从而腾出更多的物理内存。系统支持一个或多个交换分区。可以通过mkswap将分区设置为交换分区。在fstab中,可以这样挂载swap分区:/dev/mapper/VolGroup-lv_swapswapswapdefaults00一般来说,我们比较关心的是每个swap分区的使用率和整体swap的使用率(整体使用率为实际上是单个Sum)。整体使用率可以通过以下方法获取:cat/proc/meminfo|grepSwap一个swap实例的使用率,可以通过/proc/swaps文件获取有时候,我们还需要知道总共有多少页被换入换出,可以通过cat/proc获取/vmstat|greppswp文件系统运维一般关心文件系统的使用情况。在linux下,有两种主要的方法来获取文件系统列表。一种是读取/etc/mtab,但是这个文件的内容可能太多了,通常我们可以过滤掉总大小为0的文件系统。另外,有时候,可能会出现重复的挂起条目,例如:rootfs/rootfsrw00/dev/mapper/centos-root/ext4rw,seclabel,relatime,data=ordered00以上两项都指向/mount。其实df的结果只是/dev/mapper/centos-root。过滤规则为设备所在目录优先级为/。所以/dev/mapper/centos-root的优先级高于rootfs。获取文件系统的另一种方法是调用setmntent(MOUNTED,"r")、getmntent_r和endmntent函数。获取文件系统列表后,还需要获取目录的使用率。可以直接stat这个目录,或者调用statvfs。磁盘IO磁盘IO统计信息一般是通过iostat工具来观察的。但是作为收集器,需要从几个文件系统中获取:对于kernel>2.6,可以读取/proc/diskstats;对于>2.4的内核,您可以阅读/proc/partitions。文件中每个字段的含义都有详细说明。请参阅I/O统计字段。由于里面的数据是累加值,所以需要对连续的两个采样值进行一些计算,得到相应的指标,就像CPU一样。这块的计算方法主要参考了iostat的源码,也可以参考命令章节Linux内核源码-iostat的详解。本文使用iostat了解Linux硬盘IO性能,并对计算出的指标进行实际解释。每个IO都可能被读取或写入(每秒多少IOr/sw/s)。IO请求会消耗时间,这个时间(总等待时间await)分为在队列中的等待时间和IO本身的消耗时间(服务时间svctm)。服务时间的长短取决于IO请求本身需要读取的数据大小(每个IOavgrq-sz的数据大小)。如果当前IO不能立即处理,则进行排队(单位时间内IO队列的平均长度avgqu-sz)。为了优化IO,driver可能会将多个IO合并为一个,这样可以减少实际的IO数量,提高效率(combinedreadsandwritespersecondrrqm/swrqm/s)。IO操作本身会占用CPU,IO操作占用CPU时间片的比例(IObusybusy)决定了IO是否繁忙。对于网络流量,读取网口的状态是比较简单的。你只需要定期读取/proc/net/dev文件,里面包含了各个网卡的数据:Inter-|接收|传输面|字节数据包错误丢弃fifo帧压缩多播|字节数据包错误丢弃fifocolls载波压缩lo:67270000006727000000eth0:1502502810645900000067776375806420000000000000000000
