【问题标题】:Should I use memory mapped files for my simple flow?我应该为我的简单流程使用内存映射文件吗?
【发布时间】:2013-09-08 13:55:01
【问题描述】:

我有兴趣实现以下简单流程:
客户端向服务器进程发送一条服务器存储的简单消息。由于消息没有任何层次结构 IMO,因此最好的方法是将其保存在文件中而不是 rdb 中。
但我想弄清楚如何优化它,因为我认为有两种选择:

  1. 服务器向客户端发送 200 OK,然后 然后 存储消息,以便 客户没有注意到任何延迟
  2. 服务器保存消息并然后发送 200OK 但随后 客户端注意到文件 I/O 的开销。

我更喜欢 (1) 的性能,但这可能会导致客户认为一切正常,而实际上从未保存过 msg(对于各种错误情况)。
所以我在考虑是否可以使用 nio 和内存映射文件。
但我想知道这是使用 mem 映射文件的好选择吗?将使用内存映射文件保证例如如果进程崩溃了,消息会被保存吗?
在我看来,流程将创建/打开和关闭许多文件,所以这是内存映射文件的良好候选者吗?

【问题讨论】:

  • 文件 I/O 非常快,因为数据缓存在磁盘缓存 RAM 中。在测量之前我不会打扰;解决方案 1 不安全!
  • @BasileStarynkevitch:如果 I/O 如此之快,那么为什么我们有内存映射选项?
  • mmap 可用于大量 I/O - 但如果它有用,您必须进行基准测试(有时mmap 可能会减慢速度)。在你的情况下,网络也可能是一个瓶颈......
  • @BasileStarynkevitch:为什么我需要在这里进行基准测试?对我来说,很明显访问 HD 本身就很慢。除非我们使用我不使用的 SSD。
  • 因为如果数据留在缓存中,文件 I/O 不需要做实际的磁盘 IO。见linuxatemyram.com等...

标签: java tcp io nio memory-mapped-files


【解决方案1】:

服务器保存消息然后发送 200OK 但随后客户端注意到文件 I/O 的开销。

我建议你测试一下。我怀疑人类会注意到 10 毫秒的延迟,我希望您在处理较小的消息时会得到比这更好的结果。

所以我在考虑是否可以使用 nio 和内存映射文件。

我使用内存映射,因为它可以将每次写入的开销减少多达 5 微秒。这对你很重要吗?如果没有,我会坚持最简单的方法。

将使用内存映射文件保证例如如果进程崩溃了,消息会被保存吗?

只要操作系统不崩溃,就可以。

在我看来,流程会创建/打开和关闭许多文件,所以这是内存映射文件的好候选吗?

打开和关闭文件可能比写入数据更快更昂贵。 (按数量级)我建议将此类操作保持在最低限度。

你可能会觉得我的这个图书馆很有趣。 https://github.com/peter-lawrey/Java-Chronicle 它允许您以单位数微秒的顺序保存消息,对于文本,以亚微秒的顺序保存小二进制消息。

【讨论】:

  • 我从未说过客户端会是人类。客户端将是客户端应用程序
  • 我一定会检查你的图书馆。这个描述persisted, messaging and event driven in memory database 似乎是矛盾的。它是内存中的还是持久的?
  • I use memory mapping as it can reduce the overhead per write by up to 5 micro-second。好处是只快了 5 毫秒还是总开销只有 5 毫秒?
  • @Cratylus 5 微秒是 0.005 毫秒。 ;) 好处通常要小得多。更接近 2 微秒或 0.002 毫秒。
  • @Cratylus 它是“在内存中”和“持久化”的,即它具有内存中的性能,但也被操作系统持久化。
猜你喜欢
  • 2021-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多