运维的立身之本:监控
monitor is all
About Me
• 人人公司网络运营部高级研发工程师
• 《网站运维技术与实践》作者
• Perl语言中国大会组织人
• 博客:http://chenlinux.com
• 微博:@ARGV
About Operation
• 五年前:
– 单手上架2U服务器
– 熟练部署apache软件
– 半夜三点重启
– 每周四上传压缩包更新应用
– 背黑锅
About Operation
• 现在:
– SRE(Google)
Keep the site up
Work at a Large Scale
Balance competing demands
– PE(淘宝)
– DevOps(Facebook)
Move Fast, Monitor Close
– SDN
About Operation
About Operation
我靠
About ―敌情‖
About ―未来‖
• DevOps是抢―应用上线‖的活;
• NoOps是抢―服务器上线和配置管理‖的活;
• 那Ops还能靠什么活着?
 投身前两者去换个方式抢回自己饭碗
 祭大招:监控
About Monitor
• 监控工作是怎样的?
About Monitor
• 你猜监控工作是这样的?
About Monitor
• 监控工程师都是这样的?
About Monitor
• 工作环境是这样的?
System Monitor
• command and procfs
• systemtap
• monit
command
• 命令是我们了解Linux系统最直接和有效的
途径
– 网络
– 磁盘
– CPU
– 内存
– 进程
网络
• ifconfig
• ping
• traceroute
• arp
• ethtool
• iptraf
• netstat
• tcpdump
ifconfig
• MAC地址
• ip地址
• MTU大小
• 收发包字节数
• 错误包、丢包、重发包、巨型包数目
ping
• 每秒一次的普通模式
• 洪水攻击的疯狂模式
traceroute
• mtr命令(推荐)
• 每一跳导致的延时
netstat
• 监听端口
• 建连状态
tcpdump
• 从TCP层面看建连IP对不对;
• seq次序是不是正常;
• win大小有没有协商加大;
磁盘
• df
• iostat
• smartctl
df
• df -Ti
– 文件系统的inode问题、目录最大文件数问题
• df -h
iostat
• rrqm/s:合并后每秒发送到设备的读入请求数
• wrqm/s:合并后每秒发送到设备的写入请求数
• r/s:每秒发送到设备的读入请求数
• w/s:每秒发送到设备的写入请求数
• rsec/s:每秒从设备读入的扇区数
• wsec/s:每秒向设备写入的扇区数
• rkB/s:每秒从设备读入的数据量,单位为K
• wkB/s:每秒向设备写入的数据量,单位为K
• avgrq-sz:发送到设备的请求的平均大小,单位是扇区
• avgqu-sz:发送到设备的请求的平均队列长度
• await:I/O请求平均执行时间.包括发送请求和执行的时间.单位是毫秒
• svctm:发送到设备的I/O请求的平均执行时间.单位是毫秒
• %util:在I/O请求发送到设备期间,占用CPU时间的百分比
iostat => iops问题
• 机械磁盘的IOPS上限
– d:磁盘数量
– dIOPS:每块盘的IOPS
– %r:读负载的百分比
– %w:写负载的百分比
– F:对应RAID级别的写操作次数
通过iostat输出的rsec/s和wsec/s数据计算
Raid 级别
写操
作
读操
作 具体说明
0 1 1 高吞吐,低
1 2 1
写请求:和单盘速率一样;读请求:有两种模式。同时从两块盘读取,或者从先返回响
应的盘读取。前者吞吐量更大,后者寻道时间更短。
5 4 1 写请求:读读请求:通常吞吐量大二期
6 5 1 写请求:读读请求:通常吞吐量大二期
―F码‖对照表
iops=> SSD解决
• SSD的寿命
# smartctl -A /dev/sdc
5 Reallocated_Sector_Ct 0x0032 100 100 000
Old_age Always - 0
232 Available_Reservd_Space 0x0033 100 100 010
Pre-fail Always - 0
233 Media_Wearout_Indicator 0x0032 090 090 000
Old_age Always - 0
241 Host_Writes_32MiB 0x0032 100 100 000
Old_age Always - 151100
内存
• free
• swap的意义
• vmstat看到的si/so
进程
• ps auxfww
进程
• ps awxo pid,rss,vsz,etime,args --sort=rss
VSZ和RSS的意义
• VSZ(virtual memory size):这指的是进程
可以占用的内存地址空间的大小
• RSS(resident set size):这指的是进程实际
占用的内存地址空间的大小。
# pmap -d 30269
30269: /usr/sbin/apache2 -k start
Address Kbytes Mode Offset Device Mapping
b74c7000 1676 r-x-- 0000000000000000 000:00010 libc-2.15.so
b766a000 4 ----- 00000000001a3000 000:00010 libc-2.15.so
b766b000 8 r---- 00000000001a3000 000:00010 libc-2.15.so
b766d000 4 rw--- 00000000001a5000 000:00010 libc-2.15.so
CPU负载
• w命令
15:10:26 up 442 days, 23:53, 1 user, load average: 0.00, 0.00, 0.00
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 10.4.250.84 14:50 0.00s 0.07s 0.00s w
• load average的含义
• linux会每5秒钟统计一次当前正在运行的任务(kernel代码中的
TASK_RUNNING)数和正在等待磁盘IO的任务(
TASK_UNINTERRUPTIBLE)数,然后每1、5和15分钟计算一次平
均值,这就是平均负载。
• 如果是多CPU的服务器,那么linux先对每个CPU进行平均负载计算,
然后求和。
CPU负载
• dstat命令
– hiq:硬中断
– siq:软中断
procfs
• 现在:
 /proc/net/dev
 /proc/meminfo
 /proc/cpuinfo
 /proc/loadavg
• 未来:
 /sys/fs/cgroup/memory/*/memory.stat
 /sys/fs/cgroup/blkio/*/blkio.*
 /sys/fs/cgroup/cpuacct/*/cpuacct.stat
 /proc/`cat /sys/fs/cgroup/devices/*/tasks`/ns/net
/proc/net/dev格式
sl local_address rem_address st tx_queue rx_queue tr tm->when retrnsmt uid timeout
inode
0: 00000000:0050 00000000:0000 0A 00000000:00000000 00:00000000
00000000 0 0 22714864 1 ffff88004f918740 750 0 0 2 -1
• 数据都采用十六进制,所以这个0050其实是80端口
• st含义如下:
– 00 "ERROR_STATUS",
– 01 "TCP_ESTABLISHED",
– 02 "TCP_SYN_SENT",
– 03 "TCP_SYN_RECV",
– 04 "TCP_FIN_WAIT1",
– 05 "TCP_FIN_WAIT2",
– 06 "TCP_TIME_WAIT",
– 07 "TCP_CLOSE",
– 08 "TCP_CLOSE_WAIT",
– 09 "TCP_LAST_ACK",
– 0A "TCP_LISTEN",
– 0B "TCP_CLOSING",
/proc/net/dev应用示例
netstat -ant|grep '$port '|wc -l
转换成:
port_16=`echo $port | awk -F,
'{for(i=1;i<=NF;i++){printf "|%.4X",$i}'} | sed 's/|//'`
cat /proc/net/tcp* | awk '$2~/:('$port_16')$/' | wc -l
• 2万链接的情况下计算耗时从20秒降低到5秒。
systemtap
• yum install systemtap systemtap-runtime
stap语法
• # stap -e 'probe kernel.function("vfs_read")
{printf("%sn", $$parms$); exit(); }'
• file={.f_u={...}, .f_path={...}, .f_op=0xffffffffa06e1d80, .f_lo
ck={...}, .f_count={...}, .f_flags=34818, buf="" count=8196
pos=-131938753921208
• # stap -e 'probe kernel.function("vfs_read")
{printf("%sn", $$parms$$); exit(); }'
• file={.f_u={.fu_list={.next=0xffff8801336ca0e8,.prev=0xfff
f88012ded0840
}, .fu_rcuhead={.next=0xffff8801336ca0e8
stap用法
• # cat tcp_init_cwnd.stp
• probe
kernel.function("tcp_init_cwnd").return {
• $return = $1
• }
• # stap -p4 -g -m initcwnd tcp_init_cwnd.stp
10
• # insmod initcwnd.ko
stap示例(socktop)
monit
set httpd port 2812 and
use address localhost
allow localhost
set daemon 60
set alert 'noreply@admin.com'
check system localhost
if cpu usage (wait) > 5% for 2 cycles then alert
check process squid with pidfile '/var/run/squid.pid'
start program = '/etc/init.d/squid start'
stop program = '/etc/init.d/squid stop'
if totalmem > 8192 Mb then restart squid
check file cache_log with path /var/log/squid/cache.log
if match "COSS: /data/stripe: Rebuild Completed"
then exec "/usr/libexec/squid/online" every 10 cycles
monit命令
• monit命令通过HTTP接口和monit进程交互
Cluster Monitor
• Howto
• passtive collect
– nrpe/snmp
• active broadcast
– nsca/gmond
HOWTO
• 开几十个终端窗口
• 写shell脚本循环ssh服务器
• rsync收集服务器的sar输出
• 还有什么?
Nagios
• Nagios原理
• Nrpe原理
• Nagios-Plugins示例
• Nagios-Addons推荐
• Mod_Gearman实现分布式
"All monitoring software evolves towards becoming an
implementation of Nagios."
—— Etsy官方博客
快速部署
• yum install omd
nagios.cfg示例
define timeperiod{
timeperiod_name 24x7
alias 24 Hours A Day, 7 Days A Week
sunday 00:00-24:00
monday 00:00-24:00
tuesday 00:00-24:00
wednesday 00:00-24:00
thursday 00:00-24:00
friday 00:00-24:00
saturday 00:00-24:00
}
nagios.cfg示例
define contact{
name generic-contact
service_notification_period 24x7
host_notification_period 24x7
service_notification_options w,u,c,r,f,s
host_notification_options d,u,r,f,s
service_notification_commands service-notify-by-email
host_notification_commands host-notify-by-email
register 0
}
define contact {
contact_name zhangling
alias zhangling
email zhangling@renren-inc.com
use generic-contact
}
define contactgroup {
contactgroup_name rradmin
alias renren administrator
members raochenlin,xiehaichao,zhangling
}
nagios.cfg示例
define host{
name generic-host
notifications_enabled 1
event_handler_enabled 1
flap_detection_enabled 1
failure_prediction_enabled 1
process_perf_data 1
retain_status_information 1
retain_nonstatus_information 1
notification_period 24x7
check_period 24x7
check_interval 5
retry_interval 1
max_check_attempts 3
check_command check-host-alive
notification_interval 120
notification_options d,u,r
register 0
}
nagios.cfg示例
define host {
host_name XADX3-136.opi.com
alias cdn-hdn-xadx-136
address 10.10.16.136
parent XADX3-1.opi.com
use host-pnp
contact_groups rradmin
hostgroups cdn-xa-squid
}
nagios.cfg示例
define service{
name generic-service
active_checks_enabled 1
passive_checks_enabled 1
obsess_over_service 1
check_freshness 0
notifications_enabled 1
event_handler_enabled 1
flap_detection_enabled 1
failure_prediction_enabled 1
process_perf_data 1
retain_status_information 1
retain_nonstatus_information 1
is_volatile 0
check_period 24x7
max_check_attempts 3
normal_check_interval 10
retry_check_interval 2
notification_options w,u,c,r
notification_interval 60
notification_period 24x7
register 0
}
nagios.cfg示例
define service {
service_description CDNXADX hdn cpu wait io
host_name XADX3-111.opi.com,XADX3-112.opi.com
use srv-pnp
active_checks_enabled 1
check_command check_by_gmond!10!20!cpu_wio
check_interval 5
contact_groups rradmin
first_notification_delay 2
retry_interval 1
}
• retry_interval —— 覆盖了use模板内已经定义的原有值
nagios.cfg示例
define command{
command_name check_by_gmond
command_line $USER1$/check_by_gmond -H
$HOSTADDRESS$ -w $ARG1$ -c $ARG2$ -m $ARG3$
}
• $USER1$ —— 默认宏定义,指向plugin目录,可以自定
义
页面浏览和配置
Nagios报警
• 分时间、分级别、分归属、分上下游
报警配置
• notification_period
• notifications_enabled
• host_notification_options
• service_notification_options
• notification_interval
• first_notification_delay
• hostescalation
• serviceescalation
natification_options
 r = Recovery(恢复)
 f = Flapping(抖动)
 s = Scheduled downtime(规划内停止和恢复)
 n = None(不发送)
 d = Down(host状态)
 u = Unreachable(host不可达)或Unknown(service未知)
 w = Warning(service警告)
 c = Critical(service危险)
escalation示例
define serviceescalation{
service_description CDNXADX hdn cpu wait io
first_notification 4
last_notification 0
notification_interval 30
contact_groups sysadmin_email
}
• 不在escalation范围的,按照普通
notification定义运行
Nagios原理
Nrpe原理
插件示例
• # /omd/sites/cdn/lib/nagios/plugins/check_http
10.9.16.45 -p 80 -H hdn.xnimg.cn -u /10k.html
• HTTP OK: HTTP/1.1 200 OK - 9747 bytes in 0.011
second response time | time=0.010561s;;;0.000000
size=9747B;;;0
• # echo $?
• 0
插件示例
• # /omd/sites/cdn/lib/nagios/plugins/check_http
10.9.16.45 -p 80 -H hdn.xnimg.cn -u /10k.htm
• HTTP WARNING: HTTP/1.1 404 Not Found - 319 bytes
in 0.591 second response time
|time=0.591065s;;;0.000000 size=319B;;;0
• # echo $?
• 1
插件示例
• # /omd/sites/cdn/lib/nagios/plugins/check_http
10.9.16.240 -p 80 -H hdn.xnimg.cn -u /10k.html
• CRITICAL - Socket timeout after 10 seconds
• # echo $?
• 2
扩展推荐
• PNP4Nagios
• check_mk
• NdoUtils
Mod_Gearman原理
Mod_Gearman配置
Ganglia
• Ganglia原理
• Gmond原理
• Gmond的python插件开发
快速部署
• yum install ganglia ganglia-gmond ganglia-
gmetad ganglia-gmond-python ganglia-
web
Ganglia原理
Gmond原理
ganglia.conf要点示例
cluster {
name = "CdnXianTelecom"
owner = "renren.com"
latlong = "unspecified"
url = "http://www.renren.com"
}
udp_send_channel {
port = 8649
host = 10.10.16.111
}
udp_recv_channel {
port = 8649
bind = 10.10.16.131
}
tcp_accept_channel {
port = 8649
}
python_module示例
python脚本规范示例
pyconf配置示例
其他流行软件
• Cacti
– 只支持snmp。一般就只用于流量监控
• Zabbix
– MySQL存储,IO是瓶颈。其他功能很全
• OpenTSDB
– GNUplot画图,太简陋。HBase存储易扩展
Web Monitor
• 为什么监控WEB
• WEB上应该监控什么
• NetworkBench
• Boomerang
WHY
• ―我这里是好的啊?‖
• ―我这里很快啊?‖
Because...
Also because...
• AJAX
• jQuery
• CoffeeScript
• NodeJS
• Chrome Apps
• ChromeOS
• HTML5
• ...
What
• HTTP
– duration_connect_msec (u_int32)
– duration_firstbyte_msec (u_int32)
– duration_total_msec (u_int32)
– request_bytes (u_int32)
– response_bytes (u_int32)
– response_code (string)
• HTTPS
– ssl_expire_in_sec (u_int64)
• JBOSS(Monitor via JMX, SNMP, j4p)
– session_count (u_int32)
– free_mem (u_int64)
– ajpthread_count (u_int32)
单机检测
• # curl -s -o /dev/null http://www.baidu.com
-w "%{http_code} %{time_namelookup}
%{time_connect} %{time_starttransfer}
%{time_total} %{size_download}n"
• 200 0.001 0.003 0.006 0.011 53592
单机检测(Firebug)
瀑布图要点
八秒定律
• 谷歌每天处理的搜索量超过30亿次,如果将搜索结果的提交时
间放慢0.4秒,一天的搜索量就会减少800万次。
• 如果网页加载时间超过4秒,约有四分之一的人会放弃打开该网
页。
• 如果网页加载时间超过10秒,50%的移动用户会放弃该网页,
约五分之三的人不会再返回该网站。
• 79%的移动网络用户使用手机购物。40%的移动购物者会放弃
加载时间超过3秒的电子商务网站。
• 亚马逊(微博)每天的销售额约为6700万美元。网页延迟1秒可能
导致该公司全年最高损失16亿美元。
——2012年3月 美国OnlineGraduatePrograms.com
networkbench示例
当然还有类似的高明、博睿、红蜘蛛、监控宝等等。。。
基调行业报告
Boomerang
<script src="boomerang.js" type="text/javascript"></script>
<script type="text/javascript">
BOOMR.init({
beacon_url: "http://yoursite.com/beacon.php",
user_ip: "<user's ip>",
BW: {
base_url: "http://base_url/images/",
cookie: "BW"
}
});
</script>
基础原理
• HTML页面嵌入如下代码:
testdiv = $("#testing");
testdiv.css("display","none");
begin = new Date;
testdiv.attr("src", testurl);
end = new Date;
msec = end.getTime() - begin.getTime();
$.get("http://monitor.com/api",{time: msec, url: testurl});
• Nginx配置定义如下日志格式:
log_format js_record '$time_local $status $remote_addr $COOKIE_id
$arg_time $arg_url $http_referer $http_x_forwarded_for'
• 根据$arg_time统计访问耗时低于2秒的百分比
网络延时与丢包率的影响
Futures
• 预警分析
– RRD
– Kale
• 趋势报表
– sar
sar -u
sar -n DEV
sar -r
• 大数据搜索
– Logstash+Elasticsearch+Kibana
RRDtool
• RRDtool通过 Holt-Winters 预测算法,为数据源提供数据
平滑,置信区间,发展预测等扩展功能。
# rrdtool create monitor.rrd --step 300 
DS:ifOutOctets:COUNTER:1800:0:4294967295 
RRA:AVERAGE:0.5:1:2016 
RRA:HWPREDICT:1440:0.1:0.0035:288:3 
RRA:SEASONAL:288:0.1:2 
RRA:DEVPREDICT:1440:5 
RRA:DEVSEASONAL:288:0.1:2 
RRA:FAILURES:288:7:9:5
RRDtool示例
# rrdtool graph - --alt-y-grid --rigid --color 'BACK#E0E0E0' 
--color 'SHADEA#FFFFFF' --color 'SHADEB#FFFFFF' 
--start '-1D' --end N --width 280 --height 200 
--title '__SUMMARY__:__SUMMARY__[ last 1D]' 
--vertical-label ' per secend' 
DEF:value=requests.rrd:value:AVERAGE 
DEF:seasonal=requests.rrd:value:SEASONAL 
DEF:hwpredict=requests.rrd:value:HWPREDICT 
DEF:devpredict=requests.rrd:value:DEVPREDICT 
DEF:failures=requests.rrd:value:FAILURES 
CDEF:predict_upper=hwpredict,devpredict,2,*,+ 
CDEF:predict_lowper=hwpredict,devpredict,2,*,- 
TICK:failures#ffffa0:1.0:'Failures Average bits out' 
LINE:value#0022e9: requests.rrd 
GPRINT:value:LAST:' Predict:%8.2lf %s' 
GPRINT:value:MAX:' Max:%8.2lf %s' 
GPRINT:value:AVERAGE:' Average:%8.2lf %s' 
LINE:seasonal#2266ee:SEASONAL_requests.rrd 
LINE:predict_upper#229900:PREDICT_UP_requests.rrd 
LINE:predict_lowper#992200:PREDICT_LOW_requests.rrd
Kale
• 异常探测的skyline(左边)
• 相似查找的oculus(右边)
skyline原理
• first_hour_average
• simple_stddev_from_moving_average
• stddev_from_moving_average
• mean_subtraction_cumulation
• least_squares
• histogram_bins
• grubbs
• median_absolute_deviation
• Kolmogorov-Smirnov_test
skyline示例
oculus原理
• 欧几里德算法原理:根据两点的坐标系计算直线距离;
• 动态时间归整原理:将时间序列进行延伸或者缩短再计算。
LEK
Q & A!

Monitor is all for ops