第十八章 系统常见问题&IPC

第十八章 系统常见问题&IPC

18.1 内存常见问题(故障)

在系统运行过程中,由于各种服务、应用、进程等长时间的运行,势必会产生各种问题,这些问题很反馈在内存的特性中,下面就来看一下几个最常见的内存故障及其解决方案。

18.1.1 内存溢出

所谓内存溢出,就是进程在内存中开辟的空间,存入的数据超过了空间所能存放的最大值,如:2B的内存空间,即16bit二进制,第一位二进制表示正负数,表示数据的有15bit二进制数字,那么有效数值范围是 -32768到32767 。当给该块内存空间存入一个超过这个数值范围的数据时,则会出现溢出现象。这种情况一般会出现在循环中,有变量自增加,循环次数过多或死循环时数值就容易超出范围。

另外还有一种情况也会发生内存溢出现象:假设定义了一组数据,提取时指定的编号,超过了这组数据的个数。如10元素数组,编号范围 0-9,提取第10、11号时发生溢出。

发生溢出时的现象:程序突然卡死,不再有任何反应,尤其是每运行到某个点时都会卡死,则说明发生溢出的概率较高。溢出属于编程中的bug。

解决方式:上报相关人员,通知开发部门修复bug。

18.1.2 内存泄露

内存泄露产生的原因:一个进程运行时会占据一块内存空间,进程结束后不释放内存,该进程下次启动,再次占据新的内存空间。进程频繁的启动、停止,造成该进程占据内存空间越来越大。一般在软件中某个功能会有频繁的启动关闭的程序,容易出现泄漏,如:超市的结算区的结算程序,每位顾客都会扫会员卡后扫码结算一次,下一位顾客又重复该操作,那么若有内存泄露现象发生,会对服务器造成较大的内存浪费。

发生泄露后的现象:系统运行变慢,查看CPU正常、进程数、连接数基本正常,只有内存使用率虚高

查找、解决方法:

ps -aux | sort -rn -k 4 | head -n 10

此命令目的是查看占内存最高的前10个进程,查找有无进程占内存20%上下,则此进程为疑似泄露进程。为了确定是否泄露,可以再写一个脚本,每10分钟运行一次,记录该进程占内存的比例、大小,持续2-3个小时,之后分析日志,看该进程是否每隔几次,占内存就会增长一些,若是,则确定为泄露进程无疑。

那么,即可上报相关人员,由上级人员,联系甲方或软件开发方,得到授权后,要么卸载,要么降级(一般项目中新装或升级软件后可能出现泄露现象)。

18.1.3 内存抖动

发生内存抖动的原因:当物理内存使用率高,有大量进程需要运行时,系统将会把内存中暂停的、暂时不运行的进程,转存入swap空间,称为换出。

当swap空间中的进程,需要运行,则会从swap中转回到物理内存中,称为换入。

当大量进程出现频繁的换入换出,称为内存抖动

发生抖动后的现象:系统运行变慢,free命令查看到内存使用率(60%+)、swap使用率(30%+-)均高。

解决方式:上报,申请增加物理内存,或者,将本机的某个业务转移到其他不忙的主机上。

18.1.4 僵尸进程

关于僵尸进程,我们之前已经介绍过了,是由于父子进程的调用,一方异常关闭,造成另一个无法正常结束,卡顿在内存中,不运行,也不退出造成的。

若系统中有僵尸进程,则呈现的现象是:CPU、连接数正常,内存略高

解决僵尸进程,无非是将其查找出来,杀死进程,可以使用如下命令查看:

top ---查看到僵尸进程数

ps -ef | grep defunct ---抓取僵尸进程

多次ps -aux ,也可以看到该进程占内存比例、大小不变。

使用kill -9 杀死僵尸进程即可。

18.2 CPU监控发现故障

在系统资源管理那一章中,我们曾经介绍过用sar命令查看CPU使用率时几个参数的报警阈值,本节只是再次总结一下而已。

18.2.1 业务上涨

原因:访问量增加

现象:系统运行速度慢,查看发现cpu、内存、进程数、连接数都高,sar查看时,可见%user高达50%+-。

tips:可使用如下命令查看本机某服务的连接数

netstat -nt | grep80 | wc -l

其中80代表80端口,即查看本机web服务的连接数,也就是本机的网站正在被多少人同时访问。

netstat -nt 命令功能是显示本机所有正在通信的tcp连接,其中–n表示显示正在通信的连接,-t表示显示tcp通信的连接

解决:上报,分析发展趋势,若会持续增加,则要么增加服务主机,分流业务;要么限制连接数,做排队等待。

18.2.2 读写故障

原因:由于网络连接、磁盘读写、存储连接出现故障,造成大量进程处于等待读写状态

现象:系统运行速度慢,查看发现cpu的%iowait高,说明有读写问题

解决:iostat 查看每个磁盘的读写速度,对比之前的历史记录,查找读写速度下降明显的磁盘,暂定为疑似故障盘。再查看该盘上划分的文件系统(即分区或LV),若其是正在被某进程、某服务(如数据库)使用的磁盘,那么可确定为故障盘。

那么,需要立即上报,联系存储人员,数据转移后更换磁盘(LVM中的用pvmove,分区用dd)。

18.3 系统检测小结

当一台计算机运行速度慢时,我们的检测思路是从CPU、内存、服务进程入手,查看各个参数,分析可疑项,来查找故障原因。大体判断如下:

查看CPU、内存、服务的进程数

若都高了,说明业务访问上涨造成的,证明:cpu的%user高,服务进程数多,网络连接数多

若CPU的%iowait高,则去查读写

若cpu、进程数、连接数正常,内存虚高:可能是内存泄露或内存抖动。

18.4 IPC进程间通信

首先我们来介绍下什么是进程间通信。进程间通信,简称IPC,功能是一个进程给另一个进程传递数据。那为什么要有IPC呢?这就要从进程对内存空间的占用讲起了。

因为,在操作系统上,进程的运行会占据一块内存空间。该空间是这个进程自己独占的、不允许其他进程访问的(PS:同一进程内的线程,是公用进程的内存空间的,且允许相互传递、查看、访问数据)。那么,如果两个进程之间需要传递一些数据时该如何处理呢?这就需要IPC的帮助了。

IPC一般来讲常用的有以下五种方式:

1、管道

管道即 | ,之前讲过,它前后有两个命令,即两个进程,可实现前进程的运行结果,传递给后进程使用。即可视为实现的是进程运行结果的传递。

管道工作原理:在内存中开辟一块第三方的管道空间,前进程把结果存入该空间,后进程从该空间读取数据。该块空间,采用先进先出(FIFO)的方式,即先进入的数据先被度去除,若存入时按顺序进入多个数据,读出时也按该顺序陆续读出。再者,被后进程读出的数据,将从管道的内存空间中删除,不可再读

2、共享内存

共享内存能实现的功能是:传递进程运行过程中产生的数据。

工作原理:在内存中开辟一块第三方的空间,称为共享空间,前进程运行过程中可以随时向里面存入数据,后进程也可以随时从该空间中读取数据,且可以挑选读取,读取后也不会删除,支持重复读取。

前进程在运行时,若有数据要给其他进程,则会主动开辟共享内存空间,所以共享内存空间是由前进程开辟的。

开辟空间时,其实是前进程调用了操作系统对外提供的一个函数,实现内存空间开辟。类函数被称为API 接口函数

3、信号 sign

信号的功能我们在之前的进程管理中已经讲过,就是:通过对进程增加一个信号标记,让CPU根据该信号,对进程作出相应的处理,以实现进程运行状态的控制。如:关闭、挂起等

kill -l ---查看CPU支持的所有信号

常用信号: kill -9 PID ---杀死

kill -19 PID ---停止挂起,相当于 ctrl+z

kill -18 PID ---继续运行,相当于 fg、bg

一般进程的信号会由人为输入命令来设定,即手动操作;另外,Linux系统也会根据需要给进程增加信号

4、消息队列

消息队列的功能是:进程之间相互通知运行、访问状态的队列

它的应用需求是:当多个进程同时访问同一个文件、设备时,尤其都要进行写操作时,就产生了写冲突或访问冲突。如:使用打印机同时打印多个文件时,一定是一个文件完全打印完毕,后一个文件才会开始打印,则说明在一个打印进程执行时,其他打印进程是处于等待状态的。

所以可以认为,后访问的进程只能等前进程运行完毕后才可访问文件或设备。而前进程会把自己对文件、设备的访问状态记录到消息队列中。后进程可通过消息队列获取前进程的访问状态,已确定其是否访问完毕。

5、小结

以上四种IPC的方式,可总结到主要都是实现本机内进程间通信使用的,而且通过这四种方式,基本可以满足进程间数据传递的各种需求。但是,若是跨主机间的进程通信呢?则需要使用下面的socket方式实现了。

6、socket套接字

socket的功能:实现主机之间进程的通信,即通过网络实现两台主机上进程的连接、访问

实现形式: 使用ip+port的方式 ,识别、寻址主机及主机内的进程

原理介绍:socket套接字,相当于一个守护进程,监控主机的某个端口,当端口被客户端访问时,socket会启动起系统内的服务进程。

原文发布于微信公众号 - 教主小筑(gh_e0879483602d)

原文发表时间:2019-04-30

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券