Php

apc apc.shm_segments 忽略了 apc.shm_size 在 apache2 中的行為怪異

  • April 4, 2013

這是目前的 apc.ini

extension=apc.so
apc.enabled=1
apc.ttl=86400
apc.user_ttl=86400
apc.shm_segments=1
apc.shm_size=64

這給了我

1 Segment(s) with 64.0 MBytes 
(mmap memory, pthread mutex locking)

有趣的是,根據這個只有32M應該是可能的..

cat /proc/sys/kernel/shmmax
33554432

如果我增加段,它只是沒有效果,但如果我將 shm_size 提高到 64 以上(無論段設置如何),它在 apc.php 中可見,我會收到以下錯誤:

[apc-error] apc_mmap: mmap failed: No space left on device

我需要大約 90M 的 opcache,所以根據我的理解,考慮到 shmmax 設置,我會選擇 2x32M 段……

任何人都可以想到為什麼多個段不起作用的原因?知道為什麼 64M 在 shmmax 限制為 32M 的情況下仍在工作嗎?

APC Version 3.0.19
PHP Version 5.2.0-8+etch16

和系統(lenny)…

uname -a
Linux vs210044.vserver.de 2.6.9-023stab052.4-smp #1 SMP Tue May 11 19:21:39 MSD 2010 x86_64 GNU/Linux

是的,我知道它已經過時了,還沒有機會升級,它有點複雜……

看起來 APC 的某些版本(在我的例子中是 3.0.14)似乎忽略了 apc.shm_segments 的值並使用 apc.shm_size,而且它接受的值大於每個段的最大允許大小。就像你的情況一樣。當您分配更多時,32M apache 應該掛起,至少在我的情況下是這樣。

為什麼不將 /etc/sysctl.conf 中的 shmmax 大小增加到 90M?它解決了我的問題…

我遇到過同樣的問題。您需要以 64M 的格式定義記憶體,而不僅僅是數值(參見手冊中的預設值):

apc.shm_size=64M

引用自:https://serverfault.com/questions/175948