一、优化机制
通常而言,当实现了反向压力功能时,整个流计算应用的处理速度,就会受限于 DAG 中最慢的那个节点,并且 DAG 上各个节点的处理速度,最终都会趋近于同一个值,也就是最慢那个节点的处理速度。
二、优化工具
监控工具
- Metrics,用于在程序的一些关键逻辑处安装性能监控点,比如 Gauge 仪表盘、Counter 计数器、Meter 累加计数器、Histogram 直方图、Timer 计时器等。
- Zabbix 或者 Prometheus + Grafana,最主要是通过观察各种资源的使用情况,定位出程序压力高峰、资源使用效率、内存是否泄漏等一系列性能相关的问题。
JConsole 或者JVisualVM,主要是观察 JVM 运行时的状况,比如垃圾回收、线程状态、函数调用时间等,都能一目了然地观察到。
压测工具
JMeter,主要是用于 HTTP 请求压力测试。
- Kafka,可以充分发挥它的消息重放功能,快速给流计算系统生成压力数据。
三、优化方法
线程状态
光有工具还是不够的,最终能否优化好程序,最主要还是需要我们对程序运行时状况能够透彻理解。除了对业务流程本身的理解之外,最重要的就是对“线程状态”的理解!
根据线程状态优化程序性能
而如果是处于 Waiting、Timed Waiting 或 Blocked 状态,则说明程序可能存在以下问题。
(一是)工作量不饱和。 比如从输入队列拉取消息过慢,或者也可能是输入本身很少,但是在性能测试和优化时,本应该让系统处于压力饱和状态。
(二是)内耗严重。 比如锁使用不合理、synchronized 保护范围过大,导致竞态时间过长、并发性能低下。
(三是)资源分配不足。 比如分配给某个队列的消费者线程过少,导致队列的生产者长时间处于等待状态。
(四是)处理能力不足。 比如某个队列的消费者处理过慢,也会导致队列的生产者长时间处于等待状态。