服务器开发中常常采用共享内存来存储数据,好处有:
1. 预分配空间,性能高;
2. 服务器崩溃后,共享内存的数据还在,进程重启后可快速回复服务。(这点尤其重要)
但是,共享内存也有比较麻烦的问题:
1. 增加容量很麻烦:要先dump出数据,然后删除共享内存,再重新分配,再写入;
2. local cache带来了单点问题,机器死机或者掉电后,必然丢失数据。
于是,在某次服务器开发的时候,我尝试用内存映射文件来代替共享内存。因为内存映射文件有这样一些好处:
1. 与共享内存一样,进程重启后,数据得以保留;
2. 扩容方便:如果内存允许,我映射更大的一个内存区域就好;
3. 迁移方便:停止进程,然后把映射文件复制到另一个机器,再启动进程即可。
愿望总是美好的!使用内存映射文件后,系统常常莫名其妙地IO猛烈飚高,都是映射文件惹的祸。
首先,内存映射文件分配的是虚拟内存,等到程序访问这个区域后,发现没有对应的物理内存,会引起一个缺页中断,然后操作系统从文件对应的区域中,加载4KB的数据到page cache中。
然后,如果对这一内存区域执行写操作,数据并不立即被写往磁盘,而仅仅只是把这个page标记为脏页。当整个操作系统的脏页达到一定比例后,操作系统就会把这些脏页的数据写往磁盘,由此也就引起了IO突然飚高。
因此,当采用local cache的存储方案的时候,性能是第一个考虑点,其次才是方便进程快速恢复服务。而使用内存映射文件,必然增加了系统的IO,降低了性能,这与服务器开发的目的是违背的。
没有评论:
发表评论