使用场景
在一些场景中,比如HLS直播服务器中,当我们采用Nginx的方式,将文件发布出去的时候,这些文件的大小有限,而且访问非常集中。这种场景下IO会成为我们服务器的瓶颈,我们一般采用的方法是,将这些文件直接放入内存,或者是由内存虚拟出来的磁盘空间上。这样IO的瓶颈基本上就不存在了。
tmpfs
在Linux系统中,tmpfs可以实现我们刚才说的功能。
tmpfs是Linux/Unix系统上的一种基于内存的文件系统。tmpfs可以使用您的内存或swap分区来存储文件。由此可见,temfs主要存储暂存的文件。
linux内核中的VM子系统负责在后台管理虚拟内存资源Virtual Memory,即RAM和swap资源,透明地将RAM页移动到交换分区或从交换分区到RAM页,tmpfs文件系统需要VM子系统的页面来存储文件。tmpfs自己并不知道这些页面是在交换分区还是在RAM中;做这种决定是VM子系统的工作。tmpfs文件系统所知道的就是它正在使用某种形式的虚拟内存。
tmpfs基于内存,因而速度是相当的,另外tmpfs使用的VM资源是动态的,当删除tmpfs中文件,tmpfs 文件系统驱动程序会动态地减小文件系统并释放 VM 资源,当然在其中创建文件时也会动态的分配VM资源。另外,tmpfs不具备持久性,重启后数据不保留,原因很明显,它是基于内存的。
编译内核时,启用“Virtualmemory file system support”就可以使用tmpfs,linux kernel从2.4以后都开始支持tmpfs。目前主流的linux系统默认已启用tmpfs,如Redhat。
在Centos6.5中:
执行命令#df –h
一般可以看到已经有/dev/shm 使用的文件系统为tmpfs默认为系统内存的一半。
如果需要修改其大小,则# vi /etc/fstab中修改:
修改为512M:
tmpfs/dev/shm tmpfs defaults,size=512m 0 0
如何将某个目录设置为tmpfs
1) 使用bind
创建一个目录
#mkdir /dev/shm/nginx_pub/
#修改权限
chmod 1777 /dev/shm/nginx_pub
#mount --bind
#mount --bind /dev/shm/nginx_pub/ /home/ysten/var/
查看
#ls –ld /home/ysten/var
2) 直接mount的方式创建
# mount tmpfs /tmp -t tmpfs -o size=512M
主流应用的优化
现在很多应用已经支持了tmpfs的优化,以CentOS 的/tmp目录使用了tmpfs
1) 将squid的缓存目录cache_dir放到/tmp下
cache_dir ufs/tmp 256 16 256
重启一下squid服务,这样缓存目录都放在了tmpfs文件中了,速度不用说吧。
2) 将php的session文件放在/tmp下
通过phpinfo测试文件查看你的phpsession存储位置,如果不在/tmp下,修改php.ini文件,修改如下:
session.save_path= “/tmp”
当然如果您的网站访问量比较大,可/tmp下设置分层目录存储session,语法如下:
session.save_path=”N;/save_path”,N 为分级的级数,save_path为开始目录。
3) 将服务的socket文件放在/tmp下
如nginx.socket和mysql.sock