Esper 20章 优化

20 优化
esper为了处理高速的生成力已经高度优化,并且接收事件和输出结果低延迟。
esper还可以进一步最大化可测使用在 软实时和硬实时JVM 上。

本章描述了最好的优化练习,而且解释了怎么去评价esper优化 通过使用我们提供的优化工具

20.1 优化结果
为了进一步理解以下测试结果,请查询下一章

测试结果说明:
eseper在一个双核2GH Ineter硬件,处理速度超过 500000 event/s,并且引擎延迟平均低于3微秒(超过99%的测试低于10us(微秒))
在一个平均加权基准点在1000个的查询注册在系统中
这达到70Mbit/s 85%的Cpu使用
esper还示范了线性的扩展性从100000到5000000 event/s 在这个硬件上,并且各个不同的生命查询始终如一的产生结果

其他测试示范具有相同的执行结果(始终连续的处理,match all,match none,没有声明注册,时间窗口或者长度窗口计算VWAP)

在笔记本电脑上的测试大概有5倍的性能降低-70000到200000 event/s ,在这个情况下还可以进行简单的测试和小配置

20.2 优化技巧
20.2.1 理解怎么去优化你的java虚拟机
esper运行在jvm上,你需要熟悉JVM调优。可以考虑的关键参数包括:最大堆内存、最小堆内存、年轻代堆大小。
在时间窗口和长度窗口上的声明可能会消耗大量的内存,因为他们的大小或者长度可能会很大。

对于时间数据窗口,你需要意识到内存消耗取决于实际的进入事件流。
事件模式event pattern实例也消耗内存,尤其在事件模式使用‘every‘关键字 去重复使用子表达式模式 也取决于实际的事件流。

20.2.2 输入输出瓶颈
你的应用从esper语句接收输出事件通过 UpdateListener接口 或者通过强类型描述订阅POJO对象.
这样的事件输出被发送通过应用或者 定时线程发送一个输入事件 到引擎实例。

输出事件处理:你的监听者或者订阅者的执行会暂时的阻塞线程直到处理完成,可能因此降低吞吐量。
它可以受益 对于你的应用去异步的执行输出事件 并且不阻塞Esper引擎,同时输出事件被你的监听者处理,特别是当你的监听者代码执行阻塞IO

举例来说:你的应用程序可能想发送输出事件到JMS目的地或者写入输出事件数据到关系型数据库。
为了最佳的吞吐量,考虑在一个单独的线程中执行这一的阻塞操作。

此外,在性能测试中,当从一个存储器或者网络读取输入事件,你可能发现Esper处理事件比输入事件到Esper更快。
在这种情况下,你可能要考虑使用一个内存驱动程序 进行性能测试。
也可以考虑 从事件处理方法解耦读取操作(sendEvent method)通过多个readers或者 从存储器预处理数据

21.2.3. Theading 穿线
我们推荐使用多线程给Esper发送事件。我们提供了一个测试类。
为了避免冲突, 这个测试类没有使用阻塞队列和线程池。
多线程测试代码如下:

public class SampleClassThreading {

    public static void main(String[] args) throws InterruptedException {

        int numEvents = 1000000;
        int numThreads = 3;

        Configuration config = new Configuration();
        config.getEngineDefaults().getThreading()
          .setListenerDispatchPreserveOrder(false);
        config.getEngineDefaults().getThreading()
          .setInternalTimerEnabled(false);   // remove thread that handles time advancing
        EPServiceProvider engine = EPServiceProviderManager
          .getDefaultProvider(config);
        engine.getEPAdministrator().getConfiguration().addEventType(MyEvent.class);

        engine.getEPAdministrator().createEPL(
          "create context MyContext coalesce by consistent_hash_crc32(id) " +
          "from MyEvent granularity 64 preallocate");
        String epl = "context MyContext select count(*) from MyEvent group by id";
        EPStatement stmt = engine.getEPAdministrator().createEPL(epl);
        stmt.setSubscriber(new MySubscriber());

        Thread[] threads = new Thread[numThreads];
        CountDownLatch latch = new CountDownLatch(numThreads);

        int eventsPerThreads = numEvents / numThreads;
        for (int i = 0; i < numThreads; i++) {
            threads[i] = new Thread(
              new MyRunnable(latch, eventsPerThreads, engine.getEPRuntime()));
        }
        long startTime = System.currentTimeMillis();
        for (int i = 0; i < numThreads; i++) {
            threads[i].start();
        }

        latch.await(10, TimeUnit.MINUTES);
        if (latch.getCount() > 0) {
            throw new RuntimeException("Failed to complete in 10 minute");
        }
        long delta = System.currentTimeMillis() - startTime;
        System.out.println("Took " + delta + " millis");
    }

    public static class MySubscriber {
        public void update(Object[] args) {
        }
    }

    public static class MyRunnable implements Runnable {
        private final CountDownLatch latch;
        private final int numEvents;
        private final EPRuntime runtime;

        public MyRunnable(CountDownLatch latch, int numEvents, EPRuntime runtime) {
            this.latch = latch;
            this.numEvents = numEvents;
            this.runtime = runtime;
        }

        public void run() {
            Random r = new Random();
            for (int i = 0; i < numEvents; i++) {
                runtime.sendEvent(new MyEvent(r.nextInt(512)));
            }
            latch.countDown();
        }
    }

    public static class MyEvent {
        private final int id;

        public MyEvent(int id) {
            this.id = id;
        }

        public int getId() {
            return id;
        }
    }
}
时间: 2024-10-19 06:41:49

Esper 20章 优化的相关文章

Lua_第 20 章 IO库

第 20 章 IO库 I/O  库为文件操作提供两种模式.简单模式(simple  model)拥有一个当前输入文件和一个当前输出文件,并且提供针对这些文件相关的操作.完全模式(complete  model) 使用外部的文件句柄来实现.它以一种面对对象的形式,将所有的文件操作定义为文件句柄的方法.简单模式在做一些简单的文件操作时较为合适.在本书的前面部分我们一直都在使用它.但是在进行一些高级的文件操作的时候,简单模式就显得力不从心.例 如同时读取多个文件这样的操作,使用完全模式则较为合适.I/

第20章 keras中“开箱即用”CNNs

第20章 keras中"开箱即用"CNNs 到目前为止,我们学习了如何从头开始训练CNNs.这些CNNs大多数工作在浅层(以及较小数据集上),以至于它们可以很容易的在CPU上训练,而不需要在更贵的GPU上,这使得我们能够掌握神经网络和深度学习的基础. 但是由于我们只在浅层网络上工作,我们无法利用深度学习带给我们的全分类能力.幸运的是,keras库预置了5种在ImageNet数据集上预训练的CNNs: l  VGG16 l  VGG19 l  ResNet50 l  Inception

4.20日第13次作业.,20章战略管理,21章业务流程管理和重组,22章知识管理,高项,29-田哲琦

4.20日第13次作业.,20章战略管理,21章业务流程管理和重组,22章知识管理,高项,29-田哲琦 20章.战略管理1.企业战略的特点有哪些?P420-421 答:1).全局性 2).长远性 3).抗争性 4).纲领性 2.企业战略决策的特点有哪些?P421答:1).决策的对象是复杂的,很难把握住它的结构,并且是没有先例的,对其处理上也是没有经验可循. 2).面对的问题常常是突发性的.难以预料的.所依靠的是来自外部的关于未来如何变化的很少的情报. 3).决策的性质直接涉及到企业的前途. 4)

第20章 priority_queue优先队列容器

/* 第20章 priority_queue优先队列容器 20.1 priority_queue技术原理 20.2 priority_queue应用基础 20.3 本章小结 */ // 第20章 priority_queue优先队列容器 // 20.1 priority_queue技术原理 // 20.2 priority_queue应用基础 -----------------------------------------------------------------------------

敏捷软件开发:原则、模式与实践——第20章 咖啡的启示

第20章 咖啡的启示 这个例子对于教学有很多好处.它短小.易于理解并且展示了如何应用面向对象设计原则去管理依赖和分类关注点.但从另一方面来说,它的短小也意味着这种分离带来的好处可能抵不过其成本.就当做一个设计思路来看吧. 20.1 Mark IV型专用咖啡机20.1.1 规格说明书 Mark IV型专用咖啡机一次可以产出12杯咖啡.使用者把过滤器放置在支架上,在其中装入研磨好的咖啡,然后把支架推入其容器中.接着,使用者向滤水器中倒入12杯水并按下冲煮(Brew)按钮.水一直加热到沸腾.不断产生的

设计模式之第20章-访问者模式(Java实现)

设计模式之第20章-访问者模式(Java实现) “嘿,你脸好红啊.”“精神焕发.”“怎么又黄了?”“怕冷,涂的,涂的,蜡.”“身上还有酒味,露馅了吧,原来是喝酒喝的啊.”“嘿嘿,让,让你发现了,今天来几个朋友,然后就小聚一下,小饮,几杯啦.”“小日子过得不错嘛.”“那是自然,要不然,再去喝两杯.”“别介,我还有要事要做呢,鱼哥你别坑我.”“什么,什么要紧事,能比的上,喝酒啊”.“走,陪我,陪我喝两杯去.”(作者已被拉走.)访问者登场. 访问者模式之自我介绍 累的死俺的杰特们(ladies and

鸟哥的linux私房菜——第20章 启动流程、模块管理与loader

20.1 Linux启动流程分析 Linux启动过程: 按下开机电源后计算机硬件主动读取BIOS来加载硬件信息以及硬件系统的自我测试,之后系统会主动读取第一个可启动的设备(由BIOS设置),此时就可以读入引导加载程序(boot loader)了,引导加载程序指定使用那个内核文件来启动,并实际加载内核到内存中解压缩与执行,此时内核就能够在内存中活动,并检测所有硬件信息与加载适当的驱动程序来使主机运行,等内核检测硬件与加载驱动程序完毕后,就可以登录了. 1)加载BIOS的硬件信息与进行自我测试,并依

java注解演示 映射生成表 示例 来自thinking in java 4 20章部分代码

java注解演示 映射生成表 示例  来自thinking in java 4 20章部分代码 package org.rui.annotation.database; import java.lang.annotation.*; /** * 生成一个数据库表 * @author lenovo * */ @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) public @interface DBTable { public

第20章 状态模式(State Pattern)

原文 第20章 状态模式(State Pattern) 状态模式  概述:   当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类. 状态模式主要解决的是当控制一个对象状态的条件表达式过于复杂时的情况.把状态的判断逻辑转移到表示不同状态的一系列类中,可以把复杂的判断逻辑简化. 意图:   允许一个对象在其内部状态改变时改变它的行为 结构图:                 举例:                      在日常生活中最为熟悉的点灯开关,按一下开灯,在按一下关