当前位置: 首页 > news >正文

php方案 tmpfs 与共享内存速度对比: PHP 进程将高频读写的临时数据放在 /dev/shm(tmpfs)与使用 shmop 共享内存段

先说结论 Linux 内核里,shmop(SystemVSHM)底层实际上也是 tmpfs(内核内部挂了个 shmfs,本质是 tmpfs 的变体)。所以两者的物理页来源是一样的,差距在访问路径。---访问路径对比/dev/shm 用文件操作PHPfile_get_contents('/dev/shm/x')syscall(read)VFS层 → tmpfs inode → page cache 里找页 → memcpy:内核缓冲区 →PHP用户空间 每次读写都要:用户态→内核态→用户态+一次内存拷贝。 单次 syscall 开销~100300ns,高频调用累积很明显。---shmop(shmat 之后直接访问)shmget()/shmat()→ 内核在进程VA空间建一个VMA→ 指向 shmfs 的物理页PHPshmop_read()/shmop_write()→ userspace memcpy(没有 syscall) → 直接操作映射好的物理页 数据操作阶段没有模式切换,就是个内存拷贝。---内核页面分配路径/dev/shm 文件写入时:do_fault()tmpfs_fault()alloc_page()(buddy allocator) → 页插入 page cache(xarray 结构) →PTE指向这页 shmget 段第一次访问时:do_fault()shmem_fault()← 同一个函数! →alloc_page()(同一个 buddy allocator) → 页插入 shmfs 的 address_space →PTE指向这页 shmem_fault 和 tmpfs_fault 在内核里是同一套代码(mm/shmem.c),页分配路径没有本质区别。---TLB影响 正常情况(没有页被回收) 两者 mmap/shmat 之后都是: 进程A的页表:VA0x7f...PPN0x4a200(TLB缓存这条)进程B的页表:VA0x7f...PPN0x4a200(各自TLB缓存)进程A写数据 →PTE没变 → 不需要TLBshootdown → 进程B读到的是新数据(同一物理页)。 正常读写不触发TLBshootdown,两者一样。TLBshootdown 触发时机 ┌────────────────────────────┬───────────────────────────────────────────────┬──────────────┐ │ 事件 │/dev/shm │ shmop │ ├────────────────────────────┼───────────────────────────────────────────────┼──────────────┤ │ 内存压力,页被 kswapd 回收 │ 会触发(需要 unmap 所有进程的PTEIPI广播) │ 同样会触发 │ ├────────────────────────────┼───────────────────────────────────────────────┼──────────────┤ │ 进程 detach/munmap │ 触发本地TLBflush │shmdt()同样 │ ├────────────────────────────┼───────────────────────────────────────────────┼──────────────┤ │ 权限变更 mprotect │ 触发 │ 触发 │ └────────────────────────────┴───────────────────────────────────────────────┴──────────────┘ 两者TLBshootdown 行为几乎相同,因为物理页管理是同一套。 shmop 能做但/dev/shm 不好做的:大页// FFI 调用,申请 2MB 大页的 SHM 段$SHM_HUGETLB=0x0800;$key=$ffi->ftok('/tmp/k','a');$id=$ffi->shmget($key,64*1024*1024,0644|$SHM_HUGETLB|0x0200);2MB 大页(hugepage)覆盖64MB 数据: 普通4KB 页:64MB/4KB=16384TLB记录2MB 大页:64MB/2MB=32TLB记录TLB压力直接降500倍,对高频访问大块共享数据意义很大。/dev/shm 也支持大页,但要 mount 时加 huge=always,不灵活。---PHP代码对比<?php// ── 方案1:/dev/shm 文件操作(最慢,每次 syscall)──file_put_contents('/dev/shm/cache',$data);$data=file_get_contents('/dev/shm/cache');// ── 方案2:shmop(无 syscall 数据访问)──$key=ftok(__FILE__,'x');$shm=shmop_open($key,'c',0644,65536);shmop_write($shm,str_pad($data,65536,"\0"),0);// userspace memcpy$out=rtrim(shmop_read($shm,0,65536),"\0");// userspace memcpyshmop_close($shm);// shmop_delete($shm); // 段会持续存在直到删除或重启// ── 方案3:APCu(PHP 进程内,最快,序列化自动处理)──apcu_store('key',$data,60);$data=apcu_fetch('key');---实际差异总结 ┌────────────┬──────────────────┬───────────────────┬─────────────────┐ │ │/dev/shm 文件IO│ shmop │ APCu │ ├────────────┼──────────────────┼───────────────────┼─────────────────┤ │ 底层内存 │ tmpfs page cache │ shmfs(同 tmpfs) │ mmap 匿名段 │ ├────────────┼──────────────────┼───────────────────┼─────────────────┤ │ 数据操作 │ syscall+copy │ userspace memcpy │ userspace 直接 │ ├────────────┼──────────────────┼───────────────────┼─────────────────┤ │TLB行为 │ mmap 后相同 │ 相同,支持大页 │ 相同 │ ├────────────┼──────────────────┼───────────────────┼─────────────────┤ │ 跨进程 │ 文件路径 │ key(ipcs 可见) │ 同一PHP进程组 │ ├────────────┼──────────────────┼───────────────────┼─────────────────┤ │PHP序列化 │ 手动 │ 手动 │ 自动 │ └────────────┴──────────────────┴───────────────────┴─────────────────┘ 高频读写选 APCu,需要跨异构进程(比如PHP+Python 共享)选 shmop,/dev/shm 文件操作适合低频或大文件临时存储。
http://www.jsqmd.com/news/519123/

相关文章:

  • Kubectl连接K8s集群报错?教你三种方法解决x509证书无效问题(含--insecure-skip-tls-verify详解)
  • BM92S2021-A单线色彩传感器嵌入式集成与协议解析
  • Spring IOC 与 AOP 理解与使用
  • 医疗诊断提示系统的“未来趋势”:架构师分享Prompt Engineering的下一步方向
  • YOLO-World部署全攻略:从本地到云服务器的避坑指南(附权重文件下载)
  • 降AI+降重+格式修正一条龙教程:毕业论文终稿提交前必看 - 还在做实验的师兄
  • AI头像生成器企业应用:HR部门员工虚拟形象统一管理Prompt模板库建设
  • 【2025最新】基于SpringBoot+Vue的面向智慧教育实习实践系统管理系统源码+MyBatis+MySQL
  • 日式擦玻璃服务全解析:大理石结晶、宠物保洁、家电清洗、收纳整理、日式开荒保洁、日式擦玻璃、日式收纳、日式日常保洁选择指南 - 优质品牌商家
  • ABB选项功能开通指南:ROBWARE 6万能密钥授权文件操作教程
  • 学长亲荐!毕业论文全流程神器 —— 千笔·专业论文写作工具
  • 023.(实战)定制化Chromedriver编译——彻底规避Selenium指纹检测
  • 动态建模驱动的仓储空间认知能力构建与关键技术研究—— 基于镜像视界 Pixel-to-Space、多视角视频融合、三维重构与轨迹建模的空间计算框架
  • 基于深度学习的车辆识别收费管理系统
  • TCP计算器:C++网络编程入门
  • 东华复试OJ二刷复盘16
  • 基于RBP神经网络PID自适应控制模型的Matlab仿真解析与实践指导
  • 如何通过运动干预改善儿童多动症的注意力问题?
  • 基于Real-ESRGAN的文档图像增强微调:去除订书钉折痕及阴影
  • 2026下学期课前歌合集
  • 2026年心理学论文降AI率工具推荐:量表描述和数据分析部分怎么降 - 还在做实验的师兄
  • 华为交换机Sub主从IP地址配置(单个VLAN,实现多个网段互相通信)
  • 单相逆变器Matlab仿真:TCM模式和CCM模式
  • Python枚举的高级玩法:从状态机到策略模式的优雅实现
  • 第九章 动态规划part06
  • 2026年摘要和结论AI率特别高怎么办?这两个部分的针对性降AI技巧 - 还在做实验的师兄
  • Dify RAG召回优化终极方案(2026 Q1生产环境验证版)
  • 从L1到L3:图解现代CPU缓存如何影响你的游戏帧数
  • 2026年新闻传播学论文降AI工具推荐:新传同学实测好用的几款 - 还在做实验的师兄
  • Hadoop 3.3.4集群性能调优实战:基于1主3从架构的CentOS7配置详解