mmap的性能

123 views
Skip to first unread message

yongcai cai

unread,
Jan 11, 2010, 6:54:24 AM1/11/10
to dev4s...@googlegroups.com

请问大伙有没有使用mmap?它跟我们使用正常memory的性能差别有多少?thx.

殷远超

unread,
Jan 12, 2010, 7:09:09 AM1/12/10
to dev4s...@googlegroups.com
这个要跟正常使用磁盘文件比较才有意义,跟使用内存比,就要看你的命中率了,命中了就是内存访问。不命中就是访问磁盘。

2010/1/11 yongcai cai <china...@gmail.com>

请问大伙有没有使用mmap?它跟我们使用正常memory的性能差别有多少?thx.


--
高性能服务器研发与运营
 http://groups.google.com/group/dev4server



--
殷远超 http://www.yinux.com

Jordan Fung

unread,
Jan 12, 2010, 7:15:35 AM1/12/10
to dev4s...@googlegroups.com
*正常*的情况下,OS内核会利用一些空闲的内存缓存打开文件的数据,如果你访问的mmap内容刚好是内核已经缓存的数据时,和普通的内存一样快;如果你访问的mmap内容刚好不在缓存中,OS会帮你从文件系统中读入内容,这时的速度和访问虚拟内存(指的是被换出到交换空间的内存页)差不多,或者会稍慢一些,因为OS一般都会优化交换分区(文件)的存取。



2010/1/12 殷远超 <yinyu...@gmail.com>
--
高性能服务器研发与运营
 http://groups.google.com/group/dev4server

yongcai cai

unread,
Jan 12, 2010, 7:43:53 AM1/12/10
to dev4s...@googlegroups.com

谢谢Jordan, 远超。在我们公司里使用的后台架构是把通讯层与业务逻辑层分开来,中间使用两个通道(mmap队列)来通讯,一个是接受数据通道,另外一个是发送数据通道。通道中的数据主要是接受请求数据(左边通道)和发送请求结果数据(右边通道)。

 

如下图:

 

通道可以不用加锁,因为在业务逻辑层是使用单线程,只对其中一个管道读,另外一个管道写。那这样的话,应该也可以直接用普通正常的memory来实现就行了。为什么还用mmap呢?是为了持久化吗?为了扩展性?这样的性能会不会带来比较大的负载呢?

 

发件人: dev4s...@googlegroups.com [mailto:dev4s...@googlegroups.com] 代表 Jordan Fung
发送时间: 2010112 20:16
收件人: dev4s...@googlegroups.com
主题: Re: mmap的性能

image001.emz
image002.png
oledata.mso

chuang

unread,
Jan 12, 2010, 7:47:33 AM1/12/10
to dev4s...@googlegroups.com
现在也许是单线程的,但是以后可能会增加线程数量,也许是为了今后的扩展方便吧.
不过如果只是队列的话,似乎mmap不是很好的选择.

2010/1/12 yongcai cai <china...@gmail.com>



--
好装B,求甚解.

豆瓣:http://www.douban.com/people/Lichuang/
blog:http://www.cppblog.com/converse/
image002.png

yongcai cai

unread,
Jan 12, 2010, 7:59:22 AM1/12/10
to dev4s...@googlegroups.com

>现在也许是单线程的,但是以后可能会增加线程数量,也许是为了今后的扩展方便吧.

 

我所指的扩展性不是线程数量的扩展,而是逻辑层处理的方便性扩展。我们的架构是比较成熟的,至少公司里已经有很好的使用例子。

 

>不过如果只是队列的话,似乎mmap不是很好的选择.

 

是类似于队列的数据结构,但节点不是定长的。但这个应该不是选择mmap的关键之处。

 

发件人: dev4s...@googlegroups.com [mailto:dev4s...@googlegroups.com] 代表 chuang
发送时间: 2010112 20:48
收件人: dev4s...@googlegroups.com
主题: Re: 答复: mmap的性能

image001.png

Jordan Fung

unread,
Jan 12, 2010, 8:44:51 AM1/12/10
to dev4s...@googlegroups.com
是啊,从健壮性角度考虑,一般情况下只推荐以只读的方式用mmap在两个进程间共享数据,如果同时需要读写,还是用管道来隔离比较好,虽然慢点(相对共享内存而言)。

2010/1/12 yongcai cai <china...@gmail.com>
--
高性能服务器研发与运营
 http://groups.google.com/group/dev4server

image001.png

qiaojie

unread,
Jan 12, 2010, 9:04:29 AM1/12/10
to dev4s...@googlegroups.com
用mmap做通讯远远不如用Socket来的好
 


 
2010/1/12 yongcai cai <china...@gmail.com>
--
高性能服务器研发与运营
 http://groups.google.com/group/dev4server

image002.png

esx

unread,
Jan 12, 2010, 9:53:00 PM1/12/10
to 高性能服务器研发与运营邮件列表
1. 我认为你的这个问题自己写个程序直接测一下就知道了,这比什么都有说服力。
2. mmap的本质是提供了一种接口,可以将操作系统的虚拟内存的机制使用起来,对文件的地址和内存地址进行了映射。
本质上来说,其在虚拟内存上挂载了OS内部的文件系统接口,当虚拟内存产生诸如page fault等情况时,会触发这类接口读写磁盘文件。
由于文件数据直接以内存的方式暴露给用户,通常来说,这种操作会减少由系统调用的性质带来的一次内存复制,因此有较多性能提升。
所以其经常被用于读取大文件,这里也有几种情况值得注意:
a.如果是类似随机的读取,则性能在IO上的损耗较大,在内存复制上的损耗较小,性能提升并不明显。b.如果是有热点的读取,且数据量较大,则
性能提升会较明显。
3. 由于mmap的特点,因此,被用在了诸如读取大文件、共享内存、缓存的地方较多;但如果是用于通信,即使是进程间通信,我认为仍有很多可选,
mmap并不一定是最适合的。有如下理由可以参考:
a. mmap不能实现多机通信,不如socket
b. mmap在多进程下的处理比较繁琐,如果不是用共享内存等机制的话,不如考虑用pipe或fifo。
c. 进程间通信,往往性能都不应该是问题。
d. 如果你是强烈要求高性能和大通讯量,那么在设计的时候应该考虑将其放在进程内部,这样的通信速度最快。


On Jan 11, 11:54 am, "yongcai cai" <chinaren...@gmail.com> wrote:
> 请问大伙有没有使用mmap?它跟我们使用正常memory的性能差别有多少?thx.

yongcai cai

unread,
Jan 13, 2010, 3:36:31 AM1/13/10
to dev4s...@googlegroups.com
Thanks esx.

-----邮件原件-----
发件人: dev4s...@googlegroups.com [mailto:dev4s...@googlegroups.com] 代
表 esx
发送时间: 2010年1月13日 10:53
收件人: 高性能服务器研发与运营邮件列表
主题: Re: mmap的性能

bobo

unread,
Jan 13, 2010, 5:06:53 AM1/13/10
to 高性能服务器研发与运营邮件列表
mmap和一般的内存存取没什么区别,你用malloc的话大于128k不也就是mmap实现的。

yongcai cai

unread,
Jan 13, 2010, 12:19:01 PM1/13/10
to dev4s...@googlegroups.com
Thanks bobo. 自己用惯了windows,对于linux内核了解还不是很深入,今天查了一下
资料,确实如你所说。Thx。

-----邮件原件-----
发件人: dev4s...@googlegroups.com [mailto:dev4s...@googlegroups.com] 代
表 bobo
发送时间: 2010年1月13日 18:07
收件人: 高性能服务器研发与运营邮件列表
主题: Re: 答复: mmap的性能

mmap和一般的内存存取没什么区别,你用malloc的话大于128k不也就是mmap实现的。
Reply all
Reply to author
Forward
0 new messages