前段时间在做大数据的KV引擎应用,测试了leveldb的性能,感觉挺好的,美中不足的是他是基于磁盘读写。在我们的场景里,IO频率预计会远远超出磁盘的承受能力,并且太频繁的读取可能也会引发磁盘恶化的速度。

所以考虑再三,决定使用leveldb+memory的形式。

具体的实时方法很简单了,有很多前辈写过leveldb+kt的封装、启动说明。[bluecase:kyoto tycoon + leveldb存储的性能优化]

需要注意的是,如果像我们一样,要启用kt的expire字段,那么是不用加上“#ktopts=p”的。

 

后面的操作就是挂载内存了,64G Server,挂载32G tmpfs,优点是读写性能达到内存IO水平,进程重启无丢失;缺点是机器关机后会丢失数据。

接下来的使用封装都比较简单。

后面比较难的地方在于,内存中的空间是有限的(32G),不能无休止的让leveldb使用,这部分我查了一些文档,推荐这篇[leveldb]中 Compaction 一章,如壶灌顶,清楚了目标是调整 size_compacion 和 seek_compacion。

目前还没有比较好的成果,但是原理上已经可以预见就是这个方法了,compation最难的地方在于会损耗大量随机磁盘IO,但是在memory情况下是没关系的。

另外就是最后一个考虑的地方,kt如果封装了expire time,那么到期后是否会调用delete删除呢?从技术上看他是不会这样做的,因为kt层不会记录所有的expire情况,所以所有的leveldb中保存的key:value 都是有效key:value,就算有compation也不能挽救空间的耗尽,只是kt在封装leveldb的时候会没有考虑这一点吗?

---- update 15:57

对于这种极限情况,也是有办法的,根据leveldb源码的 DBUmpl:: BackgroundCompaction 函数的操作,我们是有机会把kt的expire time检查加入到有效key检查的过程里,判断超过expire time大于2小时,其实就可以删除了。

这样的改动优点是不用影响现有架构,缺点是研究/自测成本的额外投入:绕过kt查看leveldb存储,得出expire time字段转换时间的方法;修改leveldb代码,根据expire time再判断一次key是否可以删除。

最后做一次测试。

如果如愿的话很容易就完成内存空间的拯救了。加油。

使用kyototycoon挂载leveldb,映射内存磁盘的使用心得的更多相关文章

  1. 在GNU/Linux下使用命令行自动挂载与卸载USB磁盘

    在命令行环境下如果每次都是靠手动敲入mount与umount命令来挂载与卸载USB磁盘是件很麻烦的事情.尤其是mount命令的参数非常多.比如,磁盘的分区类型(vfat.ntfs等),挂载的目录节点, ...

  2. 使用NetDrive将虚拟机映射到本地磁盘,使用smba映射本地磁盘(替代FileZilla)

    使用NetDrive映射到本地磁盘 使用NetDrive软件来替代FileZilla,NetDrive是一个能把FTP空间虚拟成本地硬盘的软件,这样我们就不需要再使用FileZilla来来回拷贝文件了 ...

  3. 挂载KVM Guest操作系统磁盘

    使用虚拟机时, 发现想要修改虚拟机中的文件非常麻烦, 需要启动虚拟机, 然后再登录进去修改. 对于已经关闭的虚拟机, 为了修改一个文件而启动, 非常耽误时间. 对于一个无法启动的虚拟机(比如启动文件损 ...

  4. Hbase内存磁盘大致关系

    转自: https://blog.csdn.net/wuwenxiang91322/article/details/51595771 Hbase内存磁盘关系磁盘数 diskNum磁盘容量 diskCa ...

  5. AIX/Linux/HP-UX查看CPU/内存/磁盘/存储命令

    1.1    硬件环境验证方式 硬件环境主要包括CPU.内存.磁盘/存储.网络设备(如F5等).系统特有设备(如密押设备等)等,其中网络设备和系统特有设备由网络管理员或项目组提供为准,本节主要关注CP ...

  6. centos 6.5 x64创建并挂载使用iscsi共享磁盘

    前景摘要:NFS或iSCSI,哪个更好?文件 vs 块NFS使用文件级别的实施,服务器或存储阵列托管整个文件系统,客户到文件系统上读写文件,可以在阵列端对主存储数据进行重复数据删除.iSCSI和FC则 ...

  7. 对VM挂载新加入的磁盘

    在虚拟机配置中增加磁盘后,启动Linux,使用root登录. 首先查看未分区的磁盘,使用下面命令: ## 查看未使用的磁盘 fdisk -l 磁盘/dev/sdb后面没有任何分区,是新挂载的磁盘 输入 ...

  8. Shell采集系统cpu 内存 磁盘 网络信息

    cpu信息采集 cpu使用率 采集算法 通过/proc/stat文件采集并计算CPU总使用率或者单个核使用率.以cpu0为例,算法如下: 1. cat /proc/stat | grep ‘cpu0’ ...

  9. linux系统CPU,内存,磁盘,网络流量监控脚本

    前序 1,#cat /proc/stat/ 信息包含了所有CPU活动的信息,该文件中的所有值都是从系统启动开始累积到当前时刻 2,#vmstat –s 或者#vmstat 虚拟内存统计 3, #cat ...

随机推荐

  1. 你所不知到的C++ 系列

    http://blog.csdn.net/doon/article/category/2926337

  2. Linux内核学习笔记

    1.vanbreaker的专栏 2.LinuxKernel Exploration 3.DroidPhone的专栏 4.Linux内核研究以及学习文档和ARM学习以及研究的开放文档   [力荐] 5. ...

  3. C++编程练习(14)-------“单例模式”的实现

    原文:http://blog.csdn.net/oohaha_123/article/details/25190833 单例模式 单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例 ...

  4. 项目源码--IOS自定义视频播放器

    下载源码 技术要点: 1. 视频播放器功能的实现 2. 视频文件的扫描与管理 3. Ipad UI的实现 4.源码详细的中文注释 ……. 详细介绍: 1. 视频播放器功能的实现 源码基于MediaPl ...

  5. 标准库 - fmt/print.go 解读

    // Copyright 2009 The Go Authors. All rights reserved. // Use of this source code is governed by a B ...

  6. Java基础知识强化104:Serializable接口 与 Parcelable接口

    1. 什么是 序列化 和 反序列化 ?     序列化 :序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化.可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间.序 ...

  7. 【Android 界面效果40】Android4.0-Fragment框架实现方式剖析(一)

    经过反复的学习对比,个人觉得带着问题学习新知是最有效的学习方式,因此文本就以提问的方式来讲述Fragment框架实现方式. 1.什么是Fragment? Fragment包含在Activity中,Fr ...

  8. H5神器之canvas应用——网页修改保存图片

    因为最近项目上的要求,需要在页面中可以对一张图片进行涂改和添加文字,然后再保存到(服务器)本地,因为也是第一次接触这方面的,然后爬网页啊爬网页,之后发现了一款adobe开发的一款插件,适合 Anroi ...

  9. js的时间操作方法

    1.js获取系统时间格式为YYYY-MM-DD HH:MM:SS 1 function curDateTime(){ 2 var d = new Date(); 3 var year = d.getY ...

  10. oracle冷备份

    windows环境下Oracle数据库冷备份和恢复 1.点击开始菜单的“运行”,输入sqlplus/nolog 2.在弹出的命令行窗口以sysdba身份登陆,要输入:系统用户名/登陆密码@数据库实例名 ...