我发现我可以创建一个共享内存对象并使用 给它表面上任何大小ftruncate
,而不管我的系统上的资源限制如何。下面的代码将大小设置为 262 TB,并且确实stat()
报告了该大小。然而,262 TB 比我的安装要大/dev/shm
,而且我的系统上绝对没有 262 TB 的内存或交换可用。我预计会出现 OOM 错误,但我没有看到系统内存使用量发生显着变化。
这里发生了什么?为什么ftruncate
超出系统资源限制的大小会成功?ftruncate
我假设共享内存对象(或者更一般地说,与 tmpfs)之间存在一些特殊的交互。
import os
import _posixshmem
try:
fd = _posixshmem.shm_open("test", os.O_CREAT | os.O_EXCL | os.O_RDWR, mode=0o600)
os.ftruncate(fd, 52428800 * 5000000)
print(os.stat(fd))
finally:
_posixshmem.shm_unlink("test")
os.stat_result(st_mode=33152, st_ino=244, st_dev=24, st_nlink=1, st_uid=1000, st_gid=100, st_size=262144000000000, st_atime=1693167355, st_mtime=1693167355, st_ctime=1693167355)