`
langzhe
  • 浏览: 278528 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

分析 mnesia 索引慢的问题,结果出乎意料.

 
阅读更多
分析 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 类似)速度通通慢的不行。 
1
0
分享到:
评论

相关推荐

    Mnesia用户手册 4.4.10版.rar

    Mnesia是一个分布式数据库管理系统(DBMS),适合于电信和其它需要持续运行和具备软实时特性的Erlang应用。 目 录 1 、介绍 . . .. . .. . . .. . 4 1.1 关于 Mnesia . . .. . .. . . .. . 4 1.2 Mnesia ...

    erlang——Mnesia用户手册.pdf

    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

    erlang-mnesia-19.3.6.4-1.el7.x86_64.rpm

    Mnesia User's Guide

    • 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用户手册.pdf

    Mnesia用户手册.pdf

    Mnesia用户手册.zip

    Mnesia是一个分布式数据库管理系统(DBMS),适合于电信和其它需要持续运行和具备软实时 特性的Erlang应用。

    Mnesia table fragmentation 过程及算法分析

    Mnesia table fragmentation 过程及算法分析。erlang就算在64位下dets的空间限制仍旧是2g,同样影响了mnesia,如果有更大需求,就必须使用Mnesia的 table fragmentation 技术

    Mnesia用户手册

    Mnesia用户手册Mnesia用户手册

    Mnesia用户手册(docx版)

    Mnesia用户手册(docx版) 详细讲解Mnesia数据库操作

    Mnesia用户手册(PDF版本)

    Mnesia用户手册(PDF版本) 详细讲述Mnesia数据库操作。

    mnesia数据库文档

    erlang系统自带的数据库mnesia的官方文档。

    Erlang Mnesia

    This book describes the Mnesia DataBase Management System &#40;DBMS&#41;. Mnesia is a distributed Database Management System, appropriate for telecommunications applications and other Erlang ...

    Mnesia 用户手册中文版 pdf

    Mnesia 用户手册中文版 pdf,把市面上的doc转成pdf,并添加重要章节的书签,细节并不完美,请见谅。

    Api-Social-Amnesia.zip

    Api-Social-Amnesia.zip,忘记过去。社交健忘症确保你的社交媒体帐户只显示你最近的历史,而不是5年前“那个阶段”的帖子。,一个api可以被认为是多个软件设备之间通信的指导手册。例如,api可用于web应用程序之间的...

    mnesia_pg:Postgres后端通过mnesia_ext到Mnesia

    mnesia_pg Postgres后端通过mnesia_ext到Mnesia 这是一个非常原始的实现,用作概念验证和初步基准测试。 尚未用于生产中。 随时进行改进。

    cachet:Mnesia的内存光盘分派器

    [WIP]香气 cachet的健忘症。...cachet可用于解决以下问题: mnesia数据库,其中有许多disc_copies表要保留在内存中。 mnesia数据库,其中一些数据需要快速访问,而许多数据则需要通过慢速访问来保存

    mnesiam:Mnesiam使Mnesia数据库的群集变得容易

    Mnesiam使Mnesia数据库的群集变得容易。 可以在上找到模块文档。 安装 该软件包可以通过添加安装mnesiam你在依赖列表mix.exs : def deps do [{ :mnesiam , " ~&gt; 0.1.1 " }] end 在您的应用程序之前,请确保已...

    erlang mnesia 数据库基本查询

    Mnesia是一个分布式数据库管理系统,适合于电信和其它需要持续运行和具备软实时特性的Erlang应用,越来越受关注和使用,但是目前Mnesia资料却不多,很多都只有官方的用户指南。下面的内容将着重说明 如何做 Mnesia ...

Global site tag (gtag.js) - Google Analytics