Hello DLWorld 专注

临时文件系统

内核临时文件系统介绍及使用。

临时文件系统将所有的文件保存在虚拟内存中,卸载tmpfs实例后,文件系统中的内容全部丢失。

tmpfs将所有内容放在内核caches中,自动增长或缩减以适应所包含的文件,而且可以将不需要的也交换到swap空间。文件系统最大上限可以通过remout调整。

tmpfs是以ramfs为模板创建的,区别在于增加了swapping和上限检查。另一个类似的设备是内存盘(RAM disk,/dev/ram*),它在物理内存上模拟固定大小的硬盘,可以在上面创建普通文件系统。内存盘不能swap,也不能更改大小。

tmpfs主要用途

  1. 内核内部挂载,用于共享匿名映射和SYSV共享内存,挂载目录不可见。
  2. glibc 2.2之后需要tmpfs挂载到/dev/shm,用于POSIX共享内存(shm_open/shm_unlink)。/etc/fstab中包含
 tmpfs   /dev/shm    tmpfs   defaults    0 0
  1. 挂载到/tmp或/var/tmp目录。

挂载参数

mount -t tmpfs -o size=10G,nr_inodes=10k,mode=700 tmpfs /mytmpfs

大小挂载参数

  • size,tmpfs实例的大小上限,单位字节。默认是物理内存的一半。如果超过了,可能由于OOM无法释放内存导致死锁。
  • nr_blocks,PAGE_SIZE块数量。
  • nr_inodes,inode数量,默认物理内存页数的一半。

NUMA内存分配策略

  • mpol=default,使用进程分配策略(set_mempolicy)
  • mpol=prefer:Node,优先从给定Node分配
  • mpol=bind:NodeList,仅从NodeList中分配
  • mpol=interleave,优先从每个节点轮流分配
  • mpol=interleave:NodeList,从NodeList中轮流分配
  • mpol=local,优先从本地节点分配

NodeList的格式

mpol=bind:0-3,5,7,9-15

透明大页

  • huge=
    • never
    • always
    • within_size
    • advise

通过/sys/kernel/mm/transparent_hugepage/shmem_enabled设置:

  • deny,所有的挂载都禁用大页,用于紧急情况
  • force,所有的挂载都使用大页,用于测试

附录

  1. 挂载tmpfs
root@dlw:dlworld# mount -t tmpfs -o size=5G tmpfs /home/dlworld/tmp
root@dlw:dlworld# df -h
文件系统        容量  已用  可用 已用% 挂载点
udev            7.7G     0  7.7G    0% /dev
tmpfs           1.6G  162M  1.4G   11% /run
/dev/sdc4       184G  156G   19G   90% /
tmpfs           7.8G  372M  7.4G    5% /dev/shm
tmpfs            5G  0   5G   0% /home/dlworld/tmp

默认大小为物理内存的一半。

  1. 写入
root@dlw:dlworld# free -g
              total        used        free      shared  buff/cache   available
Mem:             15           7           6           1           1           6
Swap:             0           0           0
root@dlw:dlworld# dd if=/dev/zero of=/home/dlworld/tmp/5g bs=1G count=5
5368709120 bytes (5.4 GB, 5.0 GiB) copied, 2.20169 s, 2.4 GB/s
root@dlw:dlworld# free -g
              total        used        free      shared  buff/cache   available
Mem:             15           7           1           6           6           1
Swap:             0           0           0

写入的数据占用cache空间。

  1. 增加swap分区
root@dlw:dlworld# dd if=/dev/zero of=/home/swap.img bs=1G count=4
4294967296 bytes (4.3 GB, 4.0 GiB) copied, 48.888 s, 87.9 MB/s
root@dlw:dlworld# mkswap /home/swap.img 
Setting up swapspace version 1, size = 4 GiB (4294963200 bytes)
无标签, UUID=e43ee8e3-b6bf-491a-b817-1b08901ae6a8
root@dlw:dlworld# swapon /home/swap.img 
swapon: /home/swap.img:不安全的权限 0644,建议使用 0600。
root@dlw:dlworld# free -g
              total        used        free      shared  buff/cache   available
Mem:             15           7           1           6           6           1
Swap:             3           0           3
  1. 写入超出文件系统大小的数据
[root@vdi22 ~]# dd if=/dev/zero of=/root/mytmpfs/t1 bs=1G count=1
dd: 写入"/root/mytmpfs/t1" 出错: 设备上没有空间
  1. 重新分配tmpfs大小,使用swap
root@dlw:dlworld# mount -t tmpfs -o remount,size=20G tmpfs /home/dlworld/tmp
root@dlw:dlworld# df -h
文件系统        容量  已用  可用 已用% 挂载点
tmpfs            20G  5.0G   15G   25% /home/dlworld/tmp
root@dlw:dlworld# dd if=/dev/zero of=/home/dlworld/tmp/2g bs=1G count=2
2147483648 bytes (2.1 GB, 2.0 GiB) copied, 16.2725 s, 132 MB/s
root@dlw:dlworld# free -g
              total        used        free      shared  buff/cache   available
Mem:             15           7           1           6           6           1
Swap:             3           1           2
  1. 卸载文件系统
root@dlw:dlworld# umount /home/dlworld/tmp
root@dlw:dlworld# free -g
              total        used        free      shared  buff/cache   available
Mem:             15           6           7           0           1           7
Swap:             3           0           3