linux 内存文件系统使用 - tmpfs, ramfs, shmfs

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
简介: linux 内存文件系统使用 - tmpfs, ramfs, shmfs

背景

在做一些测试时,如果IO设备很烂的话,可以直接使用内存文件系统,避免IO上引入的一些开销影响测试结果。

用法很简单:

tmpfs or shmfs

mount a shmfs with a certain size to /dev/shm, and set the correct permissions.

For tmpfs you do not need to specify a size. Tmpfs or shmfs allocated memory is pageable.

For example:

Example Mount shmfs:

# mount -t shm shmfs -o size=20g /dev/shm   
  
Edit /etc/fstab:  
  
shmfs /dev/shm shm size=20g 0 0  

OR

Example Mount tmpfs:

# mount –t tmpfs tmpfs /dev/shm   
  
Edit /etc/fstab:  
  
none /dev/shm tmpfs defaults 0 0  

ramfs

ramfs is similar to shmfs, except that pages are not pageable or swappable.

This approach provides the commonly desired effect. ramfs is created by:

umount /dev/shm  
  
mount -t ramfs ramfs /dev/shm  

例子

[root@pg11-test ~]# mkdir /mnt/tmpfs  
[root@pg11-test ~]# mkdir /mnt/ramfs  

1、tmpfs

mount -t tmpfs tmpfs /mnt/tmpfs -o size=10G,noatime,nodiratime,rw  
mkdir /mnt/tmpfs/a  
chmod 777 /mnt/tmpfs/a  

2、ramfs

mount -t ramfs ramfs /mnt/ramfs -o noatime,nodiratime,rw,data=writeback,nodelalloc,nobarrier  
mkdir /mnt/ramfs/a  
chmod 777 /mnt/ramfs/a  

ramfs无法在mount时限制大小,即使限制了也不起作用,在df结果中也看不到这个挂载点,但是实际上已经挂载。

[root@pg11-test ~]# mount  
tmpfs on /mnt/tmpfs type tmpfs (rw,noatime,nodiratime,size=10485760k)  
ramfs on /mnt/ramfs type ramfs (rw,noatime,nodiratime,data=writeback,nodelalloc,nobarrier)  
  
[root@pg11-test ~]# df -h  
Filesystem                 Size  Used Avail Use% Mounted on  
/dev/vda1                  197G   17G  171G   9% /  
devtmpfs                   252G     0  252G   0% /dev  
tmpfs                      252G  936K  252G   1% /dev/shm  
tmpfs                      252G  676K  252G   1% /run  
tmpfs                      252G     0  252G   0% /sys/fs/cgroup  
/dev/mapper/vgdata01-lv03  4.0T  549G  3.5T  14% /data03  
/dev/mapper/vgdata01-lv02  4.0T  335G  3.7T   9% /data02  
/dev/mapper/vgdata01-lv01  4.0T  1.5T  2.6T  37% /data01  
tmpfs                       51G     0   51G   0% /run/user/0  
/dev/mapper/vgdata01-lv04  2.0T  621G  1.3T  32% /data04  
tmpfs                       10G     0   10G   0% /mnt/tmpfs  

内存文件系统性能

PostgreSQL fsync测试接口,测试内存文件系统fsync性能。

su - digoal  
  
  
digoal@pg11-test-> pg_test_fsync -f /mnt/tmpfs/a/1  
5 seconds per test  
O_DIRECT supported on this platform for open_datasync and open_sync.  
  
Compare file sync methods using one 8kB write:  
(in wal_sync_method preference order, except fdatasync is Linux's default)  
        open_datasync                                  n/a*  
        fdatasync                       1137033.436 ops/sec       1 usecs/op  
        fsync                           1146431.736 ops/sec       1 usecs/op  
        fsync_writethrough                              n/a  
        open_sync                                      n/a*  
* This file system and its mount options do not support direct  
  I/O, e.g. ext4 in journaled mode.  
  
Compare file sync methods using two 8kB writes:  
(in wal_sync_method preference order, except fdatasync is Linux's default)  
        open_datasync                                  n/a*  
        fdatasync                        622763.705 ops/sec       2 usecs/op  
        fsync                            625990.998 ops/sec       2 usecs/op  
        fsync_writethrough                              n/a  
        open_sync                                      n/a*  
* This file system and its mount options do not support direct  
  I/O, e.g. ext4 in journaled mode.  
  
Compare open_sync with different write sizes:  
(This is designed to compare the cost of writing 16kB in different write  
open_sync sizes.)  
         1 * 16kB open_sync write                      n/a*  
         2 *  8kB open_sync writes                     n/a*  
         4 *  4kB open_sync writes                     n/a*  
         8 *  2kB open_sync writes                     n/a*  
        16 *  1kB open_sync writes                     n/a*  
  
Test if fsync on non-write file descriptor is honored:  
(If the times are similar, fsync() can sync data written on a different  
descriptor.)  
        write, fsync, close              317779.892 ops/sec       3 usecs/op  
        write, close, fsync              317769.037 ops/sec       3 usecs/op  
  
Non-sync'ed 8kB writes:  
        write                            529490.541 ops/sec       2 usecs/op  
  
digoal@pg11-test-> pg_test_fsync -f /mnt/ramfs/a/1  
5 seconds per test  
O_DIRECT supported on this platform for open_datasync and open_sync.  
  
Compare file sync methods using one 8kB write:  
(in wal_sync_method preference order, except fdatasync is Linux's default)  
        open_datasync                                  n/a*  
        fdatasync                       1146515.453 ops/sec       1 usecs/op  
        fsync                           1149912.760 ops/sec       1 usecs/op  
        fsync_writethrough                              n/a  
        open_sync                                      n/a*  
* This file system and its mount options do not support direct  
  I/O, e.g. ext4 in journaled mode.  
  
Compare file sync methods using two 8kB writes:  
(in wal_sync_method preference order, except fdatasync is Linux's default)  
        open_datasync                                  n/a*  
        fdatasync                        621456.930 ops/sec       2 usecs/op  
        fsync                            624811.200 ops/sec       2 usecs/op  
        fsync_writethrough                              n/a  
        open_sync                                      n/a*  
* This file system and its mount options do not support direct  
  I/O, e.g. ext4 in journaled mode.  
  
Compare open_sync with different write sizes:  
(This is designed to compare the cost of writing 16kB in different write  
open_sync sizes.)  
         1 * 16kB open_sync write                      n/a*  
         2 *  8kB open_sync writes                     n/a*  
         4 *  4kB open_sync writes                     n/a*  
         8 *  2kB open_sync writes                     n/a*  
        16 *  1kB open_sync writes                     n/a*  
  
Test if fsync on non-write file descriptor is honored:  
(If the times are similar, fsync() can sync data written on a different  
descriptor.)  
        write, fsync, close              314754.770 ops/sec       3 usecs/op  
        write, close, fsync              314509.045 ops/sec       3 usecs/op  
  
Non-sync'ed 8kB writes:  
        write                            517299.869 ops/sec       2 usecs/op  

本地磁盘性能如下:

digoal@pg11-test-> pg_test_fsync -f /data01/digoal/1  
5 seconds per test  
O_DIRECT supported on this platform for open_datasync and open_sync.  
  
Compare file sync methods using one 8kB write:  
(in wal_sync_method preference order, except fdatasync is Linux's default)  
        open_datasync                     46574.176 ops/sec      21 usecs/op  
        fdatasync                         40183.743 ops/sec      25 usecs/op  
        fsync                             36875.852 ops/sec      27 usecs/op  
        fsync_writethrough                              n/a  
        open_sync                         42927.560 ops/sec      23 usecs/op  
  
Compare file sync methods using two 8kB writes:  
(in wal_sync_method preference order, except fdatasync is Linux's default)  
        open_datasync                     17121.111 ops/sec      58 usecs/op  
        fdatasync                         26438.641 ops/sec      38 usecs/op  
        fsync                             24562.907 ops/sec      41 usecs/op  
        fsync_writethrough                              n/a  
        open_sync                         15698.199 ops/sec      64 usecs/op  
  
Compare open_sync with different write sizes:  
(This is designed to compare the cost of writing 16kB in different write  
open_sync sizes.)  
         1 * 16kB open_sync write         28793.172 ops/sec      35 usecs/op  
         2 *  8kB open_sync writes        15720.156 ops/sec      64 usecs/op  
         4 *  4kB open_sync writes        10007.818 ops/sec     100 usecs/op  
         8 *  2kB open_sync writes         5698.259 ops/sec     175 usecs/op  
        16 *  1kB open_sync writes         3116.232 ops/sec     321 usecs/op  
  
Test if fsync on non-write file descriptor is honored:  
(If the times are similar, fsync() can sync data written on a different  
descriptor.)  
        write, fsync, close               33399.473 ops/sec      30 usecs/op  
        write, close, fsync               33216.001 ops/sec      30 usecs/op  
  
Non-sync'ed 8kB writes:  
        write                            376584.982 ops/sec       3 usecs/op  

性能对比,显而易见。

其他

mount hugetlbfs,使用huge page的文件系统,但是不支持read, write接口,需要使用mmap的用法。

详见

https://www.ibm.com/developerworks/cn/linux/l-cn-hugetlb/index.html

参考

https://docs.oracle.com/cd/E11882_01/server.112/e10839/appi_vlm.htm#UNXAR397

http://www.cnblogs.com/jintianfree/p/3993893.html

https://lwn.net/Articles/376606/

https://www.ibm.com/developerworks/cn/linux/l-cn-hugetlb/index.html

《PostgreSQL Huge Page 使用建议 - 大内存主机、实例注意》

PostgreSQL 许愿链接

您的愿望将传达给PG kernel hacker、数据库厂商等, 帮助提高数据库产品质量和功能, 说不定下一个PG版本就有您提出的功能点. 针对非常好的提议,奖励限量版PG文化衫、纪念品、贴纸、PG热门书籍等,奖品丰富,快来许愿。开不开森.

9.9元购买3个月阿里云RDS PostgreSQL实例

PostgreSQL 解决方案集合

相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
目录
相关文章
|
2月前
|
监控 Linux
如何检查 Linux 内存使用量是否耗尽?这 5 个命令堪称绝了!
本文介绍了在Linux系统中检查内存使用情况的5个常用命令:`free`、`top`、`vmstat`、`pidstat` 和 `/proc/meminfo` 文件,帮助用户准确监控内存状态,确保系统稳定运行。
531 6
|
2天前
|
Ubuntu Linux 开发者
Ubuntu20.04搭建嵌入式linux网络加载内核、设备树和根文件系统
使用上述U-Boot命令配置并启动嵌入式设备。如果配置正确,设备将通过TFTP加载内核和设备树,并通过NFS挂载根文件系统。
30 15
|
7天前
|
Ubuntu Unix Linux
Linux网络文件系统NFS:配置与管理指南
NFS 是 Linux 系统中常用的网络文件系统协议,通过配置和管理 NFS,可以实现跨网络的文件共享。本文详细介绍了 NFS 的安装、配置、管理和常见问题的解决方法,希望对您的工作有所帮助。通过正确配置和优化 NFS,可以显著提高文件共享的效率和安全性。
71 7
|
7天前
|
存储 运维 监控
Linux--深入理与解linux文件系统与日志文件分析
深入理解 Linux 文件系统和日志文件分析,对于系统管理员和运维工程师来说至关重要。文件系统管理涉及到文件的组织、存储和检索,而日志文件则记录了系统和应用的运行状态,是排查故障和维护系统的重要依据。通过掌握文件系统和日志文件的管理和分析技能,可以有效提升系统的稳定性和安全性。
25 7
|
2月前
|
缓存 Java Linux
如何解决 Linux 系统中内存使用量耗尽的问题?
如何解决 Linux 系统中内存使用量耗尽的问题?
149 48
|
29天前
|
安全 Linux 数据安全/隐私保护
深入Linux操作系统:文件系统和权限管理
在数字世界的海洋中,操作系统是连接用户与硬件的桥梁,而Linux作为其中的佼佼者,其文件系统和权限管理则是这座桥梁上不可或缺的结构。本文将带你探索Linux的文件系统结构,理解文件权限的重要性,并通过实际案例揭示如何有效地管理和控制这些权限。我们将一起航行在Linux的命令行海洋中,解锁文件系统的奥秘,并学习如何保护你的数据免受不必要的访问。
|
27天前
|
算法 Linux
深入探索Linux内核的内存管理机制
本文旨在为读者提供对Linux操作系统内核中内存管理机制的深入理解。通过探讨Linux内核如何高效地分配、回收和优化内存资源,我们揭示了这一复杂系统背后的原理及其对系统性能的影响。不同于常规的摘要,本文将直接进入主题,不包含背景信息或研究目的等标准部分,而是专注于技术细节和实际操作。
|
2月前
|
缓存 Ubuntu Linux
Linux环境下测试服务器的DDR5内存性能
通过使用 `memtester`和 `sysbench`等工具,可以有效地测试Linux环境下服务器的DDR5内存性能。这些工具不仅可以评估内存的读写速度,还可以检测内存中的潜在问题,帮助确保系统的稳定性和性能。通过合理配置和使用这些工具,系统管理员可以深入了解服务器内存的性能状况,为系统优化提供数据支持。
42 4
|
2月前
|
存储 运维 监控
深入Linux基础:文件系统与进程管理详解
深入Linux基础:文件系统与进程管理详解
90 8
|
2月前
|
Linux
如何在 Linux 系统中查看进程占用的内存?
如何在 Linux 系统中查看进程占用的内存?