Linux 内存管理

Memory 相关的术语说明

  • Main Memory - 也经常称为 Physical Memory,计算机上的 Fast Data Storage Area。
  • Virtual Memory - Main Memory 的一个抽象层,他几乎有无限大的空间,Virtual Memory 不是 Main Memory
  • Resident Memory - 驻留(Reside)在 Main Memory 中的内存,相当于实际使用的物理内存(Main Memory/Physical Memory),如 top 命令中的 RESps aux 命令中的 RSS 就是指 Resident Memory.
  • Anonymous Memory - 未关联文件系统位置和路径的内存,通常指 Process Address Space 中的程序运行过程中的数据(Working Data),通常被称为 Heap
  • Address Space - 内存地址空间,内存地址相关的上下文(Context),包含程序(Processes)和内核(Kernel)使用的 Virtual Address Space
  • Segment - 用于标识 Virtual Memory 中的有特殊作用的一个区域,如可执行程序(Executable)或可写(Writable)的 Page
  • Instruction Text - CPU 指令(Instructions) 在内存中的引用地址,通常位于 Segment
  • OOM - Out Of Memory,当内核检测到系统可用内存不足时采取的动作
  • Page - OS 和 CPU 使用和分配内存的单位,早期大小一般为 4 或 8 Kbytes,现代化的 CPU 和 OS 通常支持 Multi Page Sizes
  • Page Fault - 通常在需要访问的内容不存在于 Virtual Memory 中时,系统产生一个中断,导致所需内容加载入内存
  • Paging - 当内存中的内容不再使用或内存空间不足时进行的在内存和 Storage Devices 中的内容交换,主要是为了空出内存供需要内存的进程使用
  • Swapping - Linux 中将不再使用或内存空间不足时,将部分内存中的内容 Paging 到 Swap Devices
  • Swap - Linux 中 Swapping 时,将内容转移到的目标,可能是 Storage Devices 上的一个区域,被称为 Physical Swap Device,或者是一个文件系统文件,称为 Swap File。

Memory 部分概念详细说明参考

MMU

Memory Management Unit(MMU) 负责虚拟内存地址(Virtual Memory Address)到物理内存地址(Physical Memory Address)的转换

Freeing Memory

当系统上可用内存低或不足时,系统会采用一系列的手段释放内存。主要包括下图所示方式

  • Free List
    不在使用中的 Pages 列表,也称为 Idle Memory,这部分内存可以被系统立即分配给需要的程序使用
  • Page Cache
    文件系统缓存(Filesystem Cache)。有个 swappiness 的参数可以配置系统是使用 Page Cache 还是 Swapping 来释放内存
  • Swapping
    通过内核进程 kswapd 实现 Paging Out 到 Swap Device 或者 File System-Based Swap File,这只有在系统上有 Swap 时才有用。
  • Reaping
    也被称为 Shrinking ,当系统可用内存小到一个临界值后,内核就会开始释放可以回收的内存
  • OOM Killer
    Out Of Memory Killer ,系统内存不足时,系统会使用 OOM Killer 机制来 kill 掉某个进程来释放内存。

在 Linux 中,当系统可用内存低于阈值(vm.min_free_kbytes)时,Page Out Daemon(kswapd) 会启动 Page Scanning

进程的内存分层结构

进程的内存结构一般被分成多个 segment,包括

  • Executable Text segment - 存放程序代码(the executable CPU Instructions), 只读
  • Executable Data section - 存放程序初始化全局变量(global variables),通常 可读写 ,写权限用于程序运行期间更新变量值。
  • Heap section - 程序运行过程中动态分配的内存,属于 Anonymous Memory
  • Stack section - 调用程序功能时的临时数据存储,如函数参数、返回地址、本地变量等。

下图展示了 C 程序(Program)在内存中的分层结构(layout of a C program in memory)

  • 其中, Data section 被分成了 2 部分,包括 (a) initialized data(b) uninitialized data

使用 GNU 工具 size 可以检查 Projram 在磁盘上的 内存布局。这些值在程序编译时确定,并不会在程序运行时变化,因此它们是固定不变的。

# size /usr/sbin/sshd
text data bss dec hex filename
817397 15460 37664 870521 d4879 /usr/sbin/sshd

输出信息中:

  • text : 代表 Text section 的大小
  • data : 初始化数据段(initialized data)的大小,包含已初始化的全局和静态变量。
  • bss : 未初始化数据段的大小,包含未初始化的全局和静态变量。
  • dec : 上述所有部分的总大小,以十进制表示。
  • hex : 上述所有部分的总大小,以十六进制表示。

Memory Paging

Memory Paging 说明

查看内存分页大小

# getconf PAGESIZE
4096

清除系统内存中的分页缓存

如果系统内存不足或者定位内存相关问题,需要清空内存中的分页缓存(Memory Page Cache,将当前没有使用的所有内存分页要么写回到磁盘,要么丢弃),可以使用以下方法

  • echo 3 > /proc/sys/vm/drop_caches

内存状态监测工具

NUMA 架构及其性能统计数据

NUMA(Non-Uniform Memory Access) 架构是有多个处理器插槽(Multiple Processor Sockets)的系统常用 CPU Memory 架构。 NUMA 概念说明

使用 lscpu 命令可以查看系统上的 NUMA 信息,示例如下:

# lscpu
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
CPU(s): 56
On-line CPU(s) list: 0-55
Thread(s) per core: 2
Core(s) per socket: 14
Socket(s): 2
NUMA node(s): 2
Vendor ID: GenuineIntel
CPU family: 6
Model: 79
Model name: Intel(R) Xeon(R) CPU E5-2680 v4 @ 2.40GHz
Stepping: 1
CPU MHz: 1200.439
CPU max MHz: 3300.0000
CPU min MHz: 1200.0000
BogoMIPS: 4800.21
Hypervisor vendor: VT-x
L1d cache: 32K
L1i cache: 32K
L2 cache: 256K
L3 cache: 35840K
NUMA node0 CPU(s): 0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40,42,44,46,48,50,52,54
NUMA node1 CPU(s): 1,3,5,7,9,11,13,15,17,19,21,23,25,27,29,31,33,35,37,39,41,43,45,47,49,51,53,55
Flags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc aperfmperf eagerfpu pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch epb cat_l3 cdp_l3 invpcid_single ssbd rsb_ctxsw ibrs ibpb stibp tpr_shadow vnmi flexpriority ept vpid fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm cqm rdt_a rdseed adx smap intel_pt xsaveopt cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local dtherm ida arat pln pts md_clear spec_ctrl intel_stibp flush_l1d

根据如上输出,可以得到以下 CPU 和 内存以及 NUMA 相关信息:

  • Socket(s): 2 : 系统上存在 2 个物理处理器(2 个插槽中)
  • Core(s) per socket: 14 : 每个物理处理器有 14 个核心(Core)
  • Thread(s) per core : 每个 Core 上有 2 个物理线程(即 2 个 CPU)。
  • CPU(s): 56 : 根据以上的信息,系统上总的 CPU 个数为 2(Sockets) * 14(Cores) * 2(Threads) = 56 CPUs
  • On-line CPU(s) list: 0-55 : 所有 CPUs 都可正常工作(On-line),CPU 编号为 0-55
  • NUMA node(s): 2 : 这 56 个 CPU 被划分为 2 个 NUMA 节点(Node),分别为 NUMA node0NUMA node1
  • NUMA node0 CPU(s)NUMA node0 包含了编号为 0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40,42,44,46,48,50,52,54 的 CPU
  • NUMA node1 CPU(s)NUMA node1 包含了编号为 1,3,5,7,9,11,13,15,17,19,21,23,25,27,29,31,33,35,37,39,41,43,45,47,49,51,53,55 的 CPU

numastat

numastat 命令提供了 NUMA 相关的统计数据。numastatnumactl 包中,可能需要安装。通过 numastat 数据,可以有效定位 NUMA 相关的性能瓶颈并进行优化。

# numastat 
node0 node1
numa_hit 6095298439 1325526809
numa_miss 549449041 871134026
numa_foreign 871134026 549449041
interleave_hit 34449 34600
local_node 6095331131 1325556133
other_node 549416349 871104702

以上示例显示系统上存在 2 个 NUMA Node,分别为 node0node1,其他参数说明如下:

  • numa_hit : 该值表示处理器访问本地 NUMA 节点内存的次数。例如,node0 的值为 6095298439,意味着 node0 处理器访问其本地内存的次数为 6095298439 次。
  • numa_miss : 该值表示处理器访问远程 NUMA 节点内存的次数,即访问不属于当前节点的内存。例如,node0 的值为 549449041,意味着 node0 处理器访问 node1 的内存的次数为 549449041 次。
  • numa_foreign : 该值表示远程内存的访问次数,numa_foreign 等同于 numa_miss,只是它特别指向其他 NUMA 节点访问本节点的次数。
  • interleave_hit : 该值表示跨节点间交替分配的内存访问命中的次数。在一些内存配置中,内存被分配为交替访问模式。例如,node0 的值为 34449,意味着有 34449 次跨节点交替分配的内存访问命中。
  • local_node : 该值表示从当前节点访问本地节点内存的次数。例如,node0 的值为 6095331131,意味着 node0 节点访问了本地节点的内存 6095331131 次。
  • other_node : 该值表示从当前节点访问其他节点的内存的次数。例如,node0 的值为 549416349,意味着 node0 节点访问了其他节点(node1)的内存 549416349 次。

如果要管理和分配 NUMA Node 内存和 CPU 分配,可以使用 Linux 内核提供的 NUMA 管理工具 numactrl

查看每个 NUMA Node 的内存使用详细情况

# free -h
total used free shared buff/cache available
Mem: 94G 85G 6.2G 27M 2.6G 8.2G
Swap: 31G 31G 0B


# numastat -m

Per-node system memory usage (in MBs):
Node 0 Node 1 Total
--------------- --------------- ---------------
MemTotal 48039.76 48379.14 96418.90
MemFree 5300.99 52.67 5353.66
MemUsed 42738.77 48326.47 91065.24
Active 32927.99 45329.47 78257.46
Inactive 3676.32 2161.68 5838.00
Active(anon) 32791.08 45328.27 78119.35
Inactive(anon) 3326.99 2158.76 5485.75
Active(file) 136.91 1.20 138.11
Inactive(file) 349.33 2.92 352.25
Unevictable 0.00 0.00 0.00
Mlocked 0.00 0.00 0.00
Dirty 0.52 0.00 0.52
Writeback 0.00 0.00 0.00
FilePages 540.79 14.50 555.29
Mapped 47.16 8.71 55.88
AnonPages 36064.04 47476.64 83540.68
Shmem 17.97 9.51 27.48
KernelStack 8.41 5.19 13.59
PageTables 88.83 160.49 249.32
NFS_Unstable 0.00 0.00 0.00
Bounce 0.00 0.00 0.00
WritebackTmp 0.00 0.00 0.00
Slab 3835.94 120.64 3956.58
SReclaimable 3429.04 39.62 3468.66
SUnreclaim 406.89 81.02 487.92
AnonHugePages 638.00 376.00 1014.00
HugePages_Total 0.00 0.00 0.00
HugePages_Free 0.00 0.00 0.00
HugePages_Surp 0.00 0.00 0.00

以上输出中,相关字段说明如下:

  • Active : 活跃的内存页,即最近使用过的页,分为 Active(anon) (匿名页)和 Active(file) (文件页)。
  • Inactive : 非活跃的内存页,可能被交换或回收,分为 Inactive(anon) (匿名页)和 Inactive(file) (文件页)。
  • Anonymous Pages : 匿名页,通常是分配给进程的堆或栈,即程序运行过程中产生的数据
  • File Pages : 文件缓存页,通常用于文件缓存
  • Dirty : 脏页,尚未写入磁盘的页。文件在内存中已经更改,但是还未刷新写入磁盘
  • Writeback : 正在写回磁盘的页。
  • Mapped : 被映射到进程地址空间的内存页。
  • AnonPages : 匿名页的总量。包括 Active(anon)Inactive(anon)
  • Shmem : 使用共享内存的页。
  • KernelStack : 分配给内核栈的内存。

根据以上输出信息可知,目前系统可用内存还有 8.2G,已使用 85G,根据 numastat -m 输出的信息,可以看到更为详细的内存使用情况:

  • Node 0 的可用内存较多(5300.99 MB),而 Node 1 几乎没有可用内存(52.67 MB)。
  • Node 1 的 ActiveAnonPages 比 Node 0 高,可能表示有大量的进程绑定在 Node 1。
  • 匿名页(AnonPages)占据了绝大部分内存(总计 83540.68 MB),表明进程分配的堆和栈内存较多。
  • 文件页(FilePages)总计只有 555.29 MB,说明系统的 I/O 缓存使用较少,可能 I/O 压力较低。

根据以上分析,可以大致通过以下思路优化内存使用:

  • Node 1 的内存使用接近极限(MemFree52.67 MB)。如果可能,重新分配负载,平衡 NUMA 节点的内存压力。
  • 如果内存分配倾斜严重,可以调整进程绑定策略(如使用 numactl 或调整应用程序配置)。
  • 匿名内存占用过高,可能需要分析应用程序的内存使用情况,优化分配或减少内存泄漏。
  • 如果适用,可以启用大页(HugePages),减少页表开销。

查看指定进程在 NUMA Node 上的内存统计数据 ,可以看到进程在各个 NUMA Nodes 上使用的内存,进程可以使用 PID 或者进程名指定,具体规则请查看 man numastat

# numastat -p nginx 

Per-node process memory usage (in MBs)
PID Node 0 Node 1 Total
--------------------- --------------- --------------- ---------------
19093 (nginx) 1.14 2.68 3.82
19094 (nginx) 111.97 22.85 134.82
19095 (nginx) 111.82 22.86 134.67
19096 (nginx) 108.61 26.57 135.18
19097 (nginx) 133.85 0.78 134.63
19098 (nginx) 134.07 0.78 134.86
19099 (nginx) 115.19 19.42 134.61
19100 (nginx) 133.68 0.78 134.46
19101 (nginx) 133.92 0.78 134.70
19102 (nginx) 120.01 15.09 135.10
19103 (nginx) 134.19 0.78 134.97
19104 (nginx) 117.56 17.11 134.67
19105 (nginx) 134.18 0.78 134.96
19107 (nginx) 123.85 10.89 134.74
19108 (nginx) 133.75 0.78 134.53
19109 (nginx) 125.45 9.31 134.76
19110 (nginx) 125.35 9.88 135.23
19111 (nginx) 127.91 7.35 135.26
19112 (nginx) 129.58 6.88 136.45
19113 (nginx) 133.79 0.78 134.57
19114 (nginx) 127.70 7.44 135.13
19115 (nginx) 1.40 3.73 5.13
23050 (node_exporter) 16.91 0.02 16.93
--------------------- --------------- --------------- ---------------
Total 2535.86 188.34 2724.19

pmap

pmap 命令会显示进程的 Memory Mappings(内存地址映射),包括 内存地址大小权限Mapped Objects(映射的对象) 。详细说明请参考 man pmap

# pmap 19112
19112: nginx: worker process
0000000000400000 1052K r-x-- nginx
0000000000706000 4K r---- nginx
0000000000707000 88K rw--- nginx
000000000071d000 208K rw--- [ anon ]
00007f520dcf1000 5120K rw-s- zero (deleted)
00007f520e1f1000 48K r-x-- libnss_files-2.17.so
00007f520e628000 4K rw--- libselinux.so.1
00007f520e629000 8K rw--- [ anon ]
00007f520e62b000 88K r-x-- libresolv-2.17.so
00007f520ea47000 4K r---- libkeyutils.so.1.5
00007f520ea48000 4K rw--- libkeyutils.so.1.5
00007f520ea49000 56K r-x-- libkrb5support.so.0.1
00007f520ee6d000 4K r---- libgcc_s-4.8.5-20150702.so.1
00007f520ee6e000 4K rw--- libgcc_s-4.8.5-20150702.so.1
00007f520ee6f000 1028K r-x-- libm-2.17.so
00007f520f462000 8K rw--- libstdc++.so.6.0.19
00007f520f479000 196K r-x-- libk5crypto.so.3.1
...
00007f5211991000 4K rw--- [ anon ]
00007fff7b380000 132K rw--- [ stack ]
00007fff7b3a6000 8K r-x-- [ anon ]
ffffffffff600000 4K r-x-- [ anon ]
total 215628K

使用 -x, --extended 选项显示扩展信息,主要是显示更为详细的 Virtual Memory 和 RSS 信息

# pmap -x 19112
19112: nginx: worker process
Address Kbytes RSS Dirty Mode Mapping
0000000000400000 1052 476 0 r-x-- nginx
0000000000706000 4 4 4 r---- nginx
0000000000707000 88 84 76 rw--- nginx
000000000071d000 208 28 28 rw--- [ anon ]
...
ffffffffff600000 4 0 0 r-x-- [ anon ]
---------------- ------- ------- -------
total kB 215628 139768 137324

使用 -X 或者 -XX 选项显示更详细的扩展信息

# pmap -X 19112
19112: nginx: worker process
Address Perm Offset Device Inode Size Rss Pss Referenced Anonymous Swap Locked Mapping
00400000 r-xp 00000000 08:04 10741908403 1052 476 26 476 0 0 0 nginx
00706000 r--p 00106000 08:04 10741908403 4 4 0 4 4 0 0 nginx
00707000 rw-p 00107000 08:04 10741908403 88 84 22 84 76 0 0 nginx
0071d000 rw-p 00000000 00:00 0 208 28 20 24 28 0 0
00f5b000 rw-p 00000000 00:00 0 3912 3912 3282 3564 3912 0 0 [heap]
0132d000 rw-p 00000000 00:00 0 2092 1964 1964 1936 1964 0 0 [heap]
7f5204c61000 rw-p 00000000 00:00 0 132672 130720 130720 124988 130720 0 0
7f520cdf1000 rw-s 00000000 00:04 811209810 10240 0 0 0 0 0 0 zero (deleted)
7f520d7f1000 rw-s 00000000 00:04 811209809 5120 0 0 0 0 0 0 zero (deleted)
7f520dcf1000 rw-s 00000000 00:04 811209808 5120 0 0 0 0 0 0 zero (deleted)
7f520e1f1000 r-xp 00000000 08:04 12884906638 48 8 0 8 0 0 0 libnss_files-2.17.so
7f520e1fd000 ---p 0000c000 08:04 12884906638 2044 0 0 0 0 0 0 libnss_files-2.17.so

使用 -p, --show-path 选项显示更详细的引用路径信息

# pmap -x -p 19112
19112: nginx: worker process
Address Kbytes RSS Dirty Mode Mapping
0000000000400000 1052 476 0 r-x-- /usr/local/nginx/sbin/nginx
0000000000706000 4 4 4 r---- /usr/local/nginx/sbin/nginx
0000000000707000 88 84 76 rw--- /usr/local/nginx/sbin/nginx
000000000071d000 208 28 28 rw--- [ anon ]
0000000000f5b000 3912 3912 3912 rw--- [ anon ]

Memory Paging 性能数据监控

sar 命令的 -B Paging statistics 选项提供了内存 Paging 相关的统计数据。 sar -B 命令及输出字段解释

vmstat

vmstat 是一个系统全局性(System Wide)工具,主要用来监测 Virtual 和 Physical Memory 的统计数据

vmstat 使用介绍

PSI

PSI(Pressure Stall Information) 是 Linux 4.20 引进的一个新特性,用于提供有关 CPU、内存和 IO 子系统的资源压力信息。PSI 帮助管理员和开发者理解系统的资源瓶颈,优化性能和可靠性。

PSI 介绍

# cat /proc/pressure/memory
some avg10=2.84 avg60=1.23 avg300=0.32 total=1468344
full avg10=1.85 avg60=0.66 avg300=0.16 total=702578

在以上的 PSI 统计数据中,可以看出 Memory 压力在持续增加,10s 的平均延迟(2.84)比 300s 的平均延迟(0.32)大了很多。 这个延迟表述的是进程因为内存原因暂停等待的时间占比

OOM

OOM (Out-Of-memory) 是 Linux 内核机制(kernel reaper routine),用来确保系统始终有可用内存。当系统可用内存太低时,系统使用 OOM 机制 Kill 掉选中的进程以释放内存空间。Linux 中的每个进程有一个 OOM Score值,值越大,被 Kill 掉的可能性越大,OOM 值是根据所使用的内存占比计算而来,占用内存比例越高,OOM Score 越大。可以在 /proc/<PID>/oom_score 中看到 OOM Score 值

Linux 内存调节参数

下表列出一些常见的 Linux (Kernel 5.3)内存相关的调节参数,具体参数根据内核版本可能有所不同,其使用场景和含义需要查看对应内核版本的相关文档

Option Default Value Description Examples
vm.dirty_background_bytes
/proc/sys/vm/dirty_background_bytes
0 bytes 0 表示使用 vm.dirty_background_ratio 来决定将内存脏页(Memroy Dirty Pages)写回磁盘的阈值而不是使用 vm.dirty_background_bytes
- 设置为相对较高的值,会使内存中的数据延迟写入磁盘,产生较小的 IOPS,但是可能会导致数据不一致或丢失
- 设置为相对较低的值,会使内存数据及时写入磁盘,导致 IOPS 较高,数据丢失或不一致的风险较低
vm.dirty_background_ratio
/proc/sys/vm/dirty_background_ratio
10 默认当内存脏页数据达到内存大小的 10% 时,在后台触发 per-bdi writeback(Linux 早期(Linux 内核 3.0 之前)由 pdflush 负责处理脏页(dirty pages)写回磁盘的机制)将脏页数据写回磁盘。回写(Write-Back)操作由统一的内核线程 kworkerflush-<设备名> 处理
vm.dirty_bytes
/proc/sys/vm/dirty_bytes
0 bytes 定义强制写回的脏页阈值(以字节为单位)。
vm.dirty_ratio
/proc/sys/vm/dirty_ratio
20 定义强制写回的脏页阈值(以总内存的百分比表示)。
vm.dirty_writeback_centisecs
/proc/sys/vm/dirty_writeback_centisecs
500 定义写回线程的执行间隔(以百分之一秒为单位)。
vm.dirty_expire_centisecs
/proc/sys/vm/dirty_expire_centisecs
3000 定义脏页的最大“年龄”(超过这个时间的脏页会被优先写回)。
如需手动执行写回操作,可以使用命令 sync
vm.min_free_kbytes
/proc/sys/vm/min_free_kbytes
通常为 min_free_kbytes = sqrt(总内存 * 16) 控制系统保留的最小空闲内存量(以 KB 为单位),确保系统在内存压力下仍有足够的内存用于关键操作,如处理中断、内核操作等。
如果设置过小
- 系统可能在内存紧张时无法及时回收内存,导致性能下降。
- 网络流量或 I/O 密集型任务可能因内存分配失败而中断。
- 可能增加系统触发 OOM(Out-Of-Memory)的风险。
如果设置过大
- 系统可用内存减少,因为更多内存被预留。
- 可能导致用户空间任务频繁触发内存回收,降低整体性能。

内存压力测试工具

memtester

使用 docker 运行工具

$ docker run --rm -it dockerpinata/memtester:1 memtester
memtester version 4.3.0 (64-bit)
Copyright (C) 2001-2012 Charles Cazabon.
Licensed under the GNU General Public License version 2 (only).

pagesize is 4096
pagesizemask is 0xfffffffffffff000
need memory argument, in MB

Usage: memtester [-p physaddrbase [-d device]] <mem>[B|K|M|G] [loops]

stress 工具

stress 是一个用于模拟系统负载的工具,可以使用它来创建临时的内存负载。通过模拟负载,系统将使用更多的内存。

yum install -y stress

使用以下命令可以创建一个临时的内存负载

stress --vm 1 --vm-bytes <MEMORY_SIZE>

dd

dd 命令可以用于创建大文件并占用磁盘空间,从而间接提升系统的内存使用率。您可以使用以下命令创建一个指定大小的临时文件

dd if=/dev/zero of=tempfile bs=1M count=<MEMORY_SIZE>

tmpfs

Linux 中 tmpfs 是一种基于内存的临时文件系统,它将内存作为存储介质,可以在需要快速读写文件的场景下使用。

注意事项

  • tmpfs 是基于内存的临时文件系统,因此上面的数据在系统重启后将丢失
  • tmpfs 文件系统使用的内存达到上限值,写入操作会失败,因此需要确保分配给 tmpfs 文件系统使用的内存适合需求
  • 要确保系统有足够的可用内存来支持挂载 tmpfs 文件系统。

tmpfs 使用步骤

  1. 创建一个目录作为文件系统挂载点
    mkdir /mnt/ramdisk/
  2. 使用 mount 命令以 tmpfs 的类型挂载文件系统
    mount -t tmpfs -o size=1G tmpfs /mnt/ramdisk/
    这将在 /mnt/ramdisk 目录下挂载一个 1GB 大小的 tmpfs 文件系统。根据需要调整 size 参数的值。之后便可以像操作其他文件系统一样在 /mnt/ramdisk 目录下读写文件。任何写入该目录的数据都将存储在内存中。

参考链接|Bibliography

Systems Performance: Enterprise and the Cloud v2

脚注