任何人都可以给我大概的时间(以纳秒为单位)来访问L1,L2和L3缓存,以及Intel i7处理器上的主内存吗?
虽然这不是一个特别的编程问题,但是对于某些低延迟编程挑战而言,了解这些速度细节是必要的.
我们正在开发一个对延迟敏感的应用程序,并已对所有类型的方法进行微基准测试(使用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) 当连接socket.io/node.js和redis pub/sub以尝试创建由可处理多个传输的服务器事件驱动的实时Web广播系统时,似乎有三种方法:
'createClient'是一个redis连接并订阅了频道.在socket.io客户端连接上,将客户端加入socket.io会议室.在redis.on("message",...)事件中,调用io.sockets.in(room).emit("event",data)以分发给相关房间中的所有客户端.喜欢如何在socket.io中重用redis连接?
'createClient'是一个redis连接.在socket.io客户端连接上,将客户端加入socket.io会议室并订阅相关的redis频道.在客户端连接闭包内和收到消息调用client.emit("event",data)时包含redis.on("message",...)以在特定客户端上引发事件.就像在socket.io中使用RedisStore的示例中的答案一样
使用RedisStore烘焙到socket.io和'广播'从Redis中的单个"调度"通道遵循socketio-spec协议.
Number 1允许为所有客户端处理一次Redis子和相关事件.Number 2为Redis pub/sub提供了更直接的钩子.3号更简单,但几乎无法控制消息传递事件.
但是,在我的测试中,所有连接的客户端都表现出意外的低性能.有问题的服务器事件是尽快发布到redis频道的1,000条消息,以便尽快分发.性能是通过连接客户端的时间来衡量的(socket.io-client基于该日志时间戳到Redis列表中进行分析).
我猜测在选项1中,服务器接收消息,然后顺序将其写入所有连接的客户端.在选项2中,服务器多次接收每个消息(每个客户端订阅一次)并将其写入相关客户端.在任何一种情况下,服务器都不会进入第二个消息事件,直到它被传递给所有连接的客户端.随着并发性的上升,情况显然更加恶化.
这似乎与堆栈功能的感知智慧不一致.我想相信,但我在苦苦挣扎.
这种情况(大量消息的低延迟分布)是不是这些工具的选项(但是?),还是我错过了一个技巧?
你一直听说高频交易(HFT)以及算法的速度有多快.但我想知道 - 这几天有多快?
更新
我不是在考虑交换机和运行交易应用程序的服务器之间的物理距离造成的延迟,而是由程序本身引入的延迟.
更具体一点:从应用程序到达应用程序的事件到该应用程序的时间是什么时候在线路上输出订单/价格?即交易时间.
我们在谈论毫秒级吗?还是亚微秒?
人们如何实现这些延迟?在汇编中编码?FPGA的?好旧的C++代码?
更新
最近发表了一篇关于ACM的有趣文章,为今天的HFT技术提供了很多细节,这是一个很好的阅读:
我一直在阅读很多关于低延迟金融系统的信息(特别是自着名的企业间谍案以来),从那以后我就一直想到低延迟系统.有一百万个应用程序可以使用这些人正在做的事情,所以我想更多地了解这个主题.问题是我找不到任何关于这个主题的有价值的东西.任何人都可以在低延迟系统上推荐书籍,网站和示例吗?
我知道在Java虚拟机(JVM)中,可能需要进行预热,因为Java使用延迟加载过程加载类,因此您需要确保在启动主事务之前初始化对象.我是一名C++开发人员,不必处理类似的要求.
但是,我无法理解的部分如下:
考虑一个例子,期望通过套接字接收消息的应用程序,并且事务可以是新订单,修改订单和取消订单或确认的交易.
请注意,该应用程序是关于高频交易(HFT),因此性能非常重要.
我想为Java低延迟应用程序创建全面的清单.你能在这里添加清单吗?
这是我的列表
1.使您的对象不可变
2.尝试减少同步方法
3.锁定顺序应记录良好,并小心处理
4.使用分析器
5.使用Amdhal定律,找到顺序执行路径
6.使用Java 5并发实用程序和锁
7.避免Thread优先级,因为它们是平台相关的
8.可以使用JVM预热
9.首选不公平的锁定策略
10.避免上下文切换(许多线程导致反效果)
11.避免装箱,取消装箱
12.注意编译器警告
13.线程数应等于或小于核心数
低延迟应用程序每毫秒调整一次.
我想知道协议ZeroMQ和协议之间的区别.WebSockets
我知道WebSockets是为Web浏览器客户端设计的,但我假设它也可以用于服务器到服务器.
而且,在这种情况下,我想知道,如果这将是很好用WebSockets的,而不是别的东西一样ZeroMQ的实时消息.
具体来说,我担心在发生临时网络故障时可靠性和丢失消息.
低延迟数据访问是什么意思?
我实际上对这个术语的定义感到困惑."LATENCY"
任何人都可以详细说明"延迟"一词.
描述
我正在研究一个在多核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
low-latency ×10
java ×3
memory ×2
concurrency ×1
cpu-cache ×1
dataflow ×1
hft ×1
jmh ×1
jvm ×1
latency ×1
linux-kernel ×1
multicore ×1
multiplexing ×1
nanomsg ×1
node.js ×1
performance ×1
redis ×1
socket.io ×1
trading ×1
websocket ×1
zeromq ×1