第十三章 系统资源管理
13.1 系统配置查看
我们日常经常会提及系统资源的使用状况,那么系统资源具体是指什么呢?其实系统资源主要分为两种,运行资源和存储资源
运行资源:又称计算资源,主要是cpu、内存资源。
存储资源:即文件系统资源。之前我们讲过,磁盘大小、分区大小、LV大小并不代表系统可用空间的大小,只有制作了文件系统的空间,才可被系统使用,所以系统的存储资源主要是指可用的文件系统大小。
前面几章,我们己经讲过磁盘、LVM等存储资源的管理了,下面我们来分析下计算资源的相关信息。
首先,一台主机安装上Linux后,在系统中如何查看系统版本及各个硬件的配置信息呢?我们有如下几个命令:
uname -a ---查看系统内核版本
cat /etc/redhat-release ---查看系统版本
lscpu ---查看cpu参数,可见:cpu数,每个cpu几核,每核支持几个线程
cat /proc/cpuinfo ---查看cpu信息
其中,lscpu的命令结果如下图:
因为图中的Linux系统是建立在虚拟机上的,在给虚拟机分配硬件时,我们为了真实机的流畅,给虚拟机分配的cpu都是最小的,但在真实的服务上,显示的可能就不一样了。可以想象到,如果一台服务器有2个CPU,每个cpu里面8核,再开启cpu核的虚拟化技术,即每个核可支持双线程技术,则图中的各项应该显示为:
CPU(s) 2
Thread(s) per core 2
core(s) per socket 8
由此,我们可计算得到,这台主机的cpu可用核数为2*2*8=32核
下面再来看一下其他设备的信息:
free -h ---查看内存使用
cat /proc/meminfo ---查看内存信息
注:/proc用于记录系统当前的硬件配置信息。每次开机,都会根据当时的硬件配置状况,写入、记录到/proc/下的相关文件中,关机后就会清理掉。实质上/proc中的内容并没有存在磁盘上,而是在内存中,开辟了一块空间,制作文件系统,挂载到/proc/下使用的,称为伪文件系统
lsscsi lspci lsusb ---查看指定总线上的设备连接信息
注:有的系统该三个命令会有不存在的情况,是没有安装命令包的原因,yum安装上即可
再有,每次开机时,Linux系统都会扫描检查一下主机上各个硬件的连接及可用情况,也会有相应的检测报告,我们可以使用如下查看得到:
dmesg ---查看开机硬件检测报告,可见到所有硬件的连接信息
13.2 系统时间管理
其实,之前的章节中,我们已经使用过date命令查看系统时间了,但是如何配置系统时间呢?也是要用到date命令的,具体参数如下
date ---查看日期、时间
date -s 2019-4-17 ---设置日期,设置后时间会归零
date -s 09:50:00 ---设置时间
注:日期、时间不可以一条命令同时改;一定先改日期,后改时间
cal ---查看当前月历
cal 2019 ---查看指定年份月历
另外,除了系统内的时间以外,计算机主板上也有一个硬件时间,记录在bios中可以使用如下命令操作:
hwclock ---查看硬件时间,即主板bios上的时间
hwclock -s ---以硬件时间为准,同步到系统中
hwclock -w ---以系统时间为准,同步到硬件中
13.3 CPU性能分析
13.3.1 CPU使用率分析
一台计算机中,最重要的硬件当属cpu了,我们虽然可以查看得到cpu的型号、参数,但在系统运行中,cpu的具体使用率,也是我们重点关注的数据,可以使用sar命令来查看cpu的使用信息。
sar 1 3 ---查看cpu使用率
参数意义:每1秒显示1次(称为采样1次),共显示3次,计算平均值,主显示六列信息,如图:
图中各列的意义如下:
%idle cpu空闲率,正常60%上下,即cpu总使用率在40%上下
%user 用户进程占cpu的比例,大约可代表本机应用、服务进程占cpu的比例
%system 系统进程占cpu的比例
%iowait 等待读写完成的进程,占cpu的比例。
%nice 被修改了优先级的进程占cpu的比例。优先级的配置后面会做介绍
%steal被偷盗的cpu资源。偷盗是指:本机中,若安装有虚拟机,被虚拟机占用的cpu资源,视为被偷盗资源
计算公式:%idle=100%-其他五项
关于%iowait其实日常中我们每个人都遇到过。比如,当我们在线看电影、视频时,都是使用浏览器打开视频网站,网页内会内嵌一个播放器播放电影。但当网速较慢时,播放器会显示正在缓冲。可以想象到,正在缓冲的播放器,并未被关闭,但由于电影数据未能下载完毕,还不能播放,则该播放器即处于等待读写状态。所以,我们可以总结得到,等待读写进程是指正在等待网络、磁盘读写完毕前,暂停的进程,它不会退出cpu,也不处于运行状态。
那么,在生产环境下,cpu的正常使用率是多少呢?使用率到达多少时我们需要人为干预,查找故障呢?带着这些问题,我们来看一下下表:
%idle %user %system %iowait
正常:60%+- 30%+- 5%+- 10%+-
警告:30%+ 50%+ 30%+
故障:10%+- 70%+- 50%+-
在真正的生产环境中,会有专用的监控软件,实时监控cpu的使用率,当使用率到达我们预先设定的阈值时,监控软件会发出报警。一般报警的级别会分两种,警告级和故障级(或严重警告级)。到达警告级时,说明cpu当前压力略大,但是还可以正常工作,不至于影响程序运行,甚至死机。但当到达故障级时,说明cpu压力过大,会处于半死机或死机状态。所以我们应该在到达警告级时就开始分析参数,查找原因,及时解决,避免cpu到达故障值状态。
分析一下表中数据,当CPU使用LV到达警告值时,即cpu使用率60%以上(空闲率%idle不足40%),此时一般会有两种可能:
一种是cpu的%user超50%,代表本机上的应用程序、服务程序占据较多cpu资源,这可能是由于本机的访问量、业务量上涨造成的(如:网站服务器的客户点击量突然大幅上涨)。此时我们需要查看该业务的进程数、网络连接数等信息(后面章节会讲),来确定我们的判断,如果都有明显上涨,则要考虑是否需要增加业务主机来实现访问的负载均衡(即增加相同功能的主机,来分担这些访问业务)。
第二种可能是%user基本正常,但是%iowait过高,超过30%,说明本机的读写压力略大。可能是因为当前有数据备份、数据转移等工作在执行,临时造成的。但也有可能是由于磁盘故障,造成读写速度们导致的,所以我们需要观察所有磁盘的读写速度,对比以往每天、每周的历史监控记录,若有明显速度降低的磁盘,判断为疑似故障盘。再查看磁盘是否是常用程序的数据存放盘(因为非常用磁盘,读写业务少,压力小,读写速度显示都不会很大。),若是,则基本可确定为故障盘,需要更换。
若各项监控数据到达了故障级,则需立即查找原理,尽快处理。
关于查看磁盘读写速度,我们可以使用iostat命令,如下图:
如图可见,最后一行显示的是本机磁盘的读写性能,显示的五列信息是:
tps:每秒钟传输的IO请求的数量
KB_read/s:设备每秒钟读取的数量
KB_wrtn/s:设备每秒钟写入的数量
KB_read:设备读出的总数
KB_wrtn:设备写入的总数
13.3.2 CPU负载分析
首先我们先来看一下cpu的工作原理:一颗cpu内可以放置多个处理芯片,称为核(core)。每个core若开启了cpu虚拟化技术(vtd),则一个core可以虚拟成两个core的工作状态,称为一核双线程,即可以同时运行两个任务。把cpu虚拟后的双线程也可以视为core。如:双核四线程的cpu,可视为是4core状态。线程的概念将在后续讲解。
cpu的每个core运行线程时,会把线程放入运行队列中,若队列中有多个线程待运行,则core就会给队列中的每个线程分配时间片,依次运行。具体原理:一个core会把要运行的多个线程,放入队列中,称为运行队列或就绪队列。core会从队列中提取出第一个线程,运行一个固定的时间(如10ms),称为一个时间片。时间片到期后,若该线程未能运行完毕,也要暂停,放入运行队列尾。再提取队列中第二个线程入core执行,同样运行一个时间片的时间后,放入队列尾,再提取下一个。以此类推。
线程在运行过程中,若有读写需求,在读写完毕前是不会继续执行的,此线程将被暂停,放入等待队列。以待条件满足后再转回运行队列。
在core中正在运行的线程,若当前有一个优先级更高的线程需要紧急运行,即便正在运行线程的时间片未到,也会被打断,放入队列尾,core转去运行高优先级的线程。若两个线程优先级对等,则队列中下一线程会被插队排后。
好了,有了CPU工作原理的知识,我们再来分析下CPU的平均负载:每个core当前被分配了几个线程,即运行队列中有几个线程在排队运行,视为该core的负载量。假设双核四线程的CPU,相当于4core,现有4个线程请求运行,则平均一个core上一个线程,称平均负载为1,若现只有2个线程请求运行,则有两个core各运行一个线程,另两个core空闲,称平均负载为0.5。
查看CPU每个core的负载情况,使用的命令是uptime,如下:
uptime ---查看cpu的平均负载,即 w 命令的第一行信息。
其中,load average显示的是最近1min 5min 15min的平均负载值。
性能分析:CPU的平均负载正常时一般在 0.7-1之间,若到达1.2-1.5,视为负载略高,超过 2以上视为压力过大,需要做进程分析,甚至将一些业务转移到其他主机上,以降低CPU的平均负载。
我们也可以使用sar –q 命令来查看CPU的运行队列信息
sar –q 1 1 ---结果中各列意义如下:
runq-sz 运行队列的长度(等待运行的进程数,每核的CP不能超过3个)
plist-sz 进程列表中的进程(processes)和线程数(threads)的数量
ldavg-1 最后1分钟的CPU平均负载,即将多核CPU过去一分钟的负载相加再除以核心数得出的平均值,5分钟和15分钟以此类推
ldavg-5 最后5分钟的CPU平均负载
ldavg-15 最后15分钟的CPU平均负载
13.4 内存性能分析
介绍完了CPU的性能,我们再来分析一下内存的性能信息,其实之前已经讲过,查看内存系统的使用情况的命令是:free,但在free的显示结果中,我们只看了内存大小和已使用、剩余空间大小,其余信息并未作出解释,下面来看一下:
其中:total 表示内存总量,used表示已使用的大小,free表示空闲大小
shared表示共享内存最大允许使用更多大,共享内存将在后面章节介绍。
buff/cache表示存储/文件的缓存大小,availabl表示允许进程使用的大小。
其实cache和buffer还是有区别的,分别表示读和写时不同方向的缓存功能。buffer是指有数据写入磁盘时的缓冲区,cache表示从磁盘读取出文件时在内存中使用的缓存。
除了free命令,还可以使用sar -r命令查看内存和swap的使用情况,显示的会更加详细:
sar -r 1 1 ---查看内存使用信息。
注:其中的commit表示保证系统正常运行的内存大小(含物理内存+swap共多大)
sar -W 1 1 ---查看swap空间的读写速率。
下面,再来分析一下内存的使用率情况:
正常 警告 故障
内存 40%+- 60%+ 80%+
swap 10%+ 30%+ 50%+
注:若swap使用率过高,一般是由于物理内存不够大造成的,需要扩容物理内存
关于内存的使用率并不是一概而论的,在系统正常的情况下,内存的使用率应该在40%左右。但是有些软件的特点是会占据所有剩余内存或部分内存(虽然实际不会真正全部使用到),所以有些服务器上查看内存使用率较高,甚至达到90%+,不过这对系统速度和正常使用的影响不大。
13.5 sar命令小结
通过上几节的介绍,我们可以发现,其实sar命令功能是非常强大的,可以查看系统中很多方面的性能,其他扩展的参数,读者们可以参看下表,对照着学习。
sar命令常用参数小结:
(1)sar -b 5 5 --- IO传送速率
(2) sar -B 5 5 --- 页交换速率
(3) sar -c 5 5 --- 进程创建的速率
(4) sar -d 5 5 --- 块设备的活跃信息
(5) sar -n DEV 5 5 --- 网路设备的状态信息
(6) sar -n SOCK 5 5 --- SOCK的使用情况
(7) sar -n ALL 5 5 --- 所有的网络状态信息
(8) sar -P ALL 5 5 --- 每颗CPU的使用状态信息和IOWAIT统计状态
(9) sar -q 5 5 ---队列的长度(等待运行的进程数)和负载的状态
(10) sar -r 5 5 --- 内存和swap空间使用情况
(11) sar -R 5 5 --- 内存的统计信息(内存页的分配和释放、系统每秒作为BUFFER使用内存页、每秒被cache到的内存页)
13.6 进程初步管理
13.6.1 程序、进程、线程
我们了解了CPU、内存的性能查看,再来讲一下进程,首先,我们需要为大家介绍清楚以下几个概念:程序、进程、线程。关于这三个概念,很多书籍、教材中都会有介绍,但是书面性的文字,理解起来还是有难度的,所以我们将用更简单直接的方式为大家介绍基于操作系统层面上这三个概念的定义,虽然不够官方、正式,但便于理解,具体如下:
程序:由开发人员编写的,具备完整功能的一个软件,又称为程序。但从操作系统的角度出发,可以认为:存放于磁盘上,未被运行起来的软件,视为程序。即非运行态。
进程:被运行起来,占据CPU、内存资源的程序,称为进程,即运行态。
线程:可以认为是进程中的一个分步骤,只能完成进程中的一个小部分功能。
我们以QQ程序为例,没有起来时,QQ程序存放于磁盘分区中,但被运行起来后,在windows任务管理器的进程页中,会显示为QQ.exe进程。QQ程序整个的执行过程又可分为以下多个步骤,如图:
如此,我们可以认为,每一个分步骤即为QQ进程的一个线程。可见1、2、3号线程是必须依次执行的,不允许打乱顺序或同时运行,所以我们称它们为顺序执行的线程。而4、5、6号线程,它们之间没有相互制约关系,允许同时运行,则可以分布在CPU的多个core上同时运行,这种线程称为并行线程。
关于进程、线程的相关知识,我们还会在后续章节中再次深入介绍,本章先介绍到这里。
13.6.2 进程管理(基础)
在Linux系统中,关于程序我们操作的主要对象是其运行起来的进程。系统中进程的查看使用的是ps命令,参数使用也较多,具体如下:
ps ---查看当前终端的进程,即当前tty或终端下的进程
ps -aux ---查看本机内的所有进程,共11列信息
这11列分别是:进程所属用户、PID即进程ID、占CPU比例、占内存比例、占swap大小、占物理内存大小、所在终端(?表示系统进程,所有终端都需要)、当前状态、启动时间、cpu中运行时间、进程名。其中我们日常最常关注是前6列。
结合之前学过的字符处理命令,活用于最常用的几个需求:
ps -aux | sort -rn -k 3 | head -n 10 ---查看占cpu最多的前10个进程
ps -aux | grep mysql | wc -l ---统计指定服务的进程数
ps命令还有-ef参数(或者-efl)也可以查看到所有进程,不过显示的内容有所区别,如下:
ps -ef ---查看所有进程,可见PPID 父进程ID,显示的C列表示占CPU比例
所谓父进程,就是由一个进程调用启另一个进程,则两个进程被视为父子关系。而RHEL7.X之后的版本,系统的第一个进程是systemd,可认为是根进程,由它启动了系统主进程,进而陆续启动了系统中的其他进程。
pstree ---查看进程树,即按父子调用关系显示所有进程
查看到进程后,若有进程想要人为关闭,则可以使用kill -9命令。在之前的raid章节中,我们曾经使用过。命令格式如下:
kill -9 PID ---杀死进程
killall -9 进程名 ---杀死指定名字的进程,可同时杀死多个同名进程
注:pstree 和 killall命令 要提前安装psmisc 软件包才可使用
关于kill命令的其他参数,我们将在下节介绍。
13.7 系统综合性能查看
我们知道,windows的任务管理器是实时显示进程的,而Linux中的ps等命令只是显示一下进程信息,无法实现实时跟踪显示的效果。所以需要使用top命令做实时的显示,命令如下:
top ---每3s刷新显示一次
注:top显示的结果前几行会有CPU负载、进程信息、CPU使用率、内存使用信息、swap使用信息等多项。之下才是最近运行的进程信息。
在top界面中,还可以输入很多的命令实现不同效果,命令如下 :
h 显示帮助。
q 退出。
space 立刻刷新。
s 设置刷新时间,单位为秒。
k 杀掉一个进程。
r 定义一个进程的优先级。
C 按占cpu比例排序显示进程,
M 按占内存比例排序显示进程
其中:C、M、k、q使用率最高。
除了top,系统中还有vmstat,smart等多个命令可查看系统综合性能参数或单项设备参数,但最常用的是我们之前讲解的这些,有兴趣的读者可以自行参阅相关资料。
13.8 僵尸进程查杀
在系统中,如果有卡死的进程,它不运行,也不退出内存,始终占据着资源,这种进程称为僵尸进程。系统中若僵尸进程过多,会严重影响系统的运行速度。尤其是在服务器上,客户端通过网络访问,会经常出现异常断连、异常关闭的情况,则很容易造生服务器内的服务进程处于僵尸状态。
造成僵尸进程的主要原因还是由于父子进程调用,一方异常关闭,造成另一方无法正常执行,出现卡死的状态,从而变为僵尸进程。如:某一个进程运行过程中需要用到一些素材数据,所以会暂停,然后调用子进程收集、计算出素材数据,当子进程运行完毕,就会把素材数据携带会父进程,从而让父进程继续运行。但是,子进程运行时,若被异常关闭了,则造成父进程持续等待,又不能继续运行,从而变为僵尸进程;亦或,父进程调用子进程后,由于父进程被异常关闭,造成子进程返回时,无返回点。则被悬在内存中,成为了僵尸进程。
对于僵尸进程,我们的处理思路是:先查看到僵尸进程,记录其PID,再杀死。命令如下:
top ---查看综合信息,其中第二行最后的zombie项表示当前存在的僵尸进程数,若zombie项不为0,则说明系统中存在僵尸进程。
ps –aux | awk ‘($8 ~ /Z/) {print$1,$2,$8,$11}’ ---抓取僵尸进程
注:ps -aux中第八列表示进程状态,僵尸进程会显示为Z
awk中$8 ~ 表示字符匹配审核(之前讲过数字比较可用 == >= <= 等)
/Z/ 表示匹配字符中是否包含Z字符。(与sed命令中的 查找匹配功能类似)
抓取到僵尸进程后,按照其PID,我们可以使用 kill -9 PID的格式将其杀死。
13.9 查看系统资源的访问关系
另外,我们还可以查看系统中的各个进程、用户、文件、设备之间的访问关系,即谁正在访问谁,命令如下
lsof ---查看正在被进程访问的设备、文件,会显示设备、进程、用户等信息
lsof -u zhang ---查看zhang用户所启动的进程,正在访问的设备、文件
lsof -c vim ---查看指定进程正在访问的设备、文件
lsof -p 37402 ---查看指定PID的进程,正在访问的设备、文件
lsof -i:22 ---查看指定端口正在被哪些进程监听、访问
lsof /mnt/f1 ---查看指定文件正在被哪些进程访问
注:若是进程正在被vi编辑,真正的原理是,该文件被提出来临时存放在swap空间中,并命名为.文件名.swp的样子,也就是说,我们在编辑文件但并未保存时,其实编辑的是一个临时文件,只有当保存时,该临时文件才会写会到磁盘文件中。这样的临时文件在编辑过程中才便于我们撤销操作或不保存退出。所以抓取时也可以抓取该文件的临时文件,以获取正在编辑它的进程。如下图:
图中,有开启了两个终端,下面的一个终端正在编辑文件f1,上面的终端查看访问进程,查看.f1.swp时才会看到vi进程正在访问该文件。
与lsof类似,fuser命令也可以查看正在访问某个文件、设备的进程,只是fuser命令可以查看得到后直接杀死该进程,格式如下:
fuser -au /home ---查看正在访问指定设备、文件的进程
fuser -kau /home ---查找并直接杀死正在访问指定设备、文件的进程,-k 表示杀死
注:fuser同样需要事先安装psmisc软件包才可使用;带杀死功能的fuser应该慎用,只有当需要急切关闭某文件、或要卸载某设备时,总被报文件、设备正在被使用,查找多方用户无结果时,才会使用到。
13.10 系统日志管理
Linux中也会有记录日常运行信息、报警信息、提示信息等相关内容的日志文件,它们统一存放在 /var/log/目录下。不同文件存放不同类型的日志信息。
例如:
boot.log 是启动日志
lastlog 是上一次登录日志
message 是系统运行状态日志,记录日常运行中的一些报警信息。
关于各种系统日志,我们可以用less或cat查看,分析消息或报警信息。在这里,我们先暂时记录下该目录的位置,将来系统出现故障时可以通过分析这些日志,查找原因。本节暂不赘述。