手上有一排機器硬體規格都是一樣的, OS跟上面跑的軟體也都一模一樣.
OS是FreeBSD 7.0-RELEASE(with ULE scheduler)
跑 lighttpd + php5(fast-cgi)

但其中某兩台機器特別奇怪,
php request常常要等80sec才能跑完.(奇怪的數字@@)

經過努力把範圍narrow down之後,
發現問題是出在 mysql_pconnect()

寫了一支php小程式做測試, 發現如果是用mysql_connect()就一切正常,
但是若改用mysql_pconnect()就常常會卡住80sec @@

<?
mysql_pconnect("x.y.z","aaa","bbb");
mysql_select_db("ccc");

$sql="SELECT a FROM b";
mysql_query($sql);
echo "done";
?>

接著, trace php5-mysql 的實作, 發現 mysql_pconnect 的邏輯是這樣的:
1. 從 connection pool 挑一個出來
2. 利用 mysql_ping() 看看連線是否還活著然後決定該不該重連

看來是卡在 mysql_ping() 會卡個80sec左右的感覺.
不過我在網路上沒找到 mysql_ping() 的 timeout 是多久,
回頭翻了一下 mysql c library的code, 一時間也沒看出頭緒.

後來又努力了一陣子, 最後宣告放棄,
直接在 php.ini 加上 mysql.allow_persistent = Off 當作暫時的work-around.

真的是莫名其妙的事情, 其他台都不會這樣阿@@

有人碰過類似的狀況嗎?
創作者介紹

Izero@庶務三科 ㄎㄎㄎ~

Izero 發表在 痞客邦 PIXNET 留言(2) 人氣()


留言列表 (2)

發表留言
  • Saturn
  • Mysql Pconnect timeout

    ini_set('mysql.connect_timeout', 1);
  • 有試過, 不過結果一樣.:p

    Izero 於 2008/08/04 21:30 回覆

  • Mr Shore
  • 请问如何trace php5-mysql ,我用zend调试不进去
  • 看 source code 啊 :Q

    Izero 於 2008/10/16 14:12 回覆

找更多相關文章與討論