SSD的低延迟键值存储

时间:2012-05-14 05:13:27

标签: database performance nosql key-value ssd

我们正在开发具有以下属性的SSD支持的键值解决方案:

  • 吞吐量:10000 TPS; 50/50看/得;
  • 延迟:平均1ms,第99.9百分位10ms
  • 数据量:约10亿个值,每个约150个字节; 64位密钥;随机访问,20%的数据适合RAM

我们在商用SSD上尝试了KyotoCabinet,LevelDB和RethinkDB,使用不同的Linux IO调度程序,ext3 / xfs文件系统;使用Rebench进行了多次测试;并发现在所有情况下:

  • 只读吞吐量/延迟非常好
  • 整个写入/更新是适度的,但有许多高延迟异常值
  • 即使在直接访问块设备(绕过文件系统)的情况下,混合读/写工作负载也会导致吞吐量/延迟的灾难性振荡

下图说明了KyotoCabinet的这种行为(横轴是时间,三个时段清晰可见 - 只读,混合,仅更新)。

问题是:是否可以使用SSD实现所述SLA的低延迟以及推荐使用哪些键值存储?

enter image description here

4 个答案:

答案 0 :(得分:3)

高度变异的写入延迟是SSD(尤其是消费者模型)的常见属性。在AnandTech review中有一个很好的解释原因。

总结是随着磨损平衡开销的增加,SSD写入性能随着时间的推移而恶化。随着驱动器上空闲页面的数量减少,NAND控制器必须开始对页面进行碎片整理,这会导致延迟。 NAND还必须构建LBA以阻止映射以跟踪跨各种NAND块的数据的随机分布。随着地图的增长,地图上的操作(插入,删除)将变慢。

您无法使用SW方法解决低级硬件问题,您需要升级到企业级SSD或放宽延迟要求。

答案 1 :(得分:1)

Aerospike是一个较新的键/值(行)存储,它可以完全脱离SSD,并且<读/写的延迟为1ms,TPS非常高(达到数百万)。

SSD具有良好的随机读取访问权限,但减少写入差异的关键是使用顺序IO(这类似于常规硬盘)。它还可以大大降低SSD上大量写入时可能出现的磨损均衡和褪色。

如果您正在构建自己的键值系统,请使用日志结构方法(如Aerospike),以便批量写入并以大块形式附加/写入。内存索引可以维护值的正确数据位置,而后台进程可以清除磁盘中的陈旧/已删除数据并对文件进行defrags。

答案 2 :(得分:0)

这是一种难以理解的想法,但可能是有效的。我们假设你的SSD是128GB。

  1. 在SSD上创建128GB交换分区
  2. 配置您的计算机以将其用作交换
  3. 在机器上设置memcached并设置128GB内存限制
  4. 基准
  5. 内核是否能够足够快地进出内容?没办法知道。这更多地取决于你的硬件而不是内核。

    Poul-Henning Kamp通过让内核跟踪Varnish的事物(虚拟与物理内存)而不是让Varnish这样做,在Varnish中做了类似于此的事情。 https://www.varnish-cache.org/trac/wiki/ArchitectNotes

答案 3 :(得分:0)

NuDB专为您的用例而设计。无论数据库有多大,它都具有O(1)插入和查找功能。当前,它满足了9TB(9 TB)数据文件的需求。该库是开源的,仅标头,仅需要C ++ 11 https://github.com/CPPAlliance/NuDB