前段时间公司网站出过两次事故,前台跑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只有理论上可行,而且可能成本过高,相对低成本的是增加容错和报警监控机制,但发现问题还是要及时修复并升级系统,这时候单元测试就很重要了。
分布式系统简单说就是一组服务器协同工作,主要目的在于均衡负载、均衡数据、冗余等,面对的主要难点在于数据同步、防止宕机造成连锁反应、减少服务器间通讯及依赖、处理任意一个节点缓慢造成任务堆积或失败等方面,还有一点就是不要信任网络,这是最不稳定的部分,即便是同一机房。最近几个月通过改善开发过程、规范单元测试、增加容错机制、消除单点增加冗余、完善监控系统、细化统计分析等方面来提高质量,效果还是明显的,但还有很多路要走。系统设计阶段着眼于大方向上,开发阶段小细节上也需要特别在意,比如日志,系统一旦上线这可能是最丰富稳定的信息源。
分享到:
相关推荐
Linux Web服务器集群是一种高效、可扩展的解决方案,用于处理高流量网站的需求,通过将工作负载分散到多个服务器,实现负载均衡,提高系统可用性和性能。本资料主要关注Linux环境下Web服务器集群的构建与管理,以及...
在设计分布式系统时,负载均衡是一个核心组件,负责将外部请求分发到后端的多个服务器实例上,确保资源的有效利用和避免单点故障。本篇文章将从以下几个方面详细阐述分布式系统架构设计的思路。 首先,负载均衡器是...
### Linux服务器集群系统中的LVS集群体系架构解析 #### 一、引言 随着互联网的飞速发展,网络服务的需求量急剧增加,这对服务器的性能和可靠性提出了更高的要求。为了解决这一问题,Linux服务器集群系统应运而生,...
Linux操作系统因其开源特性,具有高度的可定制性和灵活性,适合用于构建分布式系统。 其次,系统结合了MySQL数据库管理系统,用于存储和管理用户的账户信息、服务使用记录以及计费数据。MySQL以其高效、可靠和易于...
"高性能 Linux 服务器构建实战:系统安全、故障排查、自动化运维与集群架构" 本文档主要介绍了高性能 Linux 服务器的构建实战,涵盖了系统安全、故障排查、自动化运维与集群架构等方面的知识点。 一、高性能 Linux...
【双机Linux集群服务器的实现】是指在Linux操作系统环境下,通过特定的技术手段,构建两台服务器组成的集群系统,以提供高可用性和负载均衡的服务。这种技术尤其适用于对服务连续性和性能有较高要求,但预算有限的...
服务器节点则可以是运行Apache、Nginx或其他Web服务器软件的Linux服务器,这些服务器需要配置成能够共享session和会话状态,以确保用户会话的连续性。 此外,为了实现高可用性和容错性,集群还需要监控和故障转移...
分布式实例广泛应用于各种互联网服务,如Web服务器、数据库服务、消息队列等。例如,大型电商平台可能会使用分布式MySQL实例来处理高并发的数据库读写操作;内容分发网络(CDN)通过在全球各地部署分布式实例,确保...
负载均衡则是服务器集群中的关键组件,它的主要任务是根据预设策略将来自用户的请求分发到集群内的各个服务器上,确保没有单一服务器过载,提高响应速度和整体系统性能。常见的负载均衡技术包括硬件负载均衡器和软件...
Stable Diffusion WebUI通常是一个基于Web的界面,用于管理和监控分布式系统,如数据处理、流计算或者机器学习任务。在Linux上部署此Web应用程序涉及以下关键知识点: 1. **操作系统兼容性**: Linux是多平台操作...
在Linux环境下配置集群,例如构建一个结合了高可用性和负载均衡的WEB服务集群,需要四台安装有Redhat Enterprise Linux 5的服务器,两台作为WEB服务器(node1和node2),一台作为集群分配服务器(master),另一台...
1. **Linux基础**:Linux是一种开源操作系统,以其稳定性和灵活性著称,是搭建Web服务器的常用平台。理解Linux的基础操作,如文件系统、权限管理、进程控制、网络配置和shell脚本编写,是Web架构师的基本功。 2. **...
LVS分为应用级和IP级两种类型,应用级如Reverse-Proxy,适用于Apache等Web服务器,但随着内容服务器数量增加,可能增加网关的压力。而IP级负载均衡则能处理更多的服务器,并且可以实现更精细的负载均衡策略。 LVS的...
这个系统不仅可以应用于Web服务器,还可以应用于数据库服务器、邮件服务器等各种关键业务系统。 通过阅读"linux下的服务器双机热备份.docx"这份文档,你可以深入了解Linux双机热备份的原理、配置方法以及故障切换...
IP Redirect利用TCP/IP协议的重定向功能,适用于Web服务器,但不适用于其他类型的服务器。Smart Client将负载分配策略移到客户端,需要定制客户端系统,实现复杂。Active Network则需要主动网络的支持,目前还在实验...
VIP(Virtual IP)配置则是在多台服务器间提供一个共享的虚拟IP地址,当某台服务器故障时,VIP可以迅速切换到其他正常服务器,保持服务的连续性。 6. **转发规则**: LVS、Tengine和Varnish等工具提供了自定义转发...
2.2 **集中式与分布式**:集中式管理下的Web服务器一旦发生故障或遭遇攻击,会导致整个系统的不可用。而通过分布式的方案可以提高系统的稳定性和可用性,即使部分节点失效,也不会影响整体服务。 2.3 **安全性和...
Peercast是一个开源的分布式流媒体系统,它允许用户共享音频和视频流,无需中央服务器,而是通过P2P技术实现。这款软件尤其适合那些希望搭建自己的流媒体服务器,进行直播或点播服务的用户。在Linux操作系统上部署...