code[class*="language-"],
pre[class*="language-"] {
background-color: #fdfdfd;
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
margin-bottom: 1em;
}

:not(pre) > code[class*="language-"] {
position: relative;
padding: .2em;
-webkit-border-radius: 0.3em;
-moz-border-radius: 0.3em;
-ms-border-radius: 0.3em;
-o-border-radius: 0.3em;
border-radius: 0.3em;
color: #c92c2c;
border: 1px solid rgba(0, 0, 0, 0.1);
display: inline;
white-space: normal;
}

pre[class*="language-"]:before,
pre[class*="language-"]:after {
content: '';
z-index: -2;
display: block;
position: absolute;
bottom: 0.75em;
left: 0.18em;
width: 40%;
height: 20%;
max-height: 13em;
-webkit-box-shadow: 0px 13px 8px #979797;
-moz-box-shadow: 0px 13px 8px #979797;
box-shadow: 0px 13px 8px #979797;
-webkit-transform: rotate(-2deg);
-moz-transform: rotate(-2deg);
-ms-transform: rotate(-2deg);
-o-transform: rotate(-2deg);
transform: rotate(-2deg);
}

:not(pre) > code[class*="language-"]:after,
pre[class*="language-"]:after {
right: 0.75em;
left: auto;
-webkit-transform: rotate(2deg);
-moz-transform: rotate(2deg);
-ms-transform: rotate(2deg);
-o-transform: rotate(2deg);
transform: rotate(2deg);
}

.token.comment,
.token.block-comment,
.token.prolog,
.token.doctype,
.token.cdata {
color: #7D8B99;
}

.token.punctuation {
color: #5F6364;
}

.token.property,
.token.tag,
.token.boolean,
.token.number,
.token.function-name,
.token.constant,
.token.symbol,
.token.deleted {
color: #c92c2c;
}

.token.selector,
.token.attr-name,
.token.string,
.token.char,
.token.function,
.token.builtin,
.token.inserted {
color: #2f9c0a;
}

.token.operator,
.token.entity,
.token.url,
.token.variable {
color: #a67f59;
background: rgba(255, 255, 255, 0.5);
}

.token.atrule,
.token.attr-value,
.token.keyword,
.token.class-name {
color: #1990b8;
}

.token.regex,
.token.important {
color: #e90;
}

.language-css .token.string,
.style .token.string {
color: #a67f59;
background: rgba(255, 255, 255, 0.5);
}

.token.important {
font-weight: normal;
}

.token.bold {
font-weight: bold;
}
.token.italic {
font-style: italic;
}

.token.entity {
cursor: help;
}

.namespace {
opacity: .7;
}

@media screen and (max-width: 767px) {
pre[class*="language-"]:before,
pre[class*="language-"]:after {
bottom: 14px;
-webkit-box-shadow: none;
-moz-box-shadow: none;
box-shadow: none;
}

}

.token.tab:not(:empty):before,
.token.cr:before,
.token.lf:before {
color: #e0d7d1;
}

pre[class*="language-"].line-numbers {
padding-left: 0;
}

pre[class*="language-"].line-numbers code {
padding-left: 3.8em;
}

pre[class*="language-"].line-numbers .line-numbers-rows {
left: 0;
}

pre[class*="language-"][data-line] {
padding-top: 0;
padding-bottom: 0;
padding-left: 0;
}
pre[data-line] code {
position: relative;
padding-left: 4em;
}
pre .line-highlight {
margin-top: 0;
}

pre.line-numbers {
position: relative;
padding-left: 3.8em;
counter-reset: linenumber;
}

pre.line-numbers > code {
position: relative;
}

.line-numbers .line-numbers-rows {
position: absolute;
pointer-events: none;
top: 0;
font-size: 100%;
left: -3.8em;
width: 3em; /* works for line-numbers below 1000 lines */
letter-spacing: -1px;
border-right: 1px solid #999;

-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}

.line-numbers-rows > span {
pointer-events: none;
display: block;
counter-increment: linenumber;
}

.line-numbers-rows > span:before {
content: counter(linenumber);
color: #999;
display: block;
padding-right: 0.8em;
text-align: right;
}
-->

前言

在“求佛保佑服务器不宕机”、“杀程序员祭天”的环境下,程序员每天可谓是战战兢兢,接到电话和短信都吓得瑟瑟发抖,为了我们的安全,及时发现服务器运行问题已不仅仅是运维的问题了。今天总结一下常见的服务器监控指标,希望各位开发人员都搞一个脚本运行着以保障自己的生命安全。

文章经常被人爬,而且还不注明原地址,我在这里的更新和纠错没法同步,这里注明一下原文地址:http://www.cnblogs.com/zhenbianshu/p/7683496.html


获取服务器信息

多台机器同时需要监控时,每台机器都需要运行一个监控程序,我们首先要获取服务器的信息以分辨机器,发生问题时,也可以评估问题的严重性。

获取IP

获取内网IP:

通过ifconfig命令获取全部的网络信息,并排除掉本地host和ipv6信息。

/sbin/ifconfig | grep inet | grep -v '127.0.0.1' | grep -v inet6 | awk '{print $2}' | tr -d "addr:"

注意这里要使用ifconfig的绝对路径,因为如果监控脚本运行在 crontab 的话,执行时是不会带有环境信息的。

获取外网IP:

外网的IP我们可以通过请求别的网站来回显,有一些网站提供此服务,如 ipecho.net/plain 或者我自己懒得搭建的网站:alwayscoding.net

命令如下 curl alwayscoding.net

获取系统信息

获取系统信息建议使用 lsb_release -a 方法:

lsb_release -a
LSB Version: :base-4.0-amd64:base-4.0-noarch:core-4.0-amd64:core-4.0-noarch
Distributor ID: CentOS
Description: CentOS release 6.5 (Final)
Release: 6.5
Codename: Final

信息比较丰富,可以截取字符串中需要的部分;


CPU

CPU 负载是我们要监控的首要指标,我们常说的系统负载指的就是它,它是指一段时间内CPU处理进程数占 CPU 能处理最大进程数的比例,即一个 CPU 的最大负载是 1.0,这种情况 CPU 正好能将所有进程执行完,超出这个限制,系统会进入 over load 超载状态,就会有进程需要等待其他进程执行结束。我们一般认为CPU负载在 0.6以下是健康状态。

在终端上查看系统负载通常使用 top 命令,但它是交互型的,且数据较多较杂,不利于写监控脚本,我们一般使用 uptime 通过其 average load 字段获取最近 1分钟、5分钟、15分钟的平均负载。

uptime
16:03:30 up 130 days, 23:33, 1 user, load average: 4.62, 4.97, 5.08

此时系统平均负载约为 5,不是系统已经超载,也没有显示错误,这是因为在考虑负载时还要考虑 CPU 的核心数,多核 CPU 同时能处理的进程数与其核数成正比,其最大负载不是 1,而是其 CPU 核心数 N。

我们使用 nproc 可以查看系统 CPU 核心数,我正在使用的这台机器核心数是 16,所以其最大负载是16,平均负载是 5/16 = 0.32 , CPU 处于健康状态。


内存

内存是我们要监控的另外一项核心指标,内存占用率太高,无疑会导致进程无法正常分配内存执行。

我们也可以通过 top 命令查看内存占用,但监控中更常用 free 命令:

free -m
total used free shared buffers cached
Mem: 32108 18262 13846 0 487 11544
-/+ buffers/cache: 6230 25878
Swap: 0 0 0

我们首先来看 Mem 这一行,共 32108M 内存,已使用 18262M,剩余 13846,那么内存的使用率就是 18262/32108*100% = 56.88%。那么,后面的shared、buffers、cached 又是什么意思呢?

其实在 linux 中,内存的分配也是懒惰原则,在内存分配给一个进程,进程执行完毕后 linux 是不会立即清理内存的,而是把这一部分内存当作缓存存储起来,如果此进程再启动就不必再重新加载了;如果可用内存使用完了,则将这一部分缓存清空,重新利用。这样来看 used 里的 buffers 和 cached 部分是随时可被重用的,不能算作被占用。而 shared 是进程共享内存部分,会作为被占用部分,但一般较少使用,与此相关的内容,可以看文末的参考文章。

真实数据是第三行的去除 buffers 和 cache 的部分,即真正的内存使用率是 6230/(6230+25878)*100% = 19.4%

而第四行的 swap 是用来临时存储内存 buffers 和 cache 的,正常情况虽然能加快进程的重启,但物理内存较少的情况下,会引起 swap 的频繁读写,增加服务器的 IO 压力,用与不用视情况而定。


网络

网络在 linux 作为 web 服务器时也是一项很重要的指标,相关命令有很多,但各有所长,我们一般监控以下状态:

使用netstat查看监听端口。

netstat -an | grep LISTEN | grep tcp | grep 80 查看是否有进程正在监控80端口。

使用ping监控网络连接

使用 ping 命令可以查看网络是否连接,使用 -c 选项来控制请求次数,使用 -w 选项来控制超时时间(单位:毫秒),最后利用 && 符号的 短路 特性来控制结果输出:

ping -w 100 -c 1 weibo.com &>/dev/null && echo "connected"


硬盘

硬盘不是特别重要的监控指标,但在硬盘满的时候写文件失败也会影响进程的正常执行。

我们使用 df 命令来查看磁盘的使用状态,-h 会以易读格式输出:

df -h
Filesystem Size Used Avail Use% Mounted on
/dev/vda1 40G 6.0G 32G 16% /
tmpfs 16G 0 16G 0% /dev/shm
/dev/vdb1 296G 16G 265G 6% /data0

我们可以使用 grep 命令找到想要查询的挂载节点,再使用 awk 命令获取结果字段。

另外使用 du [-h] /path/to/dir [--max-depth=n] 可以查看某目录的大小,注意使用 --max-depth=n控制遍历深度。


运行/其他

其他的监控状态主要包括进程错误日志监控,请求数监控,进程存在状态监控等,这些可以用到一些基本命令了,如 ps等。

更详细的信息就需要使用进程日志了,使用 grep 、awk 等命令来分析日志来获取更详细的信息。


总结

最后是监控结果的统计了,可以使用一般的“推”和“拉”方式,建议各机器把结果推到一台机器上进行统计和报警。也可以使用 rsync 方式从各服务器拉取,报警方式像企业微信、短信、邮件等就按要需配置了。

最后,系统监控是个重要且需要持续关注的事情,祝大家的服务器永不宕机。

关于本文有什么问题可以在下面留言交流,如果您觉得本文对您有帮助,可以点击下面的 推荐 支持一下我,博客一直在更新,欢迎 关注

参考:

理解Linux系统负荷-阮一峰

linux内存中的cache真的能被回收么?

Linux“体检”指标的更多相关文章

  1. Linux 驱动开发

    linux驱动开发总结(一) 基础性总结 1, linux驱动一般分为3大类: * 字符设备 * 块设备 * 网络设备 2, 开发环境构建: * 交叉工具链构建 * NFS和tftp服务器安装 3, ...

  2. linux分区详解

    点评:如果你想了解linux分区,请务必认真阅读本文.对于初学者来说,linux分区不像windows下那么一目了解.    Linux 分区的规定      1. 设备管理 在 Linux 中,每一 ...

  3. 明风:分布式图计算的平台Spark GraphX 在淘宝的实践

    快刀初试:Spark GraphX在淘宝的实践 作者:明风 (本文由团队中梧苇和我一起撰写,并由团队中的林岳,岩岫,世仪等多人Review,发表于程序员的8月刊,由于篇幅原因,略作删减,本文为完整版) ...

  4. 【机器学习PAI实践一】搭建心脏病预测案例

    一.背景 心脏病是人类健康的头号杀手.全世界1/3的人口死亡是因心脏病引起的,而我国,每年有几十万人死于心脏病. 所以,如果可以通过提取人体相关的体侧指标,通过数据挖掘的方式来分析不同特征对于心脏病的 ...

  5. java常用问题排查工具

    一:jstack找到最耗cpu的线程并定位代码 1.ps -ef|grep java 或者 jps -l 得到进程pid 2.找到该进程内最耗cpu的线程,我一般使用: top -Hp pid 3.c ...

  6. 性能测试day04_性能监控

    好了,今天接着来学习性能,在今天开始前,我今天在网上又看到了理发师经典模型,这里稍微提一下,详情可以百度哈,下面这张图是网上找到的经典场景性能相关的图,大致说明下: 这张图中展示的是1个标准的软件性能 ...

  7. oracle数据库应用性能优化经验(培训讲义)

    这是我给公司同事做的内部培训ppt的讲义,给大家分享一下.这是培训大纲,ppt在找地方上传,等找到了会把链接发在这里 . 暂时放在csdn上,赚点下载积分:https://download.csdn. ...

  8. 用sysbench压测MySQL,通过orzdba监控MySQL

    1.1 安装sysbench wget https://codeload.github.com/akopytov/sysbench/zip/0.5 unzip 0.5 cd sysbench-0.5/ ...

  9. Prometheus普罗米修斯快速入门

    欢迎来到普罗米修斯! Prometheus是一个监控平台,通过从监控目标的抓取HTTP端点上获取指标. 本指南将展示如何使用和安装Promethues,配置和监视第一个资源.还将下载并安装导出器Exp ...

随机推荐

  1. 201521123037 《Java程序设计》第7周学习总结

    1. 本周学习总结 以你喜欢的方式(思维导图或其他)归纳总结集合相关内容. 2. 书面作业 1. ArrayList代码分析 1.1 解释ArrayList的contains源代码 查看ArrayLi ...

  2. 201521123068 《java程序设计》 第7周学习总结

    1. 本周学习总结 以你喜欢的方式(思维导图或其他)归纳总结集合相关内容. 2. 书面作业 1.ArrayList代码分析 1.1 解释ArrayList的contains源代码 //contains ...

  3. 201521123057 《Java程序设计》 第6周学习总结

    1. 本周学习总结 1.1 面向对象学习暂告一段落,请使用思维导图,以封装.继承.多态为核心概念画一张思维导图,对面向对象思想进行一个总结. 2. 书面作业 1.clone方法 1.1 Object对 ...

  4. 201521123010 《Java程序设计》第4周学习总结

    1.本周学习总结 1.1 尝试使用思维导图总结有关继承的知识点. 1.2 使用常规方法总结其他上课内容. 这周上课主要学了继承,在打代码的时候对各个关键字(除了super关键字)的用法有一点混乱.对多 ...

  5. 201521123066 《java程序设计》第一周学习总结

    本周学习总结 (1)学习了Java的跨平台运行是因为有虚拟机,其特点是具有简单性,结构中立. (2)老师使用了新的作业模式,要学会发现其中的优势并好好学习使用. 书面作业 (1)为什么java程序可以 ...

  6. 201521123015 《Java程序设计》第12周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多流与文件相关内容. 2. 书面作业 将Student对象(属性:int id, String name,int age,doubl ...

  7. MySQL集群(三)mysql-proxy搭建负载均衡与读写分离

    前言 前面学习了主从复制和主主复制,接下来给大家分享一下怎么去使用mysql-proxy这个插件去配置MySQL集群中的负载均衡以及读写分离. 注意:这里比较坑的就是mysql-proxy一直没有更新 ...

  8. [PHP源码阅读]number_format函数

    上次讲到PHP是如何解析大整数的,一笔带过了number_format的处理,再详细阅读该函数的源码,以下是小分析. 函数原型 string number_format ( float $number ...

  9. [UIKit学习]05.关于plist

    plist是一种iOS本地化轻量级存储方式 创建plist 选择New File-> Resource->plist 加载plist //获得Plist文件的全路径 NSBundle *b ...

  10. 分享基于分布式Http长连接框架--架构模型

    我画了个简单的架构图来帮助说明: 其实为发布订阅架构模式. 生产者和消费者我们统一可理解为客户端,消息中间件可认为是服务端. 生产者和消费者做为客户端要跟服务端交互,则先通过代理订阅服务端,订阅成功后 ...