这一章的内容是核心,以后会用的几率也是很大的,只要掌握必备的基础知识,做初级系统管理员是不成问题的。
13.1监控系统的状态
作为一个运维工程师、系统管理员,如果对自己的系统不了解的话,那怎么排查问题呢?如果出现问题的话,肯定要查一下是什么问题,哪里的问题,系统的资源的耗费情况如何查看。
13.1.1使用w命令查看当前系统的负载
第一部分是系统时间,使用date命令也可以查看当前时间。
第二部分是系统运行时间
第三部分是登陆了几个用户,从下面可以看到,也可以看到登录了哪个终端。如果是网络登录的话,终端是ps/0,ps/1这些;如果是系统登录,会出现tty1,tty1- tty6是6个终端。from是可以看出从哪里来的。
load average是关键的一段,这是它的系统负载,平时用的最多的就是这一部分了。它后面跟三个数字,分别是1分钟、5分钟、15分钟内系统的平均负载值。第一个数字是单位时间内使用CPU的活动的进程有多少个,值越大说明服务器压力越大。这个数字可以是零点几,也可以是一百多,当前值是0,说明系统没有负载,就没有活动的进程,这说明服务器处于空闲的状态。这对于Linux操作系统来讲就比较浪费,它在空耗。那什么值是理想状态呢?看你有几颗CPU,这个指的是逻辑CPU,而不是物理CPU。CPU有很多类型,Intel的,AMD的,都会有几颗CPU,每颗上又会有很多逻辑CPU。查看CPU的命令如下:
cat /proc/cpuinfo,需要查看的数字是processor。如果是0,就代表有1颗;是1代表是2颗;如果有39,就代表有40颗。
这里说的是逻辑CPU,而不是物理CPU。系统上的数字是0,代表有一个CPU,用w命令查到的第一个数字是1是最好的,不闲也没什么压力。processor的最大数字是7,代表最多有8颗CPU,只要w命令查到的数字不大于8,就是可以的。[email protected]是登陆的时间,IDLE是空闲了多长时间,PCPU是使用CPU的时间,WHAT是适用的命令,后面的可以不用管它。
还有一个命令是:uptime,它和w命令的结果一样。
注:/proc/cpuinfo文件记录了CPU的详细信息。目前市场上多为2颗多核CPU,在Linux看来,它就是2*n个CPU(n为单颗物理CPU上有几核)。如果n为4,则查看这个文件时会显示8段信息,而最后一段信息的processor会显示7,查看当前系统有几个CPU,可以使用命令grep -c 'processor' /proc/cpuinfo。然后查看有几颗物理CPU时,则需要查看关键字physical id。
13.1.2用vmstat命令查看监控系统的状态
我们用w命令学会了查看负载情况,如果出现了负载值偏高的情况,如查询的数字大于CPU核数了,说明CPU不够用了。此时就需要思考CPU不够用的原因,进程在干什么,都有哪些任务在使用CPU,你可能想去查看系统的瓶颈在哪里。
可以查到CPU核数,内存,虚拟内存交换分区,io就是磁盘,系统的进程等等相关的东西。经常使用vmstat 1命令,每隔一秒输出一次状态,感觉差不多可以Ctrl C结束。
当然也可以vmstat 1 5,每隔一秒输出一次状态,输出5次结束。
我们只需要关心如下几列:
proc显示进程的相关信息:
r,是run的简写,表示系统中有多少进程是属于run的状态。如果只有一个CPU,那某一个时间点只可能有一个进程在使用CPU,其他进程都在排队。但它们那是循环的,每个进程都有机会使用CPU,都可以使用一会儿。不管是在使用还是在排队,都是处于r的状态。如果该数值长期大于服务器CPU的个数,则说明CPU资源不够用了。
b,是block的缩写,表示等待资源的进程数。b就是说进程被CPU以外的资源(硬盘或者网络)给阻断了,处于一个等待状态,卡死了,b被堵死了。比如说网速慢,进程想要给你发一个数据包,假如网速很快,只需要1秒就发完了。但是现在速度慢,可能就花了10秒钟,就是因为网速太慢,这个时候只能等网速了,这就是有多少进程在等待了。
memory显示内存的相关信息
swpd,表示切换到交换分区中的内存数量,单位为KB。以前讲分区时,有个swap交换分区,当内存不够时,系统可以把内存中的一部分数据临时放到swap空间里面去。如果这个数字不变,那还好;如果这个数字在持续不断的变化,那说明内存和交换分区在持续不断的交换数据,这就说明内存不够了。
free,buff,cache我们讲内存时,再讲这几个单词的含义。
swap显示内存的交换情况
si、so和swapd相关,如果swapd频繁变化,那他们也会相应发生变化。
si:表示有多少数据(块)是由swap交换区进入内存中的,单位为KB。i表示in,进入内存的。o表示out,so表示有多少是从内存中出来的。
io显示磁盘的情况
bi,bo是和磁盘有关系的。bi表示从块设备读取数据的量(读磁盘),单位为KB。bo表示从块设备写入数据的量(写磁盘),单位为KB。这个数据量很大,说明磁盘在频繁的读写。io相比较磁盘来说,是很慢的。如果有那么多的数据读写,肯定会造成并列增加,因为有很多进程在等待磁盘,这个是必然的。
CPU:显示CPU的使用状态
us:表示用户级别的,比如说一个操作系统,肯定不可能只运行一个系统,还有跑一些服务。比如跑了一个网站,跑了一个MySQL,网站也好,MySQL也好,肯定会占一些资源,它就会体现us这一方面了,user占用的情况。us的数字是不会超过100的,因为一共就100%。us数字表示用户下的资源占用CPU的百分比,us长期大于50就说明系统资源不够了。
sy:显示系统本身花费CPU的时间百分比。
id:表示空闲的百分比us+sy+id=100
wa:wait等待,表示I/O等待所占用CPU的时间百分比,这一列很大,说明CPU不够用了。
通过vmstat命令可以判定出系统的瓶颈,如CPU不够,内存不够,还是磁盘io太大。
13.1.3用top命令显示进程所占的系统资源
可以用top查看具体的进程。
第一行和w命令查到的是一样的,总共有多少任务,有多少运行的任务,有多少正在sleeping的任务。僵尸进程,主进程被意外终止,子进程就没人管了,就比较尴尬,没人管,只能自生自灭。
风扇转的欢,CPU很烫,说明CPU使用率很高。us长期在60%以上是对CPU没有好处的。
下面是真正需要关心的东西,默认情况下,它会按CPU百分比从高到低排序,%MEM是内存,RES是物理内存大小,单位是KB千字节。
按大小字母M,会出现按内存使用大小排序,可以看到进程使用内存的具体大小。按大小字母P,换回CPU使用大小排序。按1的话,下面会列出
所有的CPU使用情况。按字母q会推出top命令。
使用top -c命令可以查看具体的进程命令,全局的路径。
使用top -bn1命令,可以静态的一次性的把所有的信息全部显示出来。
这种用法适合在写脚本的时候用。
可以关注一下PID,比如说要杀死一个命令,可以使用PID去杀。kill PID命令就可以杀死一个进程。
USER是哪个用户运行的,PR、NI是关于优先级的,不需要过多关注。
注:使用top命令重点查看的还是下面的进程使用系统资源的详细状况。
13.1.4用sar命令监控系统状态
sar是一个非常全面的分析系统状态的命令,主要用来查看网卡的流量。它同样可以查看你的CPU、内存、磁盘的状态,它被称为linux系统中的瑞士×××,也就是它的命令非常复杂和丰富。与其他系统状态监控工具不同,它可以打印历史信息,可以显示当天从零点开始到当前时刻的系统状态信息。
如果没有这个命令,可以通过
yum install -y sysstat来安装。
安装完这个命令,首次使用这个命令会出现如下错误,那是因为sar工具还没有生成相应的数据库文件(无需时时监控,因为不用去查询那个库文件)。
如果sar不加参数的话,它会调用系统里面保留的历史文件,
这个目录就是它生成的历史文件所在的目录,什么叫历史文件呢?因为sar有一个特性,每10分钟会把系统的状态过滤一遍,抓一边保存在文件里,这个文件就存在上面的目录里。
这个命令要想用,需要加上合适的选项和参数,如果要查看网卡的流量,需要使用如下命令:
这个用法和vmstat的用法类似,就是每隔1秒钟显示1次,总共显示10次结束。
IFACE表示网卡的名字。
rxpck/s和txpck/s表示每秒钟的包的数量,单位是个。rx是receive的简写,代表收取的,tx代表发送的。
rxkB/s这一列表示每秒收取的数据量(单位是KB)
txkB/s这一列表示每秒发送的数据量(后面几列不需要关注,阿铭老师工作这么多年,后面几列都是不超过0的,也就是都是0)
一个网站如果遭到攻击,它会发送很多的数据包给你的网站,意味着你要接受很多的数据包。量很大的话,意味着你的网卡承担不了,最终导致网络堵塞,你的网站不能打开。
那多少包合适呢?
有时候也要关注网卡是否跑满,比如你的公司买了一个机柜,分配了一些带宽(比如说100M),100M不大,如果换算成常规理解的就是12.5M/s,也不是很大。如果有几个人同时下载的话,很快就占满了。如果rxpck/s的数据包有几千是正常的,如果有几万的话,就不正常了。有几万,几十万的话,就是被攻击了。如果被攻击了,可以看rxpck/s的数据包有多少,这个不太确定,需要用抓包工具。
使用如下命令可以查看某一天的网卡流量:
sar -n DEV -f /var/log/sa/sarn,n代表具体的日期
数据在这个目录下最多保留一个月
sar -q是查看服务器在过去的某个时间的负载情况
sar -b是查看磁盘的
下面的命令是看它的读和写
13.1.5用nload命令查看网卡流量
sar命令可以查看网卡流量,但是不够直观,使用nload命令更好。nload命令默认没有安装,需要使用如下命令安装:
yum install -y epel-release;yum install -y nload
安装完运行,就会出现动态的显示网卡:
最上面一行是网卡名字以及IP地址,按向右箭头可以查看其他网卡的网络流量。输出结果分为两部分,Incoming为进入网卡的流量,Outgoing为网卡出去的流量,我们关注的当然是Curr那行的数据,其单位也可以动态自动调整,非常人性化。按q退出该界面。买的带宽是出去的带宽,如果有攻击,进来的数字就会很大。
sar的补充内容:
这个目录等到明天才会生成,sar28是可以通过cat来查看的,而sa28不能。
13.1.6监控io性能(这个是关于磁盘的,磁盘的状态的两个命令)
在日常运维过程中,除了CPU、内存外,磁盘的io也是非常重要的指标。有时候CPU、内存明明有剩余,但系统就是负载很高,我们用vmstat命令查看会发现b列或wa列比较大,那就说明系统磁盘有瓶颈。
我们在安装sysstat包时,就会安装iostat命令,它和sar属于同一个包。
iostat的用法:
也可以
要讲的是iostat -x命令,这里有一个非常重要的指标。
%util首先是一个百分比,这一列表示io等待,总之就是磁盘使用有多少时间是占用你CPU的。CPU有一部分时间是给进程处理、计算的,也有一部分是等待io的,等待磁盘读写的。如果这个数字是50%以上,就说明磁盘太差了,它非常忙碌。如果硬盘有问题,即使CPU再快,再厉害,还是存在很大的瓶颈。如果磁盘严重不行,只能更换磁盘。
如果发现磁盘io很忙,很频繁,如果想知道是哪一个进程在频繁的读写,就可以使用Iotop命令。但发现没有安装,使用yum install -y iotop安装。
它和top很像,是动态的,按排行来排。
我们看的是IO百分比
13.1.7用free命令查看内存使用情况
free命令可以查看当前系统的总内存大小以及使用内存的情况。CentOS 7系统的free命令显示结果比CentOS 6更简洁一些,但大体一致。
总共有三行,第一行是说明,第二行是内存的使用情况,第三行是交换分区的情况。
total:内存总大小
used:真正使用的实际内存大小
free:剩余物理内存大小(没有被分配,纯剩余)
shared:共享内存大小,这个不用关注
buff/cache:分配格buff/cache的内存总共有多大。
简单区分一下buff(缓冲)和cache(缓存),数据的流向不一样,所叫的名字也不一样。buff/cache都是一部分内存,内存的作用就是缓解CPU和IO(如,磁盘)的的速度差距的。可以这样理解:数据经过CPU计算,即将要写入磁盘,这是用的内存为fuff;CPU要计算时,需要把数据从磁盘中读出来,临时先放到内存中,这部分内存就是cache。
avaliable:系统可使用内存有多大,它包含了free。linux系统为了让应用跑得更快,系统会预先预留出一部分(buff/cache)给某些应用使用,虽然这部分内存并没有真正使用,但也已经分配出去了。然而,当另外一个服务要使用更多内存时,是可以把这一部分预先分配的内存拿来用的。所以,
available=free+buff/cache
total=used+free+buff/cache
buffer和cache如此重要,系统会预先预留出一部分给buffer和cache。
使用free命令需要关注的是available这一项。
13.1.8使用ps查看系统进程
ps -elf和ps aux结果差不多
vmstat根本占用不了CPU多少时间,运行一下就sleep了。+说的是前台进程,说的是终端上的进程。
Z表示僵尸进程,这种进程不多,也会有。如果多的话,就想办法把它杀死。
<表示高优先级进程,优先级比较高,CPU先紧着给它用。
N表示低优先级进程,有Z相对,意味着它 不着急,晚一点用也没关系。
|多线程进程,线程和进程是有区别的,线程有一个大的进程组成的,一个进程里面有多个线程。概念回去查一查,进程和进程之间内存相互之间是不共享的,但线程之间使用了同一个进程的内存的区域。比如给进程分配了一个进程块,这个进程本来对这个内存是有使用权限的,但它下面的线程不管有多少,它们共享这一块内存,这就是线程的特点。多线程进程是说,进程有多个线程。
13.1.9用netstat命令查看网络状态
linux作为服务器的操作系统,服务器上会有很多服务,服务往往是和客户端相互通信的,这就意味着它要有监听端口,要有对外的通信端口。这个命令查看的就是TCP/IP通信的状态。安装一个MySQL,提供一个数据库服务,就要有一个监听端口,那么何为监听端口?正常情况下一台机器是没有任何的端口监听的,这就意味着它没有办法和其他的机器通信。你要想让其他人访问你的网站,它就需要监听一个端口,它把这个端口放开,打开一个孔。就像网卡上搞了一个小孔出来,然后远程的设备想办法和这个设备相连,数据就可以通过这个孔进入到网卡里,进入到服务器里,相互的进行通信。
端口查看命令:
l代表的是listen
sshd有两个,一个是tcp,一个是tcp6,tcp6就是Ipv6(tcp和udp的资料自行查阅,这个不作为重点)
master 25端口,发邮件的端口
第二个命令:
这个命令会查看tcp/ip状态
扩展知识:tcp/ip的三次握手,四次挥手,这个往往在面试的时候被问到
查看tcp/ip,需要关注一个值就是ESTABLISHED,如果这个值很大,说明你的系统很忙。并发连接数,就是同一时间有多少客户端在连接你,我们可以那这个数字来说明并发连接数有多少。上面说明有45个客户端和服务端进行通信,正在连接。这个是真正的通信,1000以内服务器都是能接受的。
ss -an 命令也能显示tcp/ip的状态
它有一个缺点,它不会显示进程的名字,vmstst -lntp命令可以
13.1.10linux下的抓包工具