低延迟系统的最佳实践

1. 选择正确的语言

脚本语言不能使用,尽管它们可以运行得更快更快,当你寻找对几毫秒延迟都不能忍受时,就不能有解释语言的开销,你希望有一个强大的内存模型,能够无锁编程,可选语言有Java Scala和C 11或Go。

2. 将一切放在内存中

I/O会杀死你的延迟,确保你所有的数据都在内存中,这就意味着你自己要管理你的数据结构,以及维护一个持久日志,这样,你才能在机器重新启动后重建原来内存状态,持久日志的选择有: Bitcask, Krati, LevelDB 和 BDB-JE, 当然,你也可以运行一个本地持久化的内存数据库如 redis or MongoDB(memory >> data),请注意后台在将数据同步到磁盘时可能会导致一些数据崩溃,需要进行松散化(Loose).

3. 让数据和处理同位colocated

Network hops are faster than disk seeks(网络连接要快于磁盘寻轨) ,但即使如此,他们也会增加大量的开销。理想情况下,您的数据应该完全适合一台主机上内存。如果你需要多台主机上运行,你应该确保你的数据和请求得到正确的分区,满足特定的请求的所有必要的数据来都是在本地可用。

4. 让系统未充分利用

低延迟要求总是有资源能处理请求。不要试图让你的硬件/软件处于满负荷极限运行状态。留下一些头寸供使用。

5.让上下文切换最小化

当你使用有限的资源进行更复杂的计算工作时,CPU会忙于在有限资源之间不断切换。你要根据CPU核数限制线程数,以便使每个线程能为自己的核心工作。

6.保持读取的顺序性

所有形式的存储空间,无论是基于闪存或内存,按顺序使用性能会显著改善。当发出连续读取内存,将触发在内存级别的预取,如同在CPU缓存级别一样。如果处理得当,则下一个数据在你需要它之前将永远首先存在L1高速缓存中。这个简单之道能够帮助处理大量数组或原始类型的重量级别使用。进一步说,应该不惜一切代价避免使用链表或通过对象的数组。

7.让你的写操作批量化

这听起来似乎有悖常理,但你可以通过批量写入确实可以获得在性能上的显著改善。然而,有一种误解,认为这意味着该系统应在任意数量批写操作之前有一个暂停等待的时间。相反,一个线程要旋转spin紧密循环执行I/ O。上一批写操作完成后,将立即有一批数据写操作发生,这是一个非常快速和自适应系统。

8 .尊重你的缓存

在所有这些优化的地方,内存存取将迅速成为一个瓶颈。将线程pin住自己的核心有助于降低CPU缓存污染,顺序I / O也有助于预加载缓存。除此之外,你应该保持最大容量下使用的原始数据类型,以便更多的数据放入缓存。调整缓存算法保证所有数据在在高速缓存中。

9.尽可能非堵塞

与非阻塞 零等待的数据结构和算法成为朋友。每次当你用锁时,堆栈将深入到操作系统进行调解,每一次锁定是一个巨大的开销。通常情况下,如果你知道你在做什么,你可以通过了解JVM,C11或Go的内存模型绕过锁。

10.尽可能异步

任何处理,特别是I / O并不是对于构建响应是绝对必要的话,那么应该在关键执行路径以外异步实现。

11.尽可能并行

任何处理,特别是I / O如果可以并行发生,尽量并行进行。例如,如果您的高可用性策略包括交易记录到磁盘和发送交易到辅助服务器的操作,这些都可以并行发生。

时间: 2024-10-03 07:15:23

低延迟系统的最佳实践的相关文章

低延迟系统的Java实践

在很久很久以前,如果有人让我用Java语言开发一个低延迟系统,我肯定会用迷茫的眼神望着他,然后说"are you kidding me?".然而随着Java语言的日臻完善以及JVM性能的极速提升,使得用Java语言开发低延迟(不要和实时系统搞混)系统越来越成为可能,其中就包括最典型的交易(支付)系统.当然作为系统架构师,他们会尝试使用一些成熟分布式架构方案(通常是整合一些商业或开源项目),通过利用冗余计算资源以及异步通信方式提高应用程序的吞吐量和响应率,使其到达低延迟系统的标准,这在社

迁移你的单体系统:最佳实践和关注领域

假设有这样一种情况:你有一个对你的业务十分重要的复杂单体系统,你已经阅读过相关的文章,希望将这一系统迁移到更加先进的.使用微服务和容器的平台上,但又不知道从何入手. 如果你正面临着这一问题,那么这篇文章一定会帮到你.接下来,我将从最佳实践以及需要关注的领域两个方面,帮助你将单体应用程序演进为面向微服务的应用程序. 概述 毋庸置疑,完全从头做起的.从基于容器的云服务开始入手的"绿地开发模式(Greenfield Development)"是最理想的开发模式.然而,对大多数开发团队而言,这

用HAWQ轻松取代传统数据仓库(十七) —— 最佳实践

一.HAWQ参数配置最佳实践 (原文地址:http://hawq.incubator.apache.org/docs/userguide/2.1.0.0-incubating/bestpractices/config_hawq_bestpractices.html)        在$GPHOME/etc/hawq-site.xml文件中维护HAWQ的配置参数.该文件存在于所有HAWQ实例上,并可以通过Ambari或使用HAWQ命令行接口进行修改.使用一致的策略(Ambari或命令行接口)维护h

Android IOS WebRTC 音视频开发总结(七六)-- 探讨直播低延迟低流量的粉丝连麦技术

本文主要探讨基于WebRTC的P2P直播粉丝连麦技术 (作者:郝飞,亲加云CTO,编辑:dora),最早发表在[这里] 支持原创,转载必须注明出处,欢迎关注微信公众号blacker(微信ID:blackerteam  或 webrtcorgcn) 到目前为止,直播行业继续如预期的那样如火如荼的发展着,在先后竞争完延迟,高清,美 颜,秒开等功能后,最近各大直播平台比拼的一个热点就是连麦.什么是连麦? 简单??述 就是当主播直播期间,可以与其中某一个粉丝进行互动,并且其他粉丝能够观看到这个互动 过程

atitit. 日志系统的原则and设计and最佳实践(1)-----原理理论总结.

atitit. 日志系统的原则and设计and最佳实践总结. 1. 日志系统是一种不可或缺的单元测试,跟踪调试工具 1 2. 日志系统框架通常应当包括如下基本特性 1 1. 所输出的日志拥有自己的分类. 2 2. 日志按照某种标准分成不同级别. 2 3. 支持多线程. 2 4. 稳定性. 2 3. 一个理想的日志模式 2 4. 判断指定的方法是否被调用了 3 5. 给方法的输入输出加上日志通过Aop 3 6. 日志易读,易解析  对日志感兴趣的可以分为两类: 3 7. 输出日志使用的性能 3 8

SQL Server系统数据库备份最佳实践

原文:SQL Server系统数据库备份最佳实践 首先了解主要的系统数据库: 系统数据库 master 包含登录信息和其他数据库的核心信息 msdb 存储作业.操作员.警报.备份还原历史.数据库邮件信息等等. model 所有新数据库的模型,如果希望新数据库都有某些对象,可以在这里创建. tempdb sql server重启时重建,所以不需要备份 除了以上四种,其实还有一个数据库:Resource 从2005就引入的,一个只读.隐藏的数据库,包含所有在sql server中的系统对象.由于SQ

团队排表系统V3.0最佳实践及使用说明

团队排表系统V3.0最佳实践 1.从我这里获取团队代号, 例如"tuanzhangshishabi" 2.打开网页 填写以下信息. 请注意: 最好所有的打工和老板都填上真实的QQ, 有利于发号和管理. 第一个填写我给的团队代码的人将会是管理员 3.进入主页,选择左侧老板管理,添加老板.  团员管理 添加团员.  记住所有的qq 帐号 密码 区服 都尽量填写真实, 操作方式: 双击编辑, 右键删除, 加号添加, 左键选中可以批量删除, 批量导入(还未实现). 可以按区服,职业查询. 团员

设置java系统属性的最佳实践是什么,-D或System.setProperty()?(What is best practice for setting java system properties, -D or System.setProperty()?)

I need to set the codebase for the RMI application I'm working on at the moment and have done this successfully using first try{ ResourceBundle config = ResourceBundle.getBundle("myApp"); String codeBaseUrl = config.getString("codeBaseUrl&q

Android最佳实践之性能 - 电池续航时间优化

Doze和App Standby的优化(API23) 参考地址:http://developer.android.com/training/monitoring-device-state/doze-standby.html 从Android 6.0 (API level 23)开始,Android提供了两个节电功能用来增加电池的续航时间.Doze 可以在设备长时间不使用时,通过延迟后台CPU和网络的活动来减少电池的消耗:App Standby将延迟没有交互的app网络活动. Doze和App S