标签: low-latency

访问各种缓存和主内存的近似成本?

任何人都可以给我大概的时间(以纳秒为单位)来访问L1,L2和L3缓存,以及Intel i7处理器上的主内存吗?

虽然这不是一个特别的编程问题,但是对于某些低延迟编程挑战而言,了解这些速度细节是必要的.

memory latency low-latency cpu-cache

167
推荐指数
5
解决办法
8万
查看次数

为什么返回Java对象引用比返回原语要慢得多

我们正在开发一个对延迟敏感的应用程序,并已对所有类型的方法进行微基准测试(使用jmh).在对查找方法进行微基准测试并对结果感到满意之后,我实现了最终版本,但却发现最终版本比我刚刚基准测试的版本3倍.

罪魁祸首是实现的方法返回一个enum对象而不是一个int.以下是基准代码的简化版本:

@OutputTimeUnit(TimeUnit.MICROSECONDS)
@State(Scope.Thread)
public class ReturnEnumObjectVersusPrimitiveBenchmark {

    enum Category {
        CATEGORY1,
        CATEGORY2,
    }

    @Param( {"3", "2", "1" })
    String value;

    int param;

    @Setup
    public void setUp() {
        param = Integer.parseInt(value);
    }

    @Benchmark
    public int benchmarkReturnOrdinal() {
        if (param < 2) {
            return Category.CATEGORY1.ordinal();
        }
        return Category.CATEGORY2.ordinal();        
    }


    @Benchmark
    public Category benchmarkReturnReference() {
        if (param < 2) {
            return Category.CATEGORY1;
        }
        return Category.CATEGORY2;      
    }


    public static void main(String[] …
Run Code Online (Sandbox Code Playgroud)

java low-latency jmh

73
推荐指数
2
解决办法
5327
查看次数

Node.js,Socket.io,Redis pub/sub高容量,低延迟的困难

当连接socket.io/node.js和redis pub/sub以尝试创建由可处理多个传输的服务器事件驱动的实时Web广播系统时,似乎有三种方法:

  1. 'createClient'是一个redis连接并订阅了频道.在socket.io客户端连接上,将客户端加入socket.io会议室.在redis.on("message",...)事件中,调用io.sockets.in(room).emit("event",data)以分发给相关房间中的所有客户端.喜欢如何在socket.io中重用redis连接?

  2. 'createClient'是一个redis连接.在socket.io客户端连接上,将客户端加入socket.io会议室并订阅相关的redis频道.在客户端连接闭包内和收到消息调用client.emit("event",data)时包含redis.on("message",...)以在特定客户端上引发事件.就像在socket.io中使用RedisStore的示例中的答案一样

  3. 使用RedisStore烘焙到socket.io和'广播'从Redis中的单个"调度"通道遵循socketio-spec协议.

Number 1允许为所有客户端处理一次Redis子和相关事件.Number 2为Redis pub/sub提供了更直接的钩子.3号更简单,但几乎无法控制消息传递事件.

但是,在我的测试中,所有连接的客户端都表现出意外的低性能.有问题的服务器事件是尽快发布到redis频道的1,000条消息,以便尽快分发.性能是通过连接客户端的时间来衡量的(socket.io-client基于该日志时间戳到Redis列表中进行分析).

我猜测在选项1中,服务器接收消息,然后顺序将其写入所有连接的客户端.在选项2中,服务器多次接收每个消息(每个客户端订阅一次)并将其写入相关客户端.在任何一种情况下,服务器都不会进入第二个消息事件,直到它被传递给所有连接的客户端.随着并发性的上升,情况显然更加恶化.

这似乎与堆栈功能的感知智慧不一致.我想相信,但我在苦苦挣扎.

这种情况(大量消息的低延迟分布)是不是这些工具的选项(但是?),还是我错过了一个技巧?

publish-subscribe redis low-latency node.js socket.io

65
推荐指数
1
解决办法
3万
查看次数

今天最先进的HFT交易系统有多快?

你一直听说高频交易(HFT)以及算法的速度有多快.但我想知道 - 这几天有多快?

更新

我不是在考虑交换机和运行交易应用程序的服务器之间的物理距离造成的延迟,而是由程序本身引入的延迟.

更具体一点:从应用程序到达应用程序的事件到该应用程序的时间是什么时候在线路上输出订单/价格?即交易时间.

我们在谈论毫秒级吗?还是亚微秒?

人们如何实现这些延迟?在汇编中编码?FPGA的?好旧的C++代码?

更新

最近发表了一篇关于ACM的有趣文章,为今天的HFT技术提供了很多细节,这是一个很好的阅读:

网关的野蛮人 - 高频交易和交易技术

algorithmic-trading low-latency

47
推荐指数
4
解决办法
2万
查看次数

低延迟编程

我一直在阅读很多关于低延迟金融系统的信息(特别是自着名的企业间谍案以来),从那以后我就一直想到低延迟系统.有一百万个应用程序可以使用这些人正在做的事情,所以我想更多地了解这个主题.问题是我找不到任何关于这个主题的有价值的东西.任何人都可以在低延迟系统上推荐书籍,网站和示例吗?

language-agnostic trading low-latency

44
推荐指数
6
解决办法
3万
查看次数

为什么JVM需要预热?

我知道在Java虚拟机(JVM)中,可能需要进行预热,因为Java使用延迟加载过程加载类,因此您需要确保在启动主事务之前初始化对象.我是一名C++开发人员,不必处理类似的要求.

但是,我无法理解的部分如下:

  1. 您应该预热哪些代码部分?
  2. 即使我热身代码的某些部分,它仍然保持多长时间(假设这个术语只表示你的类对象保留在内存中多长时间)?
  3. 如果每次收到活动时都有需要创建的对象,它会如何帮助?

考虑一个例子,期望通过套接字接收消息的应用程序,并且事务可以是新订单,修改订单和取消订单或确认的交易.

请注意,该应用程序是关于高频交易(HFT),因此性能非常重要.

java garbage-collection jvm low-latency hft

38
推荐指数
3
解决办法
1万
查看次数

Java低延迟应用程序的开发清单是什么?

我想为Java低延迟应用程序创建全面的清单.你能在这里添加清单吗?

这是我的列表
1.使您的对象不可变
2.尝试减少同步方法
3.锁定顺序应记录良好,并小心处理
4.使用分析器
5.使用Amdhal定律,找到顺序执行路径
6.使用Java 5并发实用程序和锁
7.避免Thread优先级,因为它们是平台相关的
8.可以使用JVM预热
9.首选不公平的锁定策略
10.避免上下文切换(许多线程导致反效果)
11.避免装箱,取消装箱
12.注意编译器警告
13.线程数应等于或小于核心数

低延迟应用程序每毫秒调整一次.

java concurrency multithreading low-latency

33
推荐指数
4
解决办法
2万
查看次数

ZeroMQ和WebSockets之间的差异

我想知道协议ZeroMQ协议之间的区别.WebSockets

我知道WebSockets是为Web浏览器客户端设计的,但我假设它也可以用于服务器到服务器.

而且,在这种情况下,我想知道,如果这将是很好用WebSockets的,而不是别的东西一样ZeroMQ实时消息.

具体来说,我担心在发生临时网络故障时可靠性丢失消息.

zeromq websocket low-latency nanomsg

28
推荐指数
2
解决办法
1万
查看次数

什么是低延迟数据访问?

低延迟数据访问是什么意思?

我实际上对这个术语的定义感到困惑."LATENCY"

任何人都可以详细说明"延迟"一词.

memory performance dataflow multiplexing low-latency

26
推荐指数
2
解决办法
3万
查看次数

跟踪内核中神秘的高优先级线程挂起

描述

我正在研究一个在多核ARMv7a SoC上运行的嵌入式Linux系统(使用内核3.4和仿生,类似Android).我们有一个用户空间线程,它基本上处理来自内核的事件.事件是从IRQ生成的,必须以非常低的延迟对用户空间做出反应.

线程以SCHED_FIFO优先级0运行.它是系统中唯一的优先级0线程.线程的近似代码:

    while (1)
    {
        struct pollfd fds[1];
        fds[0].fd = fd;
        fds[0].events = POLLIN|POLLRDNORM|POLLPRI;

        int ret = poll(fds, 1, reallyLongTimeout);
        FTRACE("poll() exit");
        if (ret > 0)
        {
            // notify worker threads of pending events
        }
    }
Run Code Online (Sandbox Code Playgroud)

通常我们会得到非常好的延迟(线程在IRQ发生的同一毫秒内完全往返于poll()),然而随机我们有几十毫秒的延迟会破坏一切.在遍历整个地方之后,我得出结论,延迟发生在IRQ触发之后和poll()系统调用返回之前,因为线程使自己处于睡眠状态.然后一段时间后被一些未知的力量唤醒,一切都继续.

我怀疑其他一些IRQ但是在启用了sched:,irq : , timer:*tracing我不得不排除它.我在移植系统调用时遇到了一些困难:*跟踪器到ARM内核.系统调用跟踪器工作,但如果我也启用sched:*我在ring_buffer代码中得到各种各样的恐慌.

在sys_poll()中插入一些自定义跟踪点之后,我得到了一个令人不舒服的结论,即我的线程在sys_poll()返回之后但在它重新出现在用户空间之前就已经睡着了.

这是带有我在fs/select.c中的自定义跟踪点的带注释的跟踪:

 <my thread>-915   [001] ...1    17.589394: custom: do_poll:786 - calling do_pollfd
 <my thread>-915   [001] ...1    17.589399: custom: do_poll:794 - failed, no events
 <my thread>-915   [001] ...1    17.589402: custom: do_poll:823 - going to sleep, count = …
Run Code Online (Sandbox Code Playgroud)

multithreading multicore linux-kernel embedded-linux low-latency

24
推荐指数
2
解决办法
1439
查看次数