You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让Linux为大内存映射文件分配更多页缓存内存?

问题场景

在Linux aarch64架构设备上,以只读方式映射6.54 GiB文件时出现以下异常:

  • kswapd进程占用大量CPU资源
  • 文件驻留内存仅约4.4GB,未充分利用系统可用内存
  • 当映射大小降至4400MB以下时,分页现象消失

测试代码

int fd=open(argv[1],O_RDONLY);
size_t file_size=(1LL<<20)*4400;
int8_t*buffer=(int8_t*)mmap(NULL,file_size,PROT_READ,MAP_SHARED/*|MAP_HUGETLB*/,fd,0);
if(buffer == MAP_FAILED)
  throw 0;
while(true)
{
  int64_t sum=0;
  for(size_t i=0;i<file_size;i+=8)
    sum+=*(int64_t*)&buffer[i];
  cout<<sum<<endl;
}

当前系统内存状态(/proc/meminfo)

MemTotal:        7833640 kB
MemFree:         2383724 kB
MemAvailable:    7006316 kB
Buffers:            1568 kB
Cached:          4574996 kB
解决方法

Linux页缓存的分配受内核内存管理参数约束,可通过以下调整让页缓存更充分利用可用内存:

1. 调整vm.min_free_kbytes

该参数控制系统必须保留的最小空闲内存阈值,降低它可释放更多内存给页缓存:

  • 查看当前值:cat /proc/sys/vm/min_free_kbytes
  • 临时调整(重启失效):echo 65536 > /proc/sys/vm/min_free_kbytes(建议设为总内存的1%-2%,按需调整)
  • 永久生效:编辑/etc/sysctl.conf,添加vm.min_free_kbytes = 65536,执行sysctl -p应用配置

2. 调整vm.vfs_cache_pressure

该参数控制内核回收页缓存的优先级,值越低,内核越倾向于保留页缓存:

  • 查看当前值:cat /proc/sys/vm/vfs_cache_pressure(默认值通常为100)
  • 临时调整:echo 50 > /proc/sys/vm/vfs_cache_pressure
  • 永久生效:编辑/etc/sysctl.conf,添加vm.vfs_cache_pressure = 50,执行sysctl -p应用配置

3. 优化mmap调用预加载页缓存

修改mmap参数,添加MAP_POPULATE标志,让内核提前将文件内容加载到页缓存:

int8_t*buffer=(int8_t*)mmap(NULL,file_size,PROT_READ,MAP_SHARED|MAP_POPULATE,fd,0);

注:该操作会一次性申请对应内存,可能导致短时间内存占用飙升,需根据系统负载评估使用。

4. 检查并处理内存碎片

内存碎片化会影响页缓存的连续内存分配:

  • 查看碎片情况:cat /proc/buddyinfo
  • 若碎片严重,可尝试重启系统(生产环境需谨慎操作)

内容的提问来源于stack exchange,提问作者Yale Zhang

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 16:32:49