这只是我一直想知道的一些高性能计算的一般性问题.某个低延迟消息传递供应商在其支持文档中讲述了如何使用原始套接字将数据直接从网络设备传输到用户应用程序,这样做可以说明减少消息传递延迟甚至比无论如何还要多(在其他情况下)经过深思熟虑的设计决策).
因此,我的问题是那些在Unix或类Unix系统上浏览网络堆栈的人.他们可能能够实现这种方法有多大差异?您可以随意回忆记忆副本,获救的鲸鱼数量或威尔士面积;)
根据我的理解,他们的消息是基于UDP的,所以建立TCP连接等没有问题.感谢这个主题的任何其他兴趣点!
最好的祝愿,
麦克风
我们正在改变我们当前的用户端MySQL数据库.我们有一个网站+移动应用程序,美国各地的用户查询我们的数据库.相关数据包含在三个表中,并且需要针对三个表的连接查询以将相关结果发送给用户.
发送回用户的结果是小尺寸(<6kb).如果我们的目标是降低延迟并且吞吐量是低优先级,则以下两个数据库中的哪一个会表现得更好:
MemSQL还是AWS Aurora?
它们都具有相同的硬件起始成本(约0.28美元/小时).我们现在只考虑这两个数据库,以便我们可以继续使用"MySQL"内部知识.
我喜欢我可以将数据库头痛外包给Aurora.但是,MemSQL读取/写入内存的能力肯定是一种低延迟的解决方案吗?
我是编年史的新手.我正在尝试使用chronicle-map对离堆映射进行建模,其中键是原始short,值是原始长数组.对于给定的映射,长数组值的最大大小是已知的.但是我将有多个这种类型的映射,每个映射对于长数组值可能具有不同的最大大小.我的问题涉及密钥和值的序列化/反序列化.
从阅读文档我明白,对于密钥,我可以使用值类型ShortValue并重用该接口的实现实例.关于值,我找到了关于DataAccess和SizedReader的页面,它给出了byte []的一个例子,但我不确定如何将它改编为long [].我有一个额外的要求是我需要在长数组中的任意索引处获取和设置值,而无需每次都支付整个值的完整序列化/反序列化的成本.
所以我的问题是:如何构建地图时我如何建模值类型?如果每个地图知道最大尺寸并且我需要能够随机读写,那么我需要为long []数组设置什么序列化/反序列化代码每次没有序列化/反序列化整个值有效负载的索引?理想情况下,long []将直接编译/解码到堆外,而不会在堆上中间转换为byte [],并且chronicle-map代码也不会在运行时分配.谢谢.
我们运行对延迟敏感的系统.我们发现了延迟的一个重要原因:某些进程正在阻止对远程名称服务器的DNS查找.为了缓解这种情况,我们特别安装了本地缓存DNS解析器dnsmasq.
但是我们仍然会看到偶然的重要暂停,其中对本地DNS缓存(dnsmasq)的查询可能需要很长时间.这些是由TTL到期引起的; 在这些情况下,dnsmasq在响应本地进程之前查询其上游服务器.
我们也希望消除这些停顿.我希望我们的本地DNS缓存始终立即响应,即使响应是陈旧的.缓存应该异步查询其上游服务器.例如,如果缓存服务于陈旧响应,则可以异步刷新此缓存.或者更复杂的策略是在TTL到期之前不久异步刷新缓存.
但我找不到任何这样的设置dnsmasq,或者我找到的任何其他缓存DNS服务器.是否有任何DNS服务器设计为在此配置中运行?
在对低延迟网络进行一些基本的谷歌搜索后,我提出了以下程序员和系统设计人员在开始低延迟网络时应该考虑的事项:
必须一起考虑硬件,系统和协议的设计
使用UDP而不是TCP开发协议并实现简单的ack-nak,在应用程序级别重新发送逻辑
减少从线路上消耗和打包数据的进程或线程的上下文切换次数(最好为零)
使用OS的最佳选择器(选择,kqueue,epoll等)
使用具有大量板载缓冲区(fifo)的高质量NIC和交换机
使用多个NIC,专门用于下游和上游数据流
减少其他设备或软件生成的IRQ数量(如果不需要,可以简单地删除它们)
减少互斥锁和条件的使用.而是尽可能使用无锁编程技术.利用架构的CAS功能.(无锁容器)
考虑单线程多线程设计 - 上下文切换非常昂贵.
理解并正确使用架构的缓存系统(L1/L2,RAM等)
希望完全控制内存管理,而不是委托给垃圾收集器
使用优质电缆,保持电缆尽可能短,减少扭曲和卷曲的数量
我的问题:我想知道在开始使用低延迟网络时,SOers认为其他什么是重要的.
请随意批评以上任何一点
我正在研究STM32F4 CPU上的一个项目,产生信号.
我在STM32上有CPU时钟(没有预分频器)的通用定时器,在溢出时触发中断,然后用GPIO产生周期信号.
我需要在非常精确的时间触发GPIO(基本上低至一个CPU周期精度).通过设置优先级等,我已设法将此抖动减少到+ -5个周期,但这种抖动存在,具体取决于CPU的工作情况.
我需要补偿这几个周期的抖动.只要我在精确的时间切换GPIO,添加几个周期的延迟就不是问题.
我的想法是读取计数器的当前值,并有一个FIXED_NUMBER-CURRENT_VALUE时间的活动循环,确保我将在精确的时间退出循环.
然而,在C中做一个简单的循环 - 一个FOR循环,或一个while(counter-> value <TARGET)不起作用,因为它ADDS抖动而不是减少它.
我做错了什么/天真吗?我应该在集会中这样做吗?怎么会与C不同(我检查了用GCC反汇编来检查循环没有被优化掉,也不是我打了内存?)
(我确保空的,非优化的但不打击内存循环体)
编辑:在AVR上看到这个例子(我知道的更稳定)请参见示例http://lucidscience.com/pro-vga%20video%20generator-7.aspx (搜索"jitter")
edit2:我在汇编中尝试了一个简单的循环,例如(r0是我的计数器,等待的循环次数,在寄存器中)
loop : SUBS r0,#1 ; tried with 2 also
BGE loop
Run Code Online (Sandbox Code Playgroud)
而且,如果没有它,抖动会更好.
总结起来,我已经知道我应该拖延多少.我只需要一种方法让代码分支在一个案例中可靠地消耗N个循环而在另一个案例中可以消耗M. 不幸的是,单独的分支似乎不起作用,因为管道填充似乎不需要可靠的循环次数,并且条件表达式也不会因为它们总是采用相同数量的循环(有时无效).
从RAM而不是闪存运行会提高一致性吗?(NB stm32f4有一个flash预取..)
PCIe 3.0 x16和QPI 1.1(20通道)具有相同的有效带宽(16 GB/s).所以,我想大致了解两者之间的差异.
两者在延迟和消息速率(每秒数据包数量或TLP数量)方面有何不同?对于延迟,我的球场数量为QPI为20 ns,PCIe 3.0为200 ns.这些好估计?如果是,为什么PCIe的延迟要高得多 - 是否由于线路长度?
除了QPI提供缓存侦听这一事实之外,两者之间是否存在重大的架构差异?据我所知,两者都使用分层协议:通过物理层传输层.
我是iOS的初学者,我正在尝试用Swift设计一个鼓组应用程序.我用一个按钮设计了一个视图并编写了下面的代码,但它有一些问题:
AVAudioPlayer是不是低延迟音频的最佳选择,但作为一个初学者,它很难学OpenAL,AudioUnit没有代码示例或教程Swift.问题与此类似:我应该使用哪种框架在iOS中播放低延迟的音频文件(WAV,MP3,AIFF)?.代码:
override func viewDidLoad() {
super.viewDidLoad()
// Enable multiple touch for the button
for v in view.subviews {
if v.isKindOfClass(UIButton) {
v.multipleTouchEnabled = true
}
}
// Init audio
audioURL = NSBundle.mainBundle().URLForResource("snareDrum", withExtension: "wav")!
do {
player = try AVAudioPlayer(contentsOfURL: audioURL)
player?.prepareToPlay()
} catch {
print("AVAudioPlayer Error")
}
}
override func viewDidDisappear(animated: Bool) {
super.viewDidDisappear(animated)
player?.stop()
player = nil
}
@IBAction func playSound(sender: UIButton) {
player?.currentTime …Run Code Online (Sandbox Code Playgroud) 我的JS代码:
var c = document.getElementById("myCanvas");
var ctx = c.getContext("2d");
var mouse = {x:0,y:0}
const times = [];
let fps;
function refreshLoop() {
window.requestAnimationFrame(() => {
const now = performance.now();
while (times.length > 0 && times[0] <= now - 1000) {
times.shift();
}
times.push(now);
fps = times.length;
refreshLoop();
});
}
refreshLoop();
function draw() {
ctx.fillStyle = "black"
ctx.fillRect(0, 0, c.width, c.height);
ctx.strokeStyle = "white"
ctx.beginPath();
var e = window.event;
ctx.arc(mouse.x, mouse.y, 40, 0, 2*Math.PI);
ctx.stroke();
ctx.font = "30px Comic Sans MS"; …Run Code Online (Sandbox Code Playgroud) 我正在构建一个使用网络摄像头来控制视频游戏的应用程序(有点像 kinect)。它使用网络摄像头 (cv2.VideoCapture(0))、AI 姿势估计 ( mediapipe ) 和自定义逻辑将输入传输到 dolphin 模拟器中。
问题是延迟。我使用手机的高速摄像头记录自己的抓拍,发现我的手和屏幕上的帧之间存在约 32 帧~133 毫秒的延迟。这是在任何附加代码之前,只是一个视频循环read(cv2.imshow大约 15 毫秒)
有什么办法可以减少这个延迟吗?
我已经在单独的线程中抓取帧,将CAP_PROP_BUFFERSIZE设置为 0,并降低 CAP_PROP_FRAME_HEIGHT 和 CAP_PROP_FRAME_WIDTH,但我仍然得到约 133 毫秒的延迟。我还有什么可以做的吗?
下面是我的代码:
class WebcamStream:
def __init__(self, src=0):
self.stopped = False
self.stream = cv2.VideoCapture(src)
self.stream.set(cv2.CAP_PROP_BUFFERSIZE, 0)
self.stream.set(cv2.CAP_PROP_FRAME_HEIGHT, 400)
self.stream.set(cv2.CAP_PROP_FRAME_WIDTH, 600)
(self.grabbed, self.frame) = self.stream.read()
self.hasNew = self.grabbed
self.condition = Condition()
def start(self):
Thread(target=self.update, args=()).start()
return self
def update(self,):
while True:
if self.stopped: return
(self.grabbed, self.frame) = self.stream.read()
with self.condition:
self.hasNew …Run Code Online (Sandbox Code Playgroud)