前言 在求佛保佑服务器不宕机、杀程序员祭天的环境下,程序员每天可谓是战战兢兢,接到电话和短信都吓得瑟瑟发抖,为了我们的安全,及时发现服务器运行问题已不仅仅是运维的问题了。今天总结一下常见的服务器监控指标,希望各位开发人员都搞一个脚本运行着以保障自己的生命安全。 获取服务器信息 多台机器同时需要监控时,每台机器都需要运行一个监控程序,我们首先要获取服务器的信息以分辨机器,发生问题时,也可以评估问题的严重性。 获取IP 获取内网IP: 通过ifconfig命令获取全部的网络信息,并排除掉本地host和ipv6信息。 sbinifconfiggrepinetgrepv127。0。0。1grepvinet6awk{print2}trdaddr: 注意这里要使用ifconfig的绝对路径,因为如果监控脚本运行在crontab的话,执行时是不会带有环境信息的。 获取外网IP: 外网的IP我们可以通过请求别的网站来回显,有一些网站提供此服务,如http:ipecho。netplain或者我自己懒得搭建的网站:http:alwayscoding。net。 命令如下curlhttp:alwayscoding。net 获取系统信息 获取系统信息建议使用lsbreleasea方法: lsbreleasea LSBVersion::base4。0amd64:base4。0noarch:core4。0amd64:core4。0noarch DistributorID:CentOS Deion:CentOSrelease6。5(Final) Release:6。5 Codename:Final 信息比较丰富,可以截取字符串中需要的部分; CPU CPU负载是我们要监控的首要指标,我们常说的系统负载指的就是它,它是指一段时间内CPU处理进程数占CPU能处理最大进程数的比例,即一个CPU的最大负载是1。0,这种情况CPU正好能将所有进程执行完,超出这个限制,系统会进入overload超载状态,就会有进程需要等待其他进程执行结束。我们一般认为CPU负载在0。6以下是健康状态。 在终端上查看系统负载通常使用top命令,但它是交互型的,且数据较多较杂,不利于写监控脚本,我们一般使用uptime通过其averageload字段获取最近1分钟、5分钟、15分钟的平均负载。 uptime 16:03:30up130days,23:33,1user,loadaverage:4。62,4。97,5。08 此时系统平均负载约为5,不是系统已经超载,也没有显示错误,这是因为在考虑负载时还要考虑CPU的核心数,多核CPU同时能处理的进程数与其核数成正比,其最大负载不是1,而是其CPU核心数N。 我们使用nproc可以查看系统CPU核心数,我正在使用的这台机器核心数是16,所以其最大负载是16,平均负载是5160。32,CPU处于健康状态。 内存 内存是我们要监控的另外一项核心指标,内存占用率太高,无疑会导致进程无法正常分配内存执行。 我们也可以通过top命令查看内存占用,但监控中更常用free命令: freem totalusedfreesharedbufferscached Mem:321081826213846048711544 bufferscache:623025878 Swap:000 我们首先来看Mem这一行,共32108M内存,已使用18262M,剩余13846,那么内存的使用率就是182623210810056。88。那么,后面的shared、buffers、cached又是什么意思呢? 其实在linux中,内存的分配也是懒惰原则,在内存分配给一个进程,进程执行完毕后linux是不会立即清理内存的,而是把这一部分内存当作缓存存储起来,如果此进程再启动就不必再重新加载了;如果可用内存使用完了,则将这一部分缓存清空,重新利用。这样来看used里的buffers和cached部分是随时可被重用的,不能算作被占用。而shared是进程共享内存部分,会作为被占用部分,但一般较少使用,与此相关的内容,可以看文末的参考文章。 真实数据是第三行的去除buffers和cache的部分,即真正的内存使用率是6230(623025878)10019。4。 而第四行的swap是用来临时存储内存buffers和cache的,正常情况虽然能加快进程的重启,但物理内存较少的情况下,会引起swap的频繁读写,增加服务器的IO压力,用与不用视情况而定。 网络 网络在linux作为web服务器时也是一项很重要的指标,相关命令有很多,但各有所长,我们一般监控以下状态: 使用netstat查看监听端口。 netstatangrepLISTENgreptcpgrep80查看是否有进程正在监控80端口。 使用ping监控网络连接 使用ping命令可以查看网络是否连接,使用c选项来控制请求次数,使用w选项来控制超时时间(单位:毫秒),最后利用符号的短路特性来控制结果输出: pingw100c1http:weibo。comdevnullechoconnected 硬盘 硬盘不是特别重要的监控指标,但在硬盘满的时候写文件失败也会影响进程的正常执行。 我们使用df命令来查看磁盘的使用状态,h会以易读格式输出: dfh FilesystemSizeUsedAvailUseMountedon devvda140G6。0G32G16 tmpfs16G016G0devshm devvdb1296G16G265G6data0 我们可以使用grep命令找到想要查询的挂载节点,再使用awk命令获取结果字段。 另外使用du〔h〕pathtodir〔maxdepthn〕可以查看某目录的大小,注意使用maxdepthn控制遍历深度。 运行其他 其他的监控状态主要包括进程错误日志监控,请求数监控,进程存在状态监控等,这些可以用到一些基本命令了,如ps等。 更详细的信息就需要使用进程日志了,使用grep、awk等命令来分析日志来获取更详细的信息。 总结 最后是监控结果的统计了,可以使用一般的推和拉方式,建议各机器把结果推到一台机器上进行统计和报警。也可以使用rsync方式从各服务器拉取,报警方式像企业微信、短信、邮件等就按要需配置了。 最后,系统监控是个重要且需要持续关注的事情,祝大家的服务器永不宕机