热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

祸害阿里云宕机3小时的IOHANG究竟是个什么鬼?!

作者|王知无责编|郭芮程序员转行学什么语言?https:edu.csdn.nettopicai30?utm_sourcecsdn_bw2019年3月3日凌晨

 

640?wx_fmt=gif

640?wx_fmt=jpeg

作者 | 王知无

责编 | 郭   芮


程序员转行学什么语言?

https://edu.csdn.net/topic/ai30?utm_source=csdn_bw


 

2019年3月3日凌晨,微博炸锅,有网友反映说阿里云疑似出现宕机,华北很多互联网公司受到暴击伤害,APP、网站全部瘫痪,我自己的朋友圈和微信群里也有好友反馈,刚刚从被窝被叫起来去修Bug,结果发现服务器登不上去了......

 

凌晨2点37分,阿里云官方回应称:华北2地域可用区C部分ECS服务器等实例出现IO HANG,经紧急排查处理后逐步恢复,此外将根据协议尽快赔偿。并已经全面排查其他地域及可用区,未发现此类情况。 

 

 

640?wx_fmt=png

IO HANG

 

 

那么问题来了,IO HANG是个什么鬼?简单的说,就是服务器磁盘读写过慢,导致线程和进程挂起。大量读写线程/进程挂起导致服务器宕机......

 

阿里云有大量的类似RDS、HybridDB数据库,支持海量数据在线事务(OLTP)和在线分析(OLAP),需要大量的IO读写,而Linux的IO性能将直接影响SQL的执行速度,严重情况下将导致服务器卡死和宕机。

 

如何监控自己服务器的IO情况呢?本文将带大家详细了解这些常用的命令。

 

 

640?wx_fmt=png

如何监控自己服务器的IO情况?

 

 

常用的命令包括:top,iostat和iotop。那么他们都有什么区别,以及如何使用呢?我们一一分解。

 

我本机安装的是CentOS-7的虚拟机,内核信息为:

 

640?wx_fmt=png

 

top命令

 

top命令提供了实时的对系统处理器的状态监视。它将显示系统中CPU最"敏感"的任务列表,该命令可以按CPU使用、内存使用和执行时间对任务进行排序,而且该命令的很多特性都可以通过交互式命令。 

 

在Linux下,输入`top` :

 

640?wx_fmt=jpeg

 

Tasks、Cpus、Mem和Swap分别代表了进程信息、CPU信息和内存信息。 各个列表示的指标意义如下 :

 

PID     进程id
USER    进程所有者用户名
PR      优先级
NI      nice值
VIRT    进程使用的虚拟内存总量
RES     进程使用的未被换出的物理内存大小
SHR     共享内存大小
S      进程状态 S=睡眠 T=跟踪  R=运行  Z=僵尸进程 D=不可中断的睡眠进程
CPU     cpu时间统计
MEM     物理内存占比
TIME+   进程使用的CPU时间总计 单位1/100
COMMAND 命令行命令名

 

top常用的交互式命令使用格式:

 


top [-] [d] [p] [q] [c] [C] [S] [s] [n]


 

参数说明:

 


d:指定每两次屏幕信息刷新之间的时间间隔,当然用户可以使用s交互命令来改变之;

p:通过指定监控进程ID来仅仅监控某个进程的状态;

q:该选项将使top没有任何延迟的进行刷新。如果调用程序有超级用户权限,那么top将以尽可能高的优先级运行;

S:指定累计模式;

s:使top命令在安全模式中运行,这将去除交互命令所带来的潜在危险;

i:使top不显示任何闲置或者僵死进程;

c:显示整个命令行而不只是显示命令名。


 

通过top命令,我们即可查到当前服务器的进程占用CPU和内存情况。

 

iostat命令

 

iostat主要用于监控系统设备的IO负载情况,iostat首次运行时显示自系统启动开始的各项统计信息,之后运行iostat将显示自上次运行该命令以后的统计信息。用户可以通过指定统计的次数和时间来获得所需的统计信息。 

 

基本使用:

 


$iostat -d -k 2


 

参数说明:

 


-d:显示设备(磁盘)使用状态;

-k:某些使用block为单位的列强制使用Kilobytes为单位;

2:数据显示每隔2秒刷新一次。 


 

640?wx_fmt=jpeg

 

如果提示没有iostat命令需要使用yum安装,安装命令如下:

 


`yum install sysstat` 


 

参数解释如下:

 


tps:该设备每秒的传输次数,一次传输意思是“一次I/O请求”,多个逻辑请求可能会被合并为“一次I/O请求”;

kB_read/s:每秒从设备(drive expressed)读取的数据量;kB_wrtn/s:每秒向设备(drive expressed)写入的数据量;

kB_read:读取的总数据量;

kB_wrtn:写入的总数量数据量,这些单位都为Kilobytes。


 

上面的例子中,我们可以看到磁盘sda以及它的各个分区的统计数据,当时瞬时统计的磁盘总TPS是1.88,下面是各个分区的TPS(因为是瞬间值,所以总TPS并不严格等于各个分区TPS的总和)。

 

在实际业务中,我们经常使用的命令是:

 


iostat -xdm


 

例如:iostat -xdm 2,2代表2秒钟刷新一次。 

 

640?wx_fmt=jpeg

 

我们可以看到,%util这个参数即代表磁盘繁忙程度。100%表示磁盘繁忙, 0%表示磁盘空闲。但是我们需要注意,磁盘繁忙程度并不意味着磁盘读写速度大小。

 

iostat是系统级别的监控指令,iostat给我们的展示结果揭示了我们当前服务器磁盘的繁忙程度,虽然有一定的指导意义,但是不能精确到进程级别,这时候我们就需要iotop了。 

 

iotop命令

 

我们上文讲到top命令,顾名思义,iotop代表io版本的top命令,使用起来简单粗暴,直接在命令行敲下:iotop。

 

640?wx_fmt=jpeg

 

iotop命令可以按进程统计IO状况,我们可以指导当前系统哪些进程在占用IO,百分比是多少,占用IO的进程是在读,还是在写,读写量是多少等信息。然后我们可以定位到具体的进程,查看进程详情。

 

同样个iotop命令有一个很像的命令叫做pidstat,参数很多。

 

例如:`pidstat -d` : 

640?wx_fmt=jpeg

 

我们同样可以看到每个进程的读写情况,然后定位到具体的线程去查看问题。

 

 

640?wx_fmt=png

总结

 

 

在生产实践中,实时监控我们的服务器IO情况至关重要,尤其是数据库所在的服务器,它直接关系到我们的程序的读写速度、SQL的执行情况等。

 

服务器IO的情况是我们选择服务器的重要考虑因素之一。IO变差,轻则写入服务读写响应缓慢,重则导致大量进程长时间挂起,数据库拥堵卡死,服务器严重卡顿,甚至宕机。

 


作者:王知无,阿里巴巴高级大数据开发工程师,先后在京东,阿里等大型互联网公司从事大数据平台、实时计算和离线计算中间件和业务平台开发。自媒体人,业余讲师,希望为更多的互联网开发人员提供最新和最热的大数据方向的技术动态,技术前沿研究。

声明:本文为作者投稿,版权归其个人所有。


 

640?wx_fmt=jpeg

 

 


如何挑战百万年薪的人工智能!

https://edu.csdn.net/topic/ai30?utm_source=csdn_bw


 

热 文 推 荐

☞ 聊天宝解散罗永浩退出;三大运营商回应提速降费;天猫 iPhone XS 最高降 2000 | 极客头条

腾讯的“半条命”究竟给了谁? | 畅言

为什么我们需要数据预处理?

☞ 女神节该送程序媛什么礼物?保命指南来了!| 程序员有话说

☞ 小学生手写 Python 程序解魔方!这是高手,这绝对是高手!

小团队的微服务之路

首发 | 旷视14篇CVPR 2019论文,都有哪些亮点?

两会第一天, 大佬们关于区块链的探讨, 你要了解的都在这了

☞ 神操作!这段代码让程序员躺赚200万?给力!

print_r('点个好看吧!');
var_dump('点个好看吧!');
NSLog(@"点个好看吧!");
System.out.println("点个好看吧!");
console.log("点个好看吧!");
print("点个好看吧!");
printf("点个好看吧!\n");
cout << "点个好看吧&#xff01;" << endl;
Console.WriteLine("点个好看吧&#xff01;");
fmt.Println("点个好看吧&#xff01;");
Response.Write("点个好看吧&#xff01;");
alert("点个好看吧&#xff01;")
echo "点个好看吧&#xff01;"

640?wx_fmt&#61;gif点击阅读原文&#xff0c;输入关键词&#xff0c;即可搜索您想要的 CSDN 文章。

640?wx_fmt&#61;png喜欢就点击“好看”吧&#xff01;


推荐阅读
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 本文详细介绍了云服务器API接口的概念和作用,以及如何使用API接口管理云上资源和开发应用程序。通过创建实例API、调整实例配置API、关闭实例API和退还实例API等功能,可以实现云服务器的创建、配置修改和销毁等操作。对于想要学习云服务器API接口的人来说,本文提供了详细的入门指南和使用方法。如果想进一步了解相关知识或阅读更多相关文章,请关注编程笔记行业资讯频道。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • CentOS 7部署KVM虚拟化环境之一架构介绍
    本文介绍了CentOS 7部署KVM虚拟化环境的架构,详细解释了虚拟化技术的概念和原理,包括全虚拟化和半虚拟化。同时介绍了虚拟机的概念和虚拟化软件的作用。 ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • Centos7.6安装Gitlab教程及注意事项
    本文介绍了在Centos7.6系统下安装Gitlab的详细教程,并提供了一些注意事项。教程包括查看系统版本、安装必要的软件包、配置防火墙等步骤。同时,还强调了使用阿里云服务器时的特殊配置需求,以及建议至少4GB的可用RAM来运行GitLab。 ... [详细]
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • MyBatis错题分析解析及注意事项
    本文对MyBatis的错题进行了分析和解析,同时介绍了使用MyBatis时需要注意的一些事项,如resultMap的使用、SqlSession和SqlSessionFactory的获取方式、动态SQL中的else元素和when元素的使用、resource属性和url属性的配置方式、typeAliases的使用方法等。同时还指出了在属性名与查询字段名不一致时需要使用resultMap进行结果映射,而不能使用resultType。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • Tomcat/Jetty为何选择扩展线程池而不是使用JDK原生线程池?
    本文探讨了Tomcat和Jetty选择扩展线程池而不是使用JDK原生线程池的原因。通过比较IO密集型任务和CPU密集型任务的特点,解释了为何Tomcat和Jetty需要扩展线程池来提高并发度和任务处理速度。同时,介绍了JDK原生线程池的工作流程。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • ALTERTABLE通过更改、添加、除去列和约束,或者通过启用或禁用约束和触发器来更改表的定义。语法ALTERTABLEtable{[ALTERCOLUMNcolu ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
author-avatar
密歇根的闪闪
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有