環境是單顆 E5405 的機器,上面的作業系統是 FreeBSD 7.1,應用程式的部份是 apache 2.2 (worker) + mod_fastcgi 2.4.6 + PHP 5.2.8 + APC 3.0.19。
由於前陣子發現 PHP 在 MP 架構下效能不太好,偶而會有一堆 php-cgi 卡住,用 top 會發現卡在 “lockf” 這個狀態,這時候前端的 L4 switch 會看到 500 Internal Server Error 而把這台機器暫時離線。等到 php-cgi 慢慢消化完,前端的 L4 switch 又會抓到 200。
在 php-cgi 卡住的狀況下試著用 gdb 找原因,當時 backtrace 發現是卡在 APC 裡的 lockf,所以就有一些想法,等有空閒的時候測試。
第一個想法是把 APC 的 lockf (fcntl) 改用 IPC semaphore,這個在 ports 可以調整。重新編完後發現 php-cgi 跑不起來,後來試出來,需要同時打開 mmap support 與 IPC semaphore。
第一張是 webfront-7,跑 mmap + semaphore。第二張是 webfront-8,保持原來的 shm + fcntl (lockf):


效能有「好一點」,但很難觀察出來,實際再加上 webfront-{9,10} 比較後 (都是完全同型的伺服器),看起來 webfront-7 的效能是最好的,所以得觀察當爆量時是否會卡 lockf。
