• timeout超时时长优化和hystrix dashboard可视化分布式系统


    在生产环境中部署一个短路器,一开始需要将一些关键配置设置的大一些,比如timeout超时时长,线程池大小,或信号量容量

    然后逐渐优化这些配置,直到在一个生产系统中运作良好

    (1)一开始先不要设置timeout超时时长,默认就是1000ms,也就是1s
    (2)一开始也不要设置线程池大小,默认就是10
    (3)直接部署hystrix到生产环境,如果运行的很良好,那么就让它这样运行好了
    (4)让hystrix应用,24小时运行在生产环境中
    (5)依赖标准的监控和报警机制来捕获到系统的异常运行情况
    (6)在24小时之后,看一下调用延迟的占比,以及流量,来计算出让短路器生效的最小的配置数字
    (7)直接对hystrix配置进行热修改,然后继续在hystrix dashboard上监控
    (8)看看修改配置后的系统表现有没有改善

    根据系统表现优化和调整线程池大小,队列大小,信号量容量,以及timeout超时时间的经验

    一开始如果默认的线程池大小是10
    理想情况下,每秒的高峰访问次数 * 99%的访问延时 + buffer = 30 * 0.2 + 4 = 10线程,10个线程每秒处理30次访问应该足够了,每个线程处理3次访问

    此时,我们合理的timeout设置应该为300ms,也就是99.5%的访问延时,计算方法是,因为判断每次访问延时最多在250ms(TP99如果是200ms的话),再加一次重试时间50ms,就是300ms,感觉也应该足够了

    因为如果timeout设置的太多了,比如400ms,比如如果实际上,在高峰期,还有网络情况较差的时候,可能每次调用要耗费350ms,也就是达到了最长的访问时长

    那么每个线程处理2个请求,就会执行700ms,然后处理第三个请求的时候,就超过1秒钟了,此时会导致线程池全部被占满,都在处理请求

    这个时候下一秒的30个请求再进来了,那么就会导致线程池已满,拒绝请求的情况,就会调用fallback降级机制

    因此对于短路器来说,timeout超时一般应该设置成TP99.5,比如设置成300ms,那么可以确保说,10个线程,每个线程处理3个访问,每个访问最多就允许执行300ms,过时就timeout了

    这样才能保证说每个线程都在1s内执行完,才不会导致线程池被占满,然后后续的请求过来大量的reject

    对于线程池大小来说,一般应该控制在10个左右,20个以内,最少5个,不要太多,也不要太少

    刚开始的时候,每个依赖服务都是给1个线程,3个线程,但是我们允许说,如果你的某个线程池突然需要大量的线程,最多可以到100个线程

    如果你使用了100个线程,高峰期过去了,自动将空闲的线程给释放掉

    (1)coreSize

    设置线程池的大小,默认是10

    HystrixThreadPoolProperties.Setter()
    .withCoreSize(int value)

    (2)maximumSize

    设置线程池的最大大小,只有在设置allowMaximumSizeToDivergeFromCoreSize的时候才能生效

    默认是10

    HystrixThreadPoolProperties.Setter()
    .withMaximumSize(int value)

    (5)keepAliveTimeMinutes

    设置保持存活的时间,单位是分钟,默认是1

    如果设置allowMaximumSizeToDivergeFromCoreSize为true,那么coreSize就不等于maxSize,此时线程池大小是可以动态调整的,可以获取新的线程,也可以释放一些线程

    如果coreSize < maxSize,那么这个参数就设置了一个线程多长时间空闲之后,就会被释放掉

    HystrixThreadPoolProperties.Setter()
    .withKeepAliveTimeMinutes(int value)

    (6)allowMaximumSizeToDivergeFromCoreSize

    允许线程池大小自动动态调整,设置为true之后,maxSize就生效了,此时如果一开始是coreSize个线程,随着并发量上来,那么就会自动获取新的线程,但是如果线程在keepAliveTimeMinutes内空闲,就会被自动释放掉

    默认是fales

    HystrixThreadPoolProperties.Setter()
    .withAllowMaximumSizeToDivergeFromCoreSize(boolean value)


    1、为什么需要监控与报警?

    HystrixCommand执行的时候,会生成一些执行耗时等方面的统计信息。这些信息对于系统的运维来说,是很有帮助的,因为我们通过这些统计信息可以看到整个系统是怎么运行的。hystrix对每个command key都会提供一份metric,而且是秒级统计粒度的。

    这些统计信息,无论是单独看,还是聚合起来看,都是很有用的。如果将一个请求中的多个command的统计信息拿出来单独查看,包括耗时的统计,对debug系统是很有帮助的。聚合起来的metric对于系统层面的行为来说,是很有帮助的,很适合做报警或者报表。hystrix dashboard就很适合。

    2、hystrix的事件类型

    对于hystrix command来说,只会返回一个值,execute只有一个event type,fallback也只有一个event type,那么返回一个SUCCESS就代表着命令执行的结束

    对于hystrix observable command来说,多个值可能被返回,所以emit event代表一个value被返回,success代表成功,failure代表异常

    (1)execute event type

    EMIT observable command返回一个value
    SUCCESS 完成执行,并且没有报错
    FAILURE 执行时抛出了一个异常,会触发fallback
    TIMEOUT 开始执行了,但是在指定时间内没有完成执行,会触发fallback
    BAD_REQUEST 执行的时候抛出了一个HystrixBadRequestException
    SHORT_CIRCUITED 短路器打开了,触发fallback
    THREAD_POOL_REJECTED 线程成的容量满了,被reject,触发fallback
    SEMAPHORE_REJECTED 信号量的容量满了,被reject,触发fallback

    (2)fallback event type

    FALLBACK_EMIT observable command,fallback value被返回了
    FALLBACK_SUCCESS fallback逻辑执行没有报错
    FALLBACK_FAILURE fallback逻辑抛出了异常,会报错
    FALLBACK_REJECTION fallback的信号量容量满了,fallback不执行,报错
    FALLBACK_MISSING fallback没有实现,会报错

    (3)其他的event type

    EXCEPTION_THROWN command生命自周期是否抛出了异常
    RESPONSE_FROM_CACHE command是否在cache中查找到了结果
    COLLAPSED command是否是一个合并batch中的一个

    (4)thread pool event type

    EXECUTED 线程池有空间,允许command去执行了
    REJECTED 线程池没有空间,不允许command执行,reject掉了

    (5)collapser event type

    BATCH_EXECUTED collapser合并了一个batch,并且执行了其中的command
    ADDED_TO_BATCH command加入了一个collapser batch
    RESPONSE_FROM_CACHE 没有加入batch,而是直接取了request cache中的数据

    3、metric storage

    metric被生成之后,就会按照一段时间来存储,存储了一段时间的数据才会推送到其他系统中,比如hystrix dashboard

    另外一种方式,就是每次生成metric就实时推送metric流到其他地方,但是这样的话,会给系统带来很大的压力

    hystrix的方式是将metric写入一个内存中的数据结构中,在一段时间之后就可以查询到

    hystrix 1.5x之后,采取的是为每个command key都生成一个start event和completion event流,而且可以订阅这个流。每个thread pool key也是一样的,包括每个collapser key也是一样的。

    每个command的event是发送给一个线程安全的RxJava中的rx.Subject,因为是线程安全的,所以不需要进行线程同步

    因此每个command级别的,threadpool级别的,每个collapser级别的,event都会发送到对应的RxJava的rx.Subject对象中。这些rx.Subject对象接着就会被暴露出Observable接口,可以被订阅。

    5、metric统计相关的配置

    (1)metrics.rollingStats.timeInMilliseconds

    设置统计的rolling window,单位是毫秒,hystrix只会维持这段时间内的metric供短路器统计使用

    这个属性是不允许热修改的,默认值是10000,就是10秒钟

    HystrixCommandProperties.Setter()
    .withMetricsRollingStatisticalWindowInMilliseconds(int value)

    (2)metrics.rollingStats.numBuckets

    该属性设置每个滑动窗口被拆分成多少个bucket,而且滑动窗口对这个参数必须可以整除,同样不允许热修改

    默认值是10,也就是说,每秒钟是一个bucket

    随着时间的滚动,比如又过了一秒钟,那么最久的一秒钟的bucket就会被丢弃,然后新的一秒的bucket会被创建

    HystrixCommandProperties.Setter()
    .withMetricsRollingStatisticalWindowBuckets(int value)

    (3)metrics.rollingPercentile.enabled

    控制是否追踪请求耗时,以及通过百分比方式来统计,默认是true

    HystrixCommandProperties.Setter()
    .withMetricsRollingPercentileEnabled(boolean value)

    (4)metrics.rollingPercentile.timeInMilliseconds

    设置rolling window被持久化保存的时间,这样才能计算一些请求耗时的百分比,默认是60000,60s,不允许热修改

    相当于是一个大的rolling window,专门用于计算请求执行耗时的百分比

    HystrixCommandProperties.Setter()
    .withMetricsRollingPercentileWindowInMilliseconds(int value)

    (5)metrics.rollingPercentile.numBuckets

    设置rolling percentile window被拆分成的bucket数量,上面那个参数除以这个参数必须能够整除,不允许热修改

    默认值是6,也就是每10s被拆分成一个bucket

    HystrixCommandProperties.Setter()
    .withMetricsRollingPercentileWindowBuckets(int value)

    (6)metrics.rollingPercentile.bucketSize

    设置每个bucket的请求执行次数被保存的最大数量,如果再一个bucket内,执行次数超过了这个值,那么就会重新覆盖从bucket的开始再写

    举例来说,如果bucket size设置为100,而且每个bucket代表一个10秒钟的窗口,但是在这个bucket内发生了500次请求执行,那么这个bucket内仅仅会保留100次执行

    如果调大这个参数,就会提升需要耗费的内存,来存储相关的统计值,不允许热修改

    默认值是100

    HystrixCommandProperties.Setter()
    .withMetricsRollingPercentileBucketSize(int value)

    (7)metrics.healthSnapshot.intervalInMilliseconds

    控制成功和失败的百分比计算,与影响短路器之间的等待时间,默认值是500毫秒

    HystrixCommandProperties.Setter()
    .withMetricsHealthSnapshotIntervalInMilliseconds(int value)

    1、安装metrics stream

    <dependency>
        <groupId>com.netflix.hystrix</groupId>
        <artifactId>hystrix-metrics-event-stream</artifactId>
        <version>1.4.10</version>
    </dependency>
    

      

    @Bean
    public ServletRegistrationBean indexServletRegistration() {
        ServletRegistrationBean registration = new ServletRegistrationBean(new HystrixMetricsStreamServlet());
        registration.addUrlMappings("/hystrix.stream");
        return registration;
    }
    

      

    2、安装gradle

    类似于maven,一种java里面的打包和构建的工具,hystrix是用gradle去管理打包和构建的

    配置环境变量,GRADLE_HOME
    配置PATH,%GRADLE_HOME%/bin

    gradle -v

    3、下载tomcat7

    解压缩

    4、下载hystrix-dashboard的war包

    cp hystrix-dashboard-*.war apache-tomcat-7.*/webapps/hystrix-dashboard.war

    5、下载turbin

    下载并解压缩

    cp turbine-web/build/libs/turbine-web-*.war ./apache-tomcat-7.*/webapps/turbine.war

    在/WEB-INF/classes下放置配置文件

    config.properties

    turbine.ConfigPropertyBasedDiscovery.default.instances=localhost
    turbine.instanceUrlSuffix=:8081/hystrix.stream

    turbin是用来监控一个集群的,可以将一个集群的所有机器都配置在这里

    6、启动我们的服务

    7、启动tomcat中的hystrix dashboard和turbin

    localhost:8080/hystrix-dashboard

    http://localhost:8081/hystrix.stream,监控单个机器
    http://localhost:8080/turbine/turbine.stream,监控整个集群

    8、发送几个请求,看看效果

    9、hystrix dashboard

    hystrix的dashboard可以支持实时监控metric

    netflix开始用这个dashboard的时候,大幅度优化了工程运维的操作,帮助节约了恢复系统的时间。大多数生产系统的故障持续时间变得很短,而且影响幅度小了很多,主要是因为hystrix dashborad提供了可视化的监控。

    5、下载turbin

    下载并解压缩

    cp turbine-web/build/libs/turbine-web-*.war ./apache-tomcat-7.*/webapps/turbine.war

    在/WEB-INF/classes下放置配置文件

    config.properties

    turbine.ConfigPropertyBasedDiscovery.default.instances=localhost
    turbine.instanceUrlSuffix=:8081/hystrix.stream

    turbin是用来监控一个集群的,可以将一个集群的所有机器都配置在这里

    6、启动我们的服务

    7、启动tomcat中的hystrix dashboard和turbin

    localhost:8080/hystrix-dashboard

    http://localhost:8081/hystrix.stream,监控单个机器
    http://localhost:8080/turbine/turbine.stream,监控整个集群

    8、发送几个请求,看看效果

    9、hystrix dashboard

    hystrix的dashboard可以支持实时监控metric

    netflix开始用这个dashboard的时候,大幅度优化了工程运维的操作,帮助节约了恢复系统的时间。大多数生产系统的故障持续时间变得很短,而且影响幅度小了很多,主要是因为hystrix dashborad提供了可视化的监控。

  • 相关阅读:
    Java多态(更新中...)
    C语言free释放内存后为什么指针里的值不变?竟然还可以输出?
    LeetCode:344-反转字符串
    20150518 字符设备驱动
    20150517 Linux文件系统与设备文件系统
    20150514我读《深入理解linux内核》之虚拟文件系统笔记
    双系统Ubuntu下修复启动项的两种方法
    20150503 imx257下实现I2C驱动的四种方法
    20150502 调试分析之 使用gdb远程调试ARM开发板
    20150501 调试分析之 修改内核来定位系统僵死问题
  • 原文地址:https://www.cnblogs.com/sunliyuan/p/11587126.html
Copyright © 2020-2023  润新知