APC - 调整 apc.mmap_file_mask

APC - 调整 apc.mmap_file_mask

当将 APC 配置为 PHP 的操作码缓存时,有一个名为 apc.mmap_file_mask 的配置设置。据我所知,有三种方法可以配置它,但我不太明白每种方法的含义。

  1. /tmp/apc.XXXXXX-(默认)“文件支持的 mmap”
  2. /tmp/apc.shm.XXXXXX - 使用“POSIX 样式 shm_open/mmap”
  3. /dev/zero - “使用内核的 /dev/zero 接口来匿名映射内存”

来源:http://php.net/manual/en/apc.configuration.php#ini.apc.mmap-file-mask

有人能对这些发表评论并提出建议吗?我猜会有内存使用和性能影响,也许还有安全问题,但我不知道情况是否如此?从我读到的内容来看,我假设 #2 和 #3 更快,但我认为 APC 已经在使用共享内存(由 apc.shm_size 设置),所以我不明白。

答案1

/tmp/apc.XXXXXX -> 此 mmap 文件掩码是基于普通文件系统的 mmap,并使用 mkstemp 创建一个唯一的临时文件,该文件是经过 mmap 处理的。6 个“X”被替换为唯一字符串,以使文件名唯一。这只是将数据写入文件系统中的文件。

/tmp/apc.shm.XXXXXX -> 注意,在 Linux 系统上,它必须只是 /apc.shm.XXXXXX。与直接文件支持的 mmap 的区别在于,此机制通过 mktemp() 调用创建一个临时文件,并调用 shm_open(),然后创建并打开新的 POSIX 共享内存对象,或打开现有的 POSIX 共享内存对象。POSIX 共享内存对象实际上是一个句柄,可供无关进程用来映射同一共享内存区域。我之前没有尝试过,但我认为它可以有至少 3 个“X”(因此 apc.shml.XXX 也应该可以工作)。

/dev/zero -> mmap/dev/zero是一种匿名内存映射,这意味着它是没有关联文件的内存对象,所有内容都初始化为零。如果不指定 mmap_file_mask,APC 将使用匿名映射(带有标志 MAP_SHARED 和 MAP_ANON)。因此,指定/dev/zero和不指定 mmap_file_mask 是等效的,因为它们都是匿名映射。从历史上看,在内核版本 2.4 之前,Linux 中不支持 MAP_SHARED 和 MAP_ANON 一起。

从性能角度来看,3 会表现最佳,因为文件支持的 mmap'ing 具有相当多的磁盘 I/O。因此,3 一定是最快的,因为它没有备份文件并且是实际内存本身的一部分,然后是 2 和 1。然而,这只是理论,各种配置的实际基准测试可以证明现实。但是,匿名映射(和共享内存映射)的缺点是 mmap'd 内存在应用程序执行之间不是持久的,因此在重新启动时会丢失缓存。

相关内容