`
qiezi
  • 浏览: 491383 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

linux WEB服务器故障两则,兼谈分布式系统

阅读更多
前段时间公司网站出过两次事故,前台跑PHP的Apache进程大量死锁,造成服务器无负载但不能提供服务,不断重启服务也未能解决问题,但过几小时后自动恢复。这些系统已经稳定运行数月之久,虽然不断有升级但没有出现这类情况。

一周后第二次出现相同情况时公司组织人力进行了排查,没有发现问题。由于没有WEB机器登录权限,于是让运维同事做了这些操作来查找原因:

1、strace -p xxxx查看任意httpd进程,查看进程运行状态。如果没有阻塞在futex上,换一个进程再查看。
这一步一般可以查出很多原因,比如死循环,如果strace没有显示一个系统调用正在进行,一般是限入无终结条件的死循环,这种情况一般伴随着高CPU占用。如果不断有系统调用,就更方便找出死循环的原因了,当然一般也是逻辑错误。
经过查看,大部分进程阻塞在futex上。记下futex死锁的文件描述符,比如是10。

2、lsof -p xxxx查看进程打开的文件描述符,找到10对应的资源。结果是这是一个session文件,于是可以推断是session锁导致服务进程挂死。
记下这个session文件路径,比如是/tmp/abcdefg。

3、lsof /tmp/abcdefg,查看所有打开这个文件的进程ID。

4、strace -p xxxx对第三步找出的进程ID进行分析,一般会发现有一个进程没有阻塞在futex上,记下这个进程ID,比如1111,并记下当前阻塞的操作,通常也是个文件描述符,比如是11。或者这个进程也处于死循环,注意观察一下就能发现。

5、lsof -p 1111查看这个进程,查找11这个文件描述符对应的资源,有可能是个socket连接或者其它,总之这里一般可以找到真正原因了。

公司的服务器经过排查,原因在于某一时刻网络质量下降,连接到远端另一个socket服务器的主动关闭的包丢失,甚至多次重传也没有成功,所以远端已经无法看到这个连接,但该WEB服务器上却显示ESTABLISHED,PHP代码一直接收socket数据直到断开,自然是无法返回了。很多时候由于安全问题没有办法拿到服务器权限,如何通过简单的办法找出问题就很重要了。

另一个例子是PHP上传程序,由于使用了分布式存储,数据是通过socket发送到存储服务器上。PHP程序使用stream_set_timeout来设置超时,但某次事故后分析发现它只影响read,对write没有作用,于是改为socket_send,用setsockopt设置超时。

这种情况应该会经常发生,只是大部分时候网络状况没有问题,也就不想写一些复杂代码处理这种异常情况,或者很多时候认为这只是小事故,不过对于大型网站来说一般是计算影响了多少人、多少时间、造成多少功能无法使用来确定事故等级的。


事故无大小,应该从事故中吸取经验避免再次发生。公司每周都有超过10个运行事故,我到公司后共造成3个事故,当然主要是刚接管时旧系统架构问题或者库的稳定性造成的,但也有代码BUG造成的。BUG只能减少,要做到完全没有BUG只有理论上可行,而且可能成本过高,相对低成本的是增加容错和报警监控机制,但发现问题还是要及时修复并升级系统,这时候单元测试就很重要了。

分布式系统简单说就是一组服务器协同工作,主要目的在于均衡负载、均衡数据、冗余等,面对的主要难点在于数据同步、防止宕机造成连锁反应、减少服务器间通讯及依赖、处理任意一个节点缓慢造成任务堆积或失败等方面,还有一点就是不要信任网络,这是最不稳定的部分,即便是同一机房。最近几个月通过改善开发过程、规范单元测试、增加容错机制、消除单点增加冗余、完善监控系统、细化统计分析等方面来提高质量,效果还是明显的,但还有很多路要走。系统设计阶段着眼于大方向上,开发阶段小细节上也需要特别在意,比如日志,系统一旦上线这可能是最丰富稳定的信息源。
13
5
分享到:
评论
1 楼 hexstar 2009-06-17  
以前只知道strace lsof最简单的用法,没想到这两个命令还能用,受教了! :)

相关推荐

    集群好书《高性能Linux服务器构建实战》 试读章节下载

    2.3.3 Varnish对应多台Web服务器的配置实例 2.4 运行Varnish 2.4.1 varnishd指令 2.4.2 配置Varnish运行脚本 2.4.3 管理Varnish运行日志 2.5 管理Varnish 2.5.1 查看Varnish进程 2.5.2 查看Varnish...

    Fourinone分布式并行计算四合一框架

    我们仅仅是想写个程序把几台甚至更多的机器一起用起来计算,把更多的cpu和内存利用上,来解决我们数量大和计算复杂的问题,当然这个过程中要考虑到分布式的协同和故障处理。如果仅仅是为了实现这个简单的初衷,为...

    Linux环境数据库管理员指南

    第1章 Linux操作系统 1 1.1 Linux的简要历史介绍 1 1.2 Linux核心 2 1.2.1 Linux的开发特点 2 1.2.2 Linux分发包 3 1.2.3 为什么要为商业Linux 版本付费 3 1.3 Linux与其他操作系统之间的差异 3 1.3.1 功能丰富 3 ...

    RED HAT LINUX 6大全

    本书全面系统地介绍了Red Hat Linux 6。全书共分为五个部分,包括35章和四个附录。第一部分为Red Hat Linux的介绍和安装;第二部分为服务配置;第三部分为系统管理;第四部分为Linux编程;第五部分为附录。本书内容...

    Eclipse开发分布式商城系统+完整视频代码及文档

    │ 11-集群的故障转移.avi │ 12-MySQL的查询优化.avi │ 13-数据库结构优化.avi │ 14-插入数据的优化.avi │ 15-服务器优化.avi │ 16-tomcat的3种运行模式和执行器(线程池).avi │ 17-tomcat中连接器.avi │ 18...

    智能调度平台系统技术要求.pdf

    Web服务器支持MS IIS, NES, Apache等。 2.4数据库管理系统须具备良好的数据和索引的压缩技术,具有 较低的空间膨胀率;在系统硬件资源允许的条件下(如服务 器内存不小于2G),对超大型数据库及结构化/非结构化复杂...

    SpringBoot+MybatisPlus 分布式项目谷粒商城.zip

    此外,MySQL支持多种操作系统,包括Windows、Linux、macOS、Solaris等,确保了其在不同环境下的兼容性和部署灵活性。 关系型模型与SQL支持 MySQL基于关系型数据库模型,数据以表格形式组织,并通过预定义的键(如...

    Zabbix v3.4.5.zip

    Zabbix是一个基于WEB界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案。 Zabbix能监视各种网络参数,保证服务器系统的安全运营;并提供柔软的通知机制以让系统管理员快速定位/解决存在的各种问题。...

    book_sleha

    SUSE Linux Enterprise High Availability Extension 还配备群集感知文件系统 和卷管理器:Oracle 群集文件系统 (OCFS2) 和群集逻辑卷管理器 (cL VM)。 对于数据复制,请使用 DRBD*(分布式复制块设备)将 High ...

    OSEICQ即时通讯软件(开源例子)

    不参与客户之间的信息交换(类似BT),服务器可以为分布式集群,如果数据库为SQL SERVER 2000以上版本可以使用故障转移(负载均衡)大大增强服务端的并发和负载,服务端用户登录数并发为1秒300。 服务器负载说明: ...

    fourinone-3.04.25

    我们仅仅是想写个程序把几台甚至更多的机器一起用起来计算,把更多的cpu和内存利用上,来解决我们数量大和计算复杂的问题,当然这个过程中要考虑到分布式的协同和故障处理。如果仅仅是为了实现这个简单的初衷,为...

    JMeter操作手册大全.docx

    一个应用系统1s能完成多少事务处理,一个事务在分布式处理中,可能会对应多个请求,对于衡量单个接口服务的处理能力,用QPS比较多。 1.1.2.标准 无论TPS、QPS、HPS,此指标是衡量系统处理能力非常重要的指标,越大越...

    2017最新老男孩MySQL高级专业DBA实战课程全套【清晰不加密】,看完教程月入40万没毛病

    31-MySQL数据库多实例的其他故障问题说明.avi 第三部:MySQL应用管理及进阶实战操作(29节) 01-MySQL启动与关闭深入知识及原理.avi 02-登录MySQL知识深入讲解.avi 03-学会使用MySQL数据库的帮助.avi 04-修改mysql...

    代码之美(中文完整版).pdf

    主要讲述了计算机系统的开发领域。在每章中的漂亮代码都是来自独特解决方案的发现,而这种发现是来源于作者超越既定边界的远见卓识,并且识别出被多数人忽视的需求以及找出令人叹为观止的问题解决方案。 本书介绍了...

Global site tag (gtag.js) - Google Analytics