系统资源查看方法
系统配置查看
uname -a ---查看系统内核版本
cat /etc/redhat-release ---查看centos系统版本
cat /proc/cpuinfo ---查看CPU信息
lscpu ---查看cpu信息
free -h ---查看内存,total表示总量,used表示进程的占用量,buff/cache 缓冲区、缓存占有量
df -h ---查看磁盘
fdisk -l
lsblk
cd /proc/
ls
mount ---可见到/proc的挂载
注意 系统开机时,所有的硬件设备信息、状态,都记录在/proc/目录下 实质是在内存中的,
/proc 目录是在内存中开辟了一块空间,制作文件系统使用的,称为伪文件系统
cpu性能查看
sar 1 3 ---查看CPU使用率,1秒显示一次,共显示三次,重点显示6项信息
注意 注释
%user 用户进程占cpu的比例,可代表服务进程
%nice 被更改优先级的进程占CPU的比例
%system 系统进程占cpu的比例
%iowait 等待读写的进程占cpu的比例
%steal 被偷盗的CPU资源比例,被虚拟机占用的cpu资源,成为偷盗资源
%idle CPU空闲率
公式:%idle=100% - 其他五项
分析:
%user高,表示用户进程占用较高,说明是服务进程增多,应该是访问、业务量增长造成
%iowait高,表示读写压力较大,可能有磁盘故障
%system %user %iowait %idle
正常 <10% 30%+- <10% 60%+-
警告 50%+- 或 30%+- <40%
故障 70%+- 或 50%+- <20%
iostat ---查看读写速率
uptime ---查看CPU各核的平均负载(load average),显示的是:最近1min 5min 15min 时间内的平均负载
平均负载:cpu每个core上平均承载的线程数,
公式:当前要运行的线程数 / core 数 = 平均负载值
进阶解释:
cpu的工作原理:
1.一颗cpu内可以有多个处理芯片,称为核core。每个core若开启了cpu虚拟化技术(vtd),则一个core可以虚拟成两个core的工作状态,称为一核双线程,即可以同时运行两个任务
把cpu虚拟后的双线程也可以视为core。如:双核四线程的cpu,可视为是4core状态
cpu的每个core运行线程时,会把线程放入运行队列中,若队列中有多个线程待运行,则core就会给队列中的每个线程分配时间片,依次运行。
具体原理:
一个core会把要运行的多个线程,放入队列中,称为运行队列或就绪队列
core会从队列中提取出第一个线程,运行一个固定的时间,称为一个时间片。
时间片到期后,若该线程未能运行完毕,也要暂停,放入队列尾,
提取队列中第二个线程入core执行,同样运行一个时间片的时间后,放入队列尾,再提取下一个。
以此类推。
线程在运行过程中,若有读写需求,在读写完毕前是不会继续执行的,此线程将被暂停,放入等待队列。
以待条件满足后再转回运行队列。
在core中正在运行的线程,若当前有一个优先级更高的线程需要紧急运行,即便正在运行的线程的时间片未到也会被打断,放入队列尾,core转去运行高优先级的线程。若两个线程优先级对等,则放入队列首位。
平均负载值:正常 0.7-1 警告 1.2-1.5 压力略大 压力较大 >2
解决方案:说明单机上开启的业务、服务较多,需要做业务、服务转移
sar -q 1 2 ---查看CPU队列信息,会显示运行队列中的任务数,总进程数等
内存查看
free -h
sar -q 1 2
sar -r 1 3 ---查看内存使用率
sar -W 1 3 ---查看swap空间的读写速度
正常 警告 故障
内存 40%+- 70%+- 90%+-
swap 10%+- 30%+- 50%+-
进程基本管理
ps ---查看当前终端下的进程
ps -aux ---查看本机所有进程,显示11列信息
第一列 用户名,即该进程由哪个用户启用
第二列 PID,进程ID号,
第三列 占CPU的比例
第四列 占内存的比例
第五列 占swap空间的大小
第六列 占内存空间的大小
第十一列 进程名
ps -aux | grep httpd ---抓取所有web服务进程
ps -aux | grep httpd | wc -l ---统计进程数
ps -aux | sort -rn -k 3 | head -n 10 ---显示占CPU最高的前10个进程
ps -aux | sort -rn -k 3 | tail
Head 默认为前十个
Tail为后十个
ps -ef ---查看本机所有进程,可见到父进程ID,即PPID
pstree ---查看进程树,即完整的父子进程调用关系表
yum -y install psmisc--安装进程树的数据包
kill -9 PID ---杀死进程
killall -9 进程名 ---同时杀死多个同名进程
注:pstree 和 killall命令 要提前安装psmisc 软件包才可使用
总结分析
系统运行慢
1.查看对象:cpu、内存、进程
2.查cpu命令:sar
3.看空闲率 =>%user
%iowait=>若%user高,
业务相关=>查看内存高、业务进程数高
ps -aux | grep httpd=>考虑集群扩建
若cpu正常,查内存:高,查进程,看有无泄漏或僵尸
查看系统综合性能参数
top ---实时显示系统性能,3s刷新一次
与uptime命令的 第一行相同
第二行显示僵尸进程
C键 按占CPU比例排序显示进程
M键 按占内存比例排序显示进程
k键 杀死进程,点击后,输入PID
q键 退出
vmstat ---查看综合性能参数
vmstat 1 3
僵尸进程
一个进程,卡死在内存中,不执行,但也不退出
父子进程调用,一方异常关闭,造成另一个方无法正常完成,从而成为僵尸进程
查看僵尸进程
方式一:
ps -aux ---显示的第八列,进程状态列,显示有Z字母的,表示为僵尸进程
ps -aux | awk '$8 ~ /[Zz]/ {print $1,$2,$4,$8,$11}' ---抓取显示僵尸进程
方式二:
ps -ef | grep defunct ---抓取显示僵尸进程
说明: -ef 查看时,僵尸进程会在进程名后面加 <defunct> 标记
kill -9 PID 抓取到后杀死僵尸进程
内存故障
内存溢出
原因:在内存中开辟的空间,存入了超出最大值的数据;定义了一组变量,提取变量值时,超出了这一组的个数范围
现象:软件进程卡死,甚至造成死机
解决:多次观察软件卡死的位置,同一个位置或同一个操作都会发生卡死,即发现bug点,可能是由于溢出造成的 上报开发,调试bug
内存泄漏
原因:进程运行完毕,不释放内存,下次运行,占据新的内存,造成进程持续增长内存占有率。
现象:系统慢,CPU使用率正常,进程数、连接数正常,内存使用率虚高
确定:ps | sort 查看占内存最高的进程,查找占内存接近20%的进程,为怀疑对象
写脚本,每10min记录占内存最多的前10个进程,持续2-3个小时,然后查看记录日志,查看哪个进程每隔几次,内存占有量递增
解决:上报,反馈甲方,通知开发调试bug,申请卸载、降级,或者建立服务集群,轮流重启,直到开发部门解决完毕
内存抖动
原因:
由于物理内存空间不足,内存使用率较高,则暂停、挂起、等待进程会被转存入swap空间
进程从内存转入swap的过程,称为“换出”
等待进程条件满足,需要执行,则从swap中转回物理内存,该过程被称为“换入”
进程频繁的换入换出,称为抖动
现象:系统慢,内存使用率高70%+,swap空间使用率高30%+
解决:上报,可能是由于甲方新增软件或软件升级造成,申请卸载、降级;或者申请增加物理内存,扩容swap
僵尸进程
原因:父子进程调用,一方异常关闭,另一方无法正常完成,造成卡死状态
现象:内存使用率略高60%+,发现有进程长期占据内存,且占有量、占有率不变
解决:ps -ef | grep defunct 抓取后做记录,再杀死。若发现有软件经常会产生僵尸进程,应该反馈给开发
IPC进程间通信
原因:运行一个进程,将在内存中开辟一块空间,作为本进程的专用。进程和进程所占的内存空间之间不可以做数据传输的
进程之间也不可以相互访问对方的内存空间。所以说进程的内存空间是独占的
但是,程序再运行过程中,是有进程之间数据交互的需求的,所以使用IPC技术实现进程之间的数据传递
进程内的线程,是公用进程所占的内存空间,允许线程间相互访问,并动态调度、调整
方式:
管道 即 |
在内存中开辟一块临时空间,做管道使用,前进程把运行结果放入管道中,后进程从管道中获取数据,传递完毕后,管道撤销
功能:前进程的运行结果传递给后进程作为输入使用
特点:仅传递结果数据;只能传递一次,数据只能被读取一次
如:ll /etc/ | less
共享内存
功能:进程运行过程中的数据传输给其他进程
在内存中开辟一块空间,前进程把数据存入该空间,后进程从空间中读取,存入的数据允许被多次读取使用
共享内存的空间也是长期存在的,直到两个进程都运行结束才撤销
通过调用系统提供的API(应用接口,即函数)完成内存空间的申请和数据存取。
信号sign
功能:一个进程控制另一个进程的状态,靠信号
原理:一个进程给另一个进程增加一个状态信号,CPU根据信号的值,对进程做出相应的处理
命令:
kill -l ---查看所有的可用信号值
kill -9 PID ---杀死进程
kill -3 PID ---退出运行,会携带内存数据返回,
一般开发人员使用 -3信号,获取进程运行数据,调试bug
kill -19 PID ---停止挂起,相当于 ctrl+z
kill -18 PID ---继续运行,相当于 fg、bg
消息队列
功能:用于记录进程的运行状态
原理:当多个进程要同时访问同一个文件或设备时,尤其是在要同时做写操作时,会产生排他性。
即不允许多个进程对同一文件或设备同时做写操作,就会产生写操作的排队。后进程必须等前进程写操作完毕,才能写入
前进程会把自己的状态记录到消息队列中,后进程通过消息队列发现前进程执行完毕,即可开始写操作
socket套接字
功能:网络主机之间的进程传输、访问,用socket套接字
组成:ip+port
原理:一台主机上的进程通过对方主机上的ip和port,识别、寻址到对方主机上的进程
系统配置查看
uname -a ---查看系统内核版本
cat /etc/redhat-release ---查看centos系统版本
cat /proc/cpuinfo ---查看CPU信息
lscpu ---查看cpu信息
free -h ---查看内存,total表示总量,used表示进程的占用量,buff/cache 缓冲区、缓存占有量
df -h ---查看磁盘
fdisk -l
lsblk
cd /proc/
ls
mount ---可见到/proc的挂载
注意 系统开机时,所有的硬件设备信息、状态,都记录在/proc/目录下 实质是在内存中的,
/proc 目录是在内存中开辟了一块空间,制作文件系统使用的,称为伪文件系统
cpu性能查看
sar 1 3 ---查看CPU使用率,1秒显示一次,共显示三次,重点显示6项信息
注意 注释
%user 用户进程占cpu的比例,可代表服务进程
%nice 被更改优先级的进程占CPU的比例
%system 系统进程占cpu的比例
%iowait 等待读写的进程占cpu的比例
%steal 被偷盗的CPU资源比例,被虚拟机占用的cpu资源,成为偷盗资源
%idle CPU空闲率
公式:%idle=100% - 其他五项
分析:
%user高,表示用户进程占用较高,说明是服务进程增多,应该是访问、业务量增长造成
%iowait高,表示读写压力较大,可能有磁盘故障
%system %user %iowait %idle
正常 <10% 30%+- <10% 60%+-
警告 50%+- 或 30%+- <40%
故障 70%+- 或 50%+- <20%
iostat ---查看读写速率
uptime ---查看CPU各核的平均负载(load average),显示的是:最近1min 5min 15min 时间内的平均负载
平均负载:cpu每个core上平均承载的线程数,
公式:当前要运行的线程数 / core 数 = 平均负载值
进阶解释:
cpu的工作原理:
1.一颗cpu内可以有多个处理芯片,称为核core。每个core若开启了cpu虚拟化技术(vtd),则一个core可以虚拟成两个core的工作状态,称为一核双线程,即可以同时运行两个任务
把cpu虚拟后的双线程也可以视为core。如:双核四线程的cpu,可视为是4core状态
cpu的每个core运行线程时,会把线程放入运行队列中,若队列中有多个线程待运行,则core就会给队列中的每个线程分配时间片,依次运行。
具体原理:
一个core会把要运行的多个线程,放入队列中,称为运行队列或就绪队列
core会从队列中提取出第一个线程,运行一个固定的时间,称为一个时间片。
时间片到期后,若该线程未能运行完毕,也要暂停,放入队列尾,
提取队列中第二个线程入core执行,同样运行一个时间片的时间后,放入队列尾,再提取下一个。
以此类推。
线程在运行过程中,若有读写需求,在读写完毕前是不会继续执行的,此线程将被暂停,放入等待队列。
以待条件满足后再转回运行队列。
在core中正在运行的线程,若当前有一个优先级更高的线程需要紧急运行,即便正在运行的线程的时间片未到也会被打断,放入队列尾,core转去运行高优先级的线程。若两个线程优先级对等,则放入队列首位。
平均负载值:正常 0.7-1 警告 1.2-1.5 压力略大 压力较大 >2
解决方案:说明单机上开启的业务、服务较多,需要做业务、服务转移
sar -q 1 2 ---查看CPU队列信息,会显示运行队列中的任务数,总进程数等
内存查看
free -h
sar -q 1 2
sar -r 1 3 ---查看内存使用率
sar -W 1 3 ---查看swap空间的读写速度
正常 警告 故障
内存 40%+- 70%+- 90%+-
swap 10%+- 30%+- 50%+-
进程基本管理
ps ---查看当前终端下的进程
ps -aux ---查看本机所有进程,显示11列信息
第一列 用户名,即该进程由哪个用户启用
第二列 PID,进程ID号,
第三列 占CPU的比例
第四列 占内存的比例
第五列 占swap空间的大小
第六列 占内存空间的大小
第十一列 进程名
ps -aux | grep httpd ---抓取所有web服务进程
ps -aux | grep httpd | wc -l ---统计进程数
ps -aux | sort -rn -k 3 | head -n 10 ---显示占CPU最高的前10个进程
ps -aux | sort -rn -k 3 | tail
Head 默认为前十个
Tail为后十个
ps -ef ---查看本机所有进程,可见到父进程ID,即PPID
pstree ---查看进程树,即完整的父子进程调用关系表
yum -y install psmisc--安装进程树的数据包
kill -9 PID ---杀死进程
killall -9 进程名 ---同时杀死多个同名进程
注:pstree 和 killall命令 要提前安装psmisc 软件包才可使用
总结分析
系统运行慢
1.查看对象:cpu、内存、进程
2.查cpu命令:sar
3.看空闲率 =>%user
%iowait=>若%user高,
业务相关=>查看内存高、业务进程数高
ps -aux | grep httpd=>考虑集群扩建
若cpu正常,查内存:高,查进程,看有无泄漏或僵尸
查看系统综合性能参数
top ---实时显示系统性能,3s刷新一次
与uptime命令的 第一行相同
第二行显示僵尸进程
C键 按占CPU比例排序显示进程
M键 按占内存比例排序显示进程
k键 杀死进程,点击后,输入PID
q键 退出
vmstat ---查看综合性能参数
vmstat 1 3
僵尸进程
一个进程,卡死在内存中,不执行,但也不退出
父子进程调用,一方异常关闭,造成另一个方无法正常完成,从而成为僵尸进程
查看僵尸进程
方式一:
ps -aux ---显示的第八列,进程状态列,显示有Z字母的,表示为僵尸进程
ps -aux | awk '$8 ~ /[Zz]/ {print $1,$2,$4,$8,$11}' ---抓取显示僵尸进程
方式二:
ps -ef | grep defunct ---抓取显示僵尸进程
说明: -ef 查看时,僵尸进程会在进程名后面加 <defunct> 标记
kill -9 PID 抓取到后杀死僵尸进程
内存故障
内存溢出
原因:在内存中开辟的空间,存入了超出最大值的数据;定义了一组变量,提取变量值时,超出了这一组的个数范围
现象:软件进程卡死,甚至造成死机
解决:多次观察软件卡死的位置,同一个位置或同一个操作都会发生卡死,即发现bug点,可能是由于溢出造成的 上报开发,调试bug
内存泄漏
原因:进程运行完毕,不释放内存,下次运行,占据新的内存,造成进程持续增长内存占有率。
现象:系统慢,CPU使用率正常,进程数、连接数正常,内存使用率虚高
确定:ps | sort 查看占内存最高的进程,查找占内存接近20%的进程,为怀疑对象
写脚本,每10min记录占内存最多的前10个进程,持续2-3个小时,然后查看记录日志,查看哪个进程每隔几次,内存占有量递增
解决:上报,反馈甲方,通知开发调试bug,申请卸载、降级,或者建立服务集群,轮流重启,直到开发部门解决完毕
内存抖动
原因:
由于物理内存空间不足,内存使用率较高,则暂停、挂起、等待进程会被转存入swap空间
进程从内存转入swap的过程,称为“换出”
等待进程条件满足,需要执行,则从swap中转回物理内存,该过程被称为“换入”
进程频繁的换入换出,称为抖动
现象:系统慢,内存使用率高70%+,swap空间使用率高30%+
解决:上报,可能是由于甲方新增软件或软件升级造成,申请卸载、降级;或者申请增加物理内存,扩容swap
僵尸进程
原因:父子进程调用,一方异常关闭,另一方无法正常完成,造成卡死状态
现象:内存使用率略高60%+,发现有进程长期占据内存,且占有量、占有率不变
解决:ps -ef | grep defunct 抓取后做记录,再杀死。若发现有软件经常会产生僵尸进程,应该反馈给开发
IPC进程间通信
原因:运行一个进程,将在内存中开辟一块空间,作为本进程的专用。进程和进程所占的内存空间之间不可以做数据传输的
进程之间也不可以相互访问对方的内存空间。所以说进程的内存空间是独占的
但是,程序再运行过程中,是有进程之间数据交互的需求的,所以使用IPC技术实现进程之间的数据传递
进程内的线程,是公用进程所占的内存空间,允许线程间相互访问,并动态调度、调整
方式:
管道 即 |
在内存中开辟一块临时空间,做管道使用,前进程把运行结果放入管道中,后进程从管道中获取数据,传递完毕后,管道撤销
功能:前进程的运行结果传递给后进程作为输入使用
特点:仅传递结果数据;只能传递一次,数据只能被读取一次
如:ll /etc/ | less
共享内存
功能:进程运行过程中的数据传输给其他进程
在内存中开辟一块空间,前进程把数据存入该空间,后进程从空间中读取,存入的数据允许被多次读取使用
共享内存的空间也是长期存在的,直到两个进程都运行结束才撤销
通过调用系统提供的API(应用接口,即函数)完成内存空间的申请和数据存取。
信号sign
功能:一个进程控制另一个进程的状态,靠信号
原理:一个进程给另一个进程增加一个状态信号,CPU根据信号的值,对进程做出相应的处理
命令:
kill -l ---查看所有的可用信号值
kill -9 PID ---杀死进程
kill -3 PID ---退出运行,会携带内存数据返回,
一般开发人员使用 -3信号,获取进程运行数据,调试bug
kill -19 PID ---停止挂起,相当于 ctrl+z
kill -18 PID ---继续运行,相当于 fg、bg
消息队列
功能:用于记录进程的运行状态
原理:当多个进程要同时访问同一个文件或设备时,尤其是在要同时做写操作时,会产生排他性。
即不允许多个进程对同一文件或设备同时做写操作,就会产生写操作的排队。后进程必须等前进程写操作完毕,才能写入
前进程会把自己的状态记录到消息队列中,后进程通过消息队列发现前进程执行完毕,即可开始写操作
socket套接字
功能:网络主机之间的进程传输、访问,用socket套接字
组成:ip+port
原理:一台主机上的进程通过对方主机上的ip和port,识别、寻址到对方主机上的进程