服务为何会崩溃

1.概述

最近看了一篇关于热key致使redis服务集群挂掉的文章, 很是的精彩致使我在想当流量很是大时为何redis服务会挂掉,因而我就找了大量的资料研究服务为何会挂掉及其原理,服务器为何会宕机等等就有了以下内容。java

其实服务崩溃总结起来无非就两种,一种是资源枯竭致使的服务崩溃,另外一种就是超时引发的服务崩溃。程序员


2.资源枯竭致使

先说第一种资源枯竭致使的服务崩溃,顾名思义就是由于服务器的资源或者分配的资源不能知足服务运行的须要从而引起服务崩溃。比较常见有内存溢出,磁盘满载,带宽不足等三种。redis

写java的程序员遇到最多的估计就是内存溢出了,好比操做系统给jvm分配了2G的物理内存供程序运行使用,可能有个程序头铁在一段代码中建立了循环引用的对象或者大量未能及时回收的对象,在请求量大时gc不能及时回收垃圾对象致使堆内存一直在增大超过了操做系统所分配的2G内存,此时就会触发操做系统的kill -9信号把程序杀死这样用户再请求服务时就无响应了。缓存

电商大促期间前有不少准备工做,其中有一项就是去运营商那里购买宽带,这是由于在大促期间有大量用户访问,若是机器带宽不足会致使服务崩溃,进而致使很是大损失。咱们以一台机器80M的宽带为例,通过计算能承受的最大下载速度就是10M/s, 拿单个用户的一个请求数据大小为10k为例,在1s内有1024个用户请求时须要80M的宽带机器恰好能知足要求,若是是1s内有2000用户请求时须要160M的流量那么处理完这2000个用户的请求须要2s,若是持续30s都有2000个用户来请求服务,那么就须要4800M的流量处理完须要600多s那么就会大量请求出现等待进而引起超时致使服务崩溃。服务器


3.超时致使

第二种超时引发的服务崩溃,就是大量用户请求服务时由于大面积链接超时致使服务崩溃,和宽带不足的例子很像,咱们以单台机器服务启动单进程为例,在一个进程中咱们一般会经过线程池去处理请求,咱们假设线程池中一共有1000个请求来处理请求且每一个请求的响应时间为100ms,当1s钟有10000个请求发来时咱们能够很快的处理并返回,当1s内有20000个请求发来时服务器要处理就须要2s钟的时间了,那么在一段持续时间20000请求来时就会积压大量的请求不能被处理致使超时,而后后面过来的请求确定超时,这样服务就崩溃了。jvm


4.总结

在真实的生产环境,崩溃的缘由可能会很是复杂且是多种因素互相做用的结果,但了解了服务奔溃的本质后就能很快找到对应的解决方案,如万能的增长机器,优化代码逻辑,加入缓存等等。完毕!优化

相关文章
相关标签/搜索