分析 mnesia 索引慢的问题,结果出乎意料.
因为 ejabberd 设计思路对 mnesia 做缓存情有独钟。
排除 cowboy 系统本身性能问题之后决定分析代码。
前段时间对Cloud做压力测试意外发现,当测试将要结束时,从出现socket断开开始系统变得非常缓慢。甚至一个 http 请求相应也得花上1分多钟,甚至更长,这显然问题非常严重。对缓存性能之前做过测试,所以分析问题时直接跳过了。其实问题就是出现在缓存上。最终定位,当缓存数据达到5W条记录后,性能急剧下降,特别是删除数据和同样重复写入。每秒也就只能处理2k~3k 的样子。这结果令人沮丧,这样的性能怎能适合做缓存。
深深的回忆,之前测试和现在区别就是多了 index。难道 index 对性能影响如此之大。查了一下手册,手册上是这样说的:
“Indices do not come free, they occupy space which is proportional to the size of the table. They also cause insertions into the table to execute slightly slower.
”
好吧,我相信了是索引造成的。
开始解决索引问题。差了好多资料有说慢的,可是没有找到与我一样的描述。因为我没有用 disc_copes。我全部用的 ram_copies. 群里咨询也没有看到很好的反馈,也得到了些帮助,在此感谢。
头脑中产生了两种想法。一是用 多表+transaction,二是纯碎多表+no transaction.
赶紧写代码测试,transaction 在意料之中慢的很,还抛出一些错误。no transaction 不但没有预期的快,还发写数据和删除现数据不完整。
分析了一下数据存储形式,list 过程会导致性能降低(dict数据结构从思绪中闪过)。为了解决多表no transaction数据不完整问题,把表的默认类型从 set 改为 bag.这样数据能准确的插入和删除,不会出现覆盖问题。测试没问题。速度有所降低,但还能接受。数据不完整问题也解决了。想到此方法是否可以用到transaction 上面。
开始了 transaction+bag 测试。性能降低到同样让人绝望。想到用 transaction+bag +单表测试。结果发现 速度很快超出预期。一个个表添加依然很快。最后定为到 ws_type 表上面去了。这样一下子明白了。立刻切回 no transaction+index 去掉 type索引读写删速度都非常之快50W条数据都在毫秒内完成,第一次写总共花费 14121 ms,第二次重复写 21423 ms,删除数据 14777 ms,心情一下子晴朗了。接下来需要解决的就是 type 问题了。
无论用 index 还是 bag 类型,甚至分表K<->ValueList当 ValueList 超过2W 速度照样拖慢。这才是拖慢读写的本质。
<!--?xml version="1.0" encoding="UTF-8" standalone="no"?-->
Type 当前只有两种类型 D和C。当有5W 条数据后。index、bag、另一张表(与 index 类似)速度通通慢的不行。
相关推荐
Mnesia是一个分布式数据库管理系统(DBMS),适合于电信和其它需要持续运行和具备软实时特性的Erlang应用。 目 录 1 、介绍 . . .. . .. . . .. . 4 1.1 关于 Mnesia . . .. . .. . . .. . 4 1.2 Mnesia ...
1.2.Mnesia.数据库管理系统(DBMS 2、开始.Mnesia 2.1.首次启动.Mnesia 2.2.一个示例 3、构建.Mnesia.数据库 3.1.定义模式 3.2.数据模型 3.3.启动.Mnesia 3.4.创建新表 4、事务和其他上下文存取 ...
erlang-mnesia-19.3.6.4-1.el7.x86_64.rpm
• Mnesia provides an introduction to Mnesia. • Getting Started introduces Mnesia with an example database. Examples are included how to start an Erlang session, specify a Mnesia database directory, ...
《Mnesia用户手册》是专为理解和操作Erlang编程语言中的Mnesia数据库管理系统而编写的详尽指南。Mnesia是Erlang OTP (Open Telephony Platform) 库中的一个核心组件,它是一个强大的分布式数据库系统,特别适用于...
在分析 Mnesia 表分片的过程和算法之前,首先要理解分片的必要性和它所解决的问题。随着业务的发展,数据量会迅速增加,读写请求的次数也会大幅增长。为了保证服务的高可用性,系统需要能够在短时间内处理大量的读写...
Erlang是一种高级编程语言,特别为构建分布式、并发、实时和容错系统而设计。在标题中的"erlang-18.3-1.el7.centos.x86_64.zip",我们看到的是Erlang的一个特定版本,18.3,针对64位的CentOS 7操作系统(el7)的...
Mnesia的设计初衷是为了解决电信应用中的数据管理问题,如快速实时的键值查找、非实时的复杂查询、分布式数据管理、高容错性、动态重配置能力以及支持复杂对象的存储。 Mnesia的主要特性包括: 1. 动态重配置的...
RabbitMQ安装需要的安装包
5. **模式定义**:Mnesia允许用户定义数据库模式,包括表、索引和属性等,提供了一种结构化的方式来组织和访问数据。 6. **查询语言**:Mnesia提供了自己的查询语言,允许用户执行复杂的查询和数据操作,同时也有对...
Mnesia 是一个强大的分布式数据库管理系统(DBMS),专门为Erlang编程语言设计,特别适用于需要高可用性、持续运行和软实时特性的电信和其他关键业务应用。这个系统允许在多个节点间同步数据,提供了一种在分布式...
“mnesia_pg:Postgres后端通过mnesia_ext到Mnesia” 这个标题揭示了一个项目,它的目标是将PostgreSQL数据库作为Erlang的Mnesia分布式数据库系统的一个后端。Mnesia_ext是Mnesia的一个扩展,它允许添加自定义的数据...
### Mnesia概述与关键知识点 #### 一、Mnesia数据库管理系统简介 Mnesia是一个专为电信应用设计的分布式、容错数据库管理系统(DBMS)。它由爱立信公司的计算机科学实验室开发,旨在解决传统商用数据库管理系统...
Api-Social-Amnesia.zip,忘记过去。社交健忘症确保你的社交媒体帐户只显示你最近的历史,而不是5年前“那个阶段”的帖子。,一个api可以被认为是多个软件设备之间通信的指导手册。例如,api可用于web应用程序之间的...