【发布时间】:2013-09-08 13:55:01
【问题描述】:
我有兴趣实现以下简单流程:
客户端向服务器进程发送一条服务器存储的简单消息。由于消息没有任何层次结构 IMO,因此最好的方法是将其保存在文件中而不是 rdb 中。
但我想弄清楚如何优化它,因为我认为有两种选择:
- 服务器向客户端发送 200 OK,然后 然后 存储消息,以便 客户没有注意到任何延迟
- 服务器保存消息并然后发送 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