前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >第十八章 系统常见问题&IPC

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

作者头像
晓天
发布2019-07-04 14:22:31
7160
发布2019-07-04 14:22:31
举报

第十八章 系统常见问题&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会启动起系统内的服务进程。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-04-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 教主小筑 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
消息队列 CMQ 版
消息队列 CMQ 版(TDMQ for CMQ,简称 TDMQ CMQ 版)是一款分布式高可用的消息队列服务,它能够提供可靠的,基于消息的异步通信机制,能够将分布式部署的不同应用(或同一应用的不同组件)中的信息传递,存储在可靠有效的 CMQ 队列中,防止消息丢失。TDMQ CMQ 版支持多进程同时读写,收发互不干扰,无需各应用或组件始终处于运行状态。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档