lua中keyvalue_40行中的持久性KeyValue Server和一个可悲的事实

lua中keyvalue

再次出现。..彼得斯撰写了有关Unsafe用法的书面概述 ,我将简要介绍一下Java中的低级技术如何通过启用更高级别的抽象允许Java性能级别来节省开发工作可能很多人都不知道。

我的主要观点是表明,将对象转换为字节,反之亦然是一个重要的基础,实际上影响了任何现代Java应用程序。

硬件喜欢处理字节流,而不是处理通过指针连接的对象图,因为“所有内存都是磁带” (如果我没记错的话,M.Thompson ..)。


因此,许多基本技术很难与原始Java堆对象一起使用:

  • 内存映射文件 –一种出色而简单的技术,可安全,快速,轻松地保存应用程序数据。
  • 网络通信基于发送字节数据包
  • 进程间通讯 (共享内存)
  • 当今服务器的大主内存 (64GB至256GB)。 (GC问题)
  • CPU高速缓存最适合在内存中以连续字节流形式存储的数据

因此在大多数情况下使用Unsafe类有助于将Java对象图转换为连续的内存区域,反之亦然

  • [性能增强] 对象序列化
  • 包装器类,以简化对连续内存区域中存储的数据的访问。

(本文的代码和示例可在此处找到)

基于序列化的堆外

考虑一个零售Web应用程序,其中可能有数百万个注册用户。 实际上,我们不希望在关系数据库中表示数据,因为所有必要的操作是在用户登录后快速检索与用户相关的数据。此外,我们还想快速遍历社交图。

让我们看一个简单的用户类,其中包含一些属性和构成社交图的“朋友”列表。

用户

将其存储在堆上的最简单方法是简单的大型HashMap。

或者,可以使用堆外映射来存储大量数据。 堆外映射将其键和值存储在本机堆中,因此垃圾回收不需要跟踪此内存。 此外,可以告知本机堆自动与磁盘(内存映射文件)同步。 甚至在您的应用程序崩溃时也可以使用,因为操作系统管理回写更改的内存区域。

有一些带有各种功能集的开源堆外地图实现(例如ChronicleMap ),在本示例中,我将使用一种简单且简单的实现,该实现具有快速迭代(可选的全扫描搜索)和易用性的特点。

序列化用于存储对象,反序列化用于将它们再次拉到Java堆。 令人愉快的是,我已经编写了(afaik)这个星球上最快的,完全兼容JDK的对象序列化程序 ,因此我将利用它。

omap

完成:

  • 通过内存映射文件实现持久性(映射将在创建时重新加载)。
  • Java Heap仍然为空,无法使用完全GC <100ms的实时应用程序进行处理。
  • 整体内存消耗明显减少。 序列化的用户记录约为60个字节,因此理论上3亿条记录可容纳180GB的服务器内存。 无需引发大数据标志并在AWS上运行4096个hadoop节点。

比较常规的内存中的Java HashMap和基于快速序列化的,拥有1500万条用户记录的持久性堆外映射,将显示以下结果(在3Ghz较旧的XEON 2×6上):

消耗的Java堆(MB) 完整GC 本机堆(MB) 每秒钟获取/输入操作 所需的VM大小(MB)
哈希图 6.865,00 26,039 0 3.800.000,00 12.000,00
OffheapMap(基于序列化) 63,00 0,026 3.050 750.000,00 500,00


[ 测试源/博客项目 ]注意:您至少需要16GB的RAM才能执行它们。

乱堆
如人们所见,无论如何,即使进行快速序列化,访问性能也要付出沉重的代价(约5倍):与其他持久性替代方案相比,其性能仍然更好(每个“ get”操作“ put()”为1-3微秒)非常相似)。

使用JDK序列化的速度至少要慢5到10倍(下面直接比较),因此使这种方法无用。

与更高的抽象水平相比,交易性能提高了:“服务器化我”

像迷你老板自行车一样停车
单个服务器将无法为成千上万的用户提供服务,因此我们需要以某种方式在进程之间甚至跨机器共享数据,甚至更好。

使用快速实现,可以为网络消息传递慷慨地使用(快速)序列化。 再说一次:如果运行速度慢5到10倍,那将是不可行的。 替代方法需要更多数量级的工作才能获得相似的结果。


通过使用Actor实现(异步ftw!)包装持久性堆外哈希映射,一些代码行构成了具有基于TCP和HTTP接口的持久性KeyValue服务器(使用kontraktor actors )。 当然,如果稍后决定,仍可以在过程中使用Actor。

千伏

现在,这是一个微服务。 鉴于它没有进行任何优化的尝试并且是单线程的 ,因此其速度相当快[与上述XEON机器相同]:

  • 每秒280_000次成功的远程查找
  • 如果失败查找,则为800_000(找不到密钥)
  • 基于序列化的TCP接口(1个内衬)
  • REST-of-us(1个班次)的严格Web服务。

[ 来源:KVServer,KVClient ]注意:您至少需要16GB的RAM才能执行测试。

现实世界中的实现可能希望通过将接收到的序列化对象byte []直接放入映射中而不是对其进行两次编码(一次编码/解码以通过有线传输,然后解码/编码以进行映射映射)来提高性能。

“ RestActorServer.Publish(..);” 是一个衬垫,除了原始tcp外,还可以将KVActor公开为Web服务:

2014-12-17 00-19-18的屏幕截图

使用flyweight包装器/结构获得类似C的性能

通过序列化,常规Java对象将转换为字节序列。 一个可以做相反的事情:创建包装器类,该包装器类从基础字节数组或本机内存地址的固定或计算位置读取数据。 (例如,请参阅此博客文章 )。

通过移动基本指针,仅通过移动包装器的偏移量就可以访问不同的记录。 复制这样的“打包对象”归结为内存副本。 此外,以这种方式编写分配免费的代码非常容易。 缺点是,与常规Java对象相比,读/写单个字段会降低性能。 这可以通过使用Unsafe类来弥补。

结构
如引用的博客文章所示,“ flyweight”包装器类可以手动实现,但是随着代码的增长,这种情况变得难以维护。

快速序列化提供了一个副产品“结构仿真”,支持在运行时从常规Java类创建flyweight包装器类。 这样可以在很大程度上避免应用程序代码中的低级字节摆弄。



常规Java类如何映射到平面内存(fst-struct): 捕获

当然,那里有更简单的工具来帮助减少编码的手动编程(例如Slab ),这可能更适合许多情况并且使用较少的“魔术”。

使用不同的方法(悲伤事实传入)可以期待什么样的性能?

让我们采用以下由价格更新和表示可交易工具(例如股票)的嵌入式结构组成的结构类,并使用各种方法对其进行编码:

结构

代码中的“结构”

纯编码性能:

结构 fast-Ser(无共享裁判) 快速服务 JDK Ser(未共享) JDK系列
26.315.000,00 7.757.000,00 5.102.000,00 649.000,00 644.000,00


adv1

具有消息传递吞吐量的实际测试:

为了获得实际应用中差异的基本估计,我进行了一个实验,即当通过可靠的UDP消息以高速率发送和接收消息时,如何执行不同的编码:

考试:

发送方尽可能快地对消息进行编码,然后使用可靠的多播将其发布,订户接收并对其进行解码。

结构 fast-Ser(无共享裁判) 快速服务 JDK Ser(未共享) JDK系列
6.644.107,00 4.385.118,00 3.615.584,00 81.582,00 79.073,00

adv2
(在I7 / Win8,XEON / Linux上进行的测试得分略高,结构的msg大小约为70字节,序列化约为60字节)。

我的天啊


与最低速度相比,最慢速度:82。测试突出显示了微基准测试未涵盖的问题:编码和解码应执行类似的操作,因为实际吞吐量由Min(编码性能,解码性能)确定。 出于未知的原因,JDK序列化设法以每秒500_000次的速度对测试的消息进行编码,解码性能仅为每秒80_000次,因此在测试中,接收器Swift下降:


*****接收速率统计:每秒80351 *********

*****接收速率统计:每秒78769 **********

SUB-ud4q已被服务1的PUB-9afs丢弃

致命的,无法跟上。 退出

(在此处创建背压可能不是解决此问题的正确方法!)

结论

  • 快速序列化允许在分布式应用程序中实现某种程度的抽象,如果序列化实现是
    - 太慢了
    –不完整。 例如无法处理任何可序列化的对象图 –需要手动编码/修改。 (会对演员消息类型,期货,孢子,维护噩梦施加许多限制)
  • 诸如“不安全”之类的低级实用程序可启用不同的数据表示形式,从而为特定的工作负载提供超常的吞吐量或有保证的延迟边界(无分配主路径)。 使用JDK的公共工具集不可能实现这些目标。
  • 在分布式系统中,通信性能至关重要。 查看上面的数字,删除不安全并不是最大的麻烦。.JSON或XML不能解决此问题。
  • 尽管HotSpot VM已达到非凡的性能和可靠性水平,但JDK的某些部分却浪费了CPU,就像没有明天一样。 考虑到我们生活在分布式应用程序和数据时代,应该很容易实现(而不是手动编码)在线传输内容,并且应尽可能快。

附录:有限的延迟

快速的Ping Pong RTT延迟基准测试表明Java可以轻松地与C解决方案竞争,只要主要路径没有分配,并且采用了上述技术即可:

lat1

lat2
[学分:图表和使用HdrHistogram完成的测量]

这是一个“实验”,而不是一个基准测试(因此,请不要阅读:“ 证明:Java比C更快” ),它表明低级Java至少可以在此低级领域与C竞争。

当然,它不是完全惯用的 Java代码,但是与JNI或纯C(++)解决方案相比,它仍然更易于处理,移植和维护。 低延迟的C(++)代码也不是惯用的!

翻译自: https://www.javacodegeeks.com/2015/01/a-persistent-keyvalue-server-in-40-lines-and-a-sad-fact.html

lua中keyvalue

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/338743.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++基础教程示例详解:C++中的I/O重定向

在C语言中&#xff0c;我们可以使用函数freopen()将现有文件指针重定向到另一个流。freopen()的原型如下FILE * freopen ( const char * filename, const char * mode, FILE * stream );例如&#xff0c;要将stdout重定向为文本文件&#xff0c;我们可以编写freopen ("tex…

租房界的php,php实现出租房数据管理及搜索页面

这篇文章主要为大家详细介绍了php出租房数据管理及搜索页面的相关资料&#xff0c;具有一定的参考价值&#xff0c;感兴趣的小伙伴们可以参考一下php数据访问例子&#xff1a;租房信息管理&#xff0c;具体内容如下1.数据库建表2. zufangzi.php租房子区域&#xff1a;全选requi…

ln函数怎么看奇偶性_Python中函数的参数应该怎么理解?看完这篇文章情不自禁的想收藏...

前面给大家讲过&#xff0c;函数是一种编程思想&#xff0c;是提高代码重复利用的设计思路&#xff0c;是代码设计更深层次的产物。今天要给大家讲的就是函数的核心&#xff1a;函数的参数基本概念1、函数的参数&#xff1a;是指函数完成某项功能所需要的信息。举个例子&#x…

centos7.4编译mysql5.6,centos7编译安装mysql5.6

1.useradd -s /sbin/nologin -M mysql #新增mysql运行用户2.yum -y install ncurses-devel libaio-devel cmake gcc-c #安装依赖包3.编译&#xff0c;注&#xff1a;重新cmake需要删除CMakeCache.txt文件cmake -DCMAKE_INSTALL_PREFIX/zhonghong/mysql \-DMYSQL_DATADIR/zhong…

面向对象设计思想-C语言

面向对象的三个特征&#xff1a;封装&#xff0c;继承&#xff0c;多态。但是C语言不是面向对象编程语言&#xff0c;所以需要借助一些技巧来实现这三个特征&#xff1a;&#xff08;1&#xff09;C语言没有成员函数&#xff0c;struct只能封装数据&#xff0c;不能封装方法&am…

java iterable_太糟糕了,Java 8没有Iterable.stream()

java iterable这是最近比较有趣的Stack Overflow问题之一&#xff1a; 为什么Iterable不提供stream&#xff08;&#xff09;和parallelStream&#xff08;&#xff09;方法&#xff1f; 最初&#xff0c;直接将Iterable转换为Stream似乎很直观&#xff0c;因为在90&#xff…

three.js加载3d模型_基于WebGL的3D技术在网页中的运用 ThingJS 前端开发

Three.js、ThingJS这些引擎库可以加载3D制作软件的模型&#xff0c;大幅度提高了制作效率&#xff0c;改变WebGL开发困难的局面&#xff0c;让Web开发者享受便捷的3D开发服务。三者的难度对比如下&#xff1a;ThingJS&#xff08;框架&#xff09;< Three.js&#xff08;引擎…

C语言 | typedef

C语言typedef用新的类型名代替原有的类型名//指定用Integer为类型名&#xff0c;作用与int相同。 typedef int Integer&#xff1b;//指定用Real为类型名&#xff0c;作用与float相同。 typedef float Real&#xff1b;C语言允许程序设计者用一个简单的名字代替复杂的类型形式命…

php珠心算源码,深度解析珠心算的“开智”功能

编者按&#xff1a;本文来自李绵军校长在廊坊智慧特训营演讲。李绵军校长通过十几年来对珠心算的钻研练习&#xff0c;详细解读了珠心算的开智功能&#xff0c;以及“一门深入”的作用。珠心算的开智价值是在哪里&#xff1f;大家都说开发智力&#xff0c;我在这讲开发智力不是…

jsr 269 api_研究Java 9 Money and Currency API(JSR 354)

jsr 269 apiJSR 354定义了一个用于处理货币和货币的新Java API&#xff0c;计划将其包含在Java 9中。在本文中&#xff0c;我们将研究参考实现的当前状态&#xff1a; JavaMoney 。 就像我关于Java 8日期/时间API的帖子一样&#xff0c;该帖子将主要由显示新API的代码驱动。 …

python程序调试题_关于python程序调试问题,一个文件计算的问题

那位大神帮小弟看下这段代码有什么需要改进的没有。程序要求为&#xff1a;程序主要内容是&#xff1a;大地坐标经纬度的格式转换问题&#xff0c;例如12030′30″转换为120.50833333&#xff0c;并且可以互换&#xff0c;这样的程序。...那位大神帮小弟看下这段代码有什么需要…

C语言 函数

定义函数在 C 语言中&#xff0c;函数由一个函数头和一个函数主体组成。下面列出一个函数的所有组成部分&#xff1a;返回类型&#xff1a;一个函数可以返回一个值。return_type 是函数返回的值的数据类型。有些函数执行所需的操作而不返回值&#xff0c;在这种情况下&#xff…

cassandra 入门_Apache Cassandra和Java入门(第二部分)

cassandra 入门要求 要遵循本教程&#xff0c;您应该已经有一个正在运行的Cassandra实例&#xff08; 一个小型集群会很好 &#xff0c;但不是必需的&#xff09;&#xff0c;已安装Datastax Java驱动程序&#xff08; 请参阅第I部分 &#xff09;&#xff0c;并且已经在这里进…

蓝桥杯 java 组素数,2018 蓝桥杯省赛 B 组模拟赛(五) B 结果填空:素数个数

对0,1,2,3,4,5,6,7进行全排列&#xff0c;需要注意的是0不能开头&#xff0c;所以我直接让初始值设为1,0,2,3,4,5,6,7&#xff0c;这样就避免了0开头的情况。对于每一次去判断是不是素数的话会有点浪费时间&#xff0c;所以可以用素数打表。实现代码&#xff1a;#include using…

自适应 幻灯片代码 app_字节跳动 To B 再添一员,将推出飞书文档独立App | 36氪独家...

不只是功能点的延伸&#xff0c;以 C 端打 B 端&#xff0c;是字节跳动推出“飞书文档”的另一体现。文&#xff5c;苏建勋头图来源| IC photo据36氪获悉&#xff0c;字节跳动旗下移动办公软件“飞书”将于近期推出独立 App “飞书文档”。这是继2月底&#xff0c;字节跳动推出…

听说高手都用记事本写C语言代码?

坊间传闻高手都喜欢用记事本写代码&#xff0c;那么问题来了&#xff0c;我们以C语言为例&#xff0c;如何用记事本编译运行呢&#xff1f;其实最简单的方式就是安装GCC编译器&#xff0c;在记事本编写C语言程序&#xff0c;然后再在命令行用GCC编译运行&#xff0c;下面我简单…

jface_使用JFace Viewer延迟获取模型元素

jfaceEclipse JFace Viewers显示的模型元素有时需要花费大量时间来加载。 因此&#xff0c; 工作台提供了IDeferredWorkbenchAdapter类型以在后台获取此类模型元素。 不幸的是&#xff0c;似乎仅通过DeferredTreeContentManager派生的AbstractTreeViewer支持此机制。 因此&…

php第一课,[php第一课]php简介

学习php前提&#xff1a;应有html与css知识1、php简介[1]php是一种开源通用服务器端脚本语言。[2]php&#xff1a;hypertext preprocessor&#xff0c;译名为超文本预处理器[3]在服务器上执行[4]php文件&#xff1a;{1}php文件包含文本、html、js、php代码{2}服务器上运行&…

python省略_在python中如何连接用省略号(…)分隔的连续行

您只需&#xff1a;delim ...text This is single line.This is second long line... continue from previous line.This third single line.# here were building a list containing each line# well clean up the leading and trailing whitespace# by mapping Pythons str…

C语言边角料:结构体中指针类型的成员变量,它的类型重要吗?

一、前言昨天在编译代码的时候&#xff0c;之前一直OK的一个地方&#xff0c;却突然出现了好几个 Warning!本着强迫症要消灭一切警告的做法&#xff0c;最终定位到&#xff1a;是结构体内部&#xff0c; 指向结构体类型的指针成员变量导致的问题。这个问题&#xff0c;也许永远…