下午兩點左右,討論區 100% 連不進來。我一時找不到尋夢園的工程師,只好厚著臉皮去麻煩另外一位 argus。之後我們利用 ICQ 交談,他有 root 權限但不太會操作 FreeBSD,我就教他改時間的方法,並且重開機了。
而關於人多時,時常連不上 MySQL 的問題,argus 告訴我說,之前有網友告訴他,修改 auth.php 中的 mysql_connect 變成 mysql_pconnect 可以改善,我已經照做,似乎真的有明顯的改善。
但他說還要修改 page_footer.php,增加 mysql_close($db) 這個我沒來得及問他,因為 phpBB 裡面沒有 page_footer.php 這個檔案,我不知道他到底是修改了哪一個..... Tiberius 幫忙看一下吧!這東西應該加在哪裡才對?
下午兩點左右,保證連不進來的事件始末
版主: DearHoney
-
- 初學者
- 文章: 32
- 註冊時間: 2001-01-05 08:00
- 來自: 淡江大學
- 聯繫:
<!-- BBCode Quote Start --><FONT COLOR=GREEN>
而關於人多時,時常連不上 MySQL 的問題,argus 告訴我說,之前有網友告訴他,修改 auth.php 中的 mysql_connect 變成 mysql_pconnect 可以改善,我已經照做,似乎真的有明顯的改善。
</FONT><!-- BBCode Quote End -->
一般使用mysql_connect()取得與MySQL資料庫的連結,在該頁程式執行完以後就會自動被關閉。換了別頁,程式又需要連結資料庫的時候,就必須再重新建立一個資料庫連結,而建立資料庫連結的過程是滿慢而且對資料庫的負荷也不小。而使用mysql_pconnect()所開啟的連結則不會因為某頁程式執行完畢而被關閉,該連結會持續保持存在,而其他程式需要連結資料庫的時候,PHP會去看看是不是已經有之前已經開啟過的連結,有的話就直接拿來用,就不需要一再重複開啟資料庫連結。這對減輕MySQL資料庫的負荷有很大的幫助,因此一般如果預知對資料庫會有頻繁的存取的話,都會使用mysql_pconnect()(FYI:P 代表 persistent)。
<!-- BBCode Quote Start --><FONT COLOR=GREEN>
但他說還要修改 page_footer.php,增加 mysql_close($db) 這個我沒來得及問他,因為 phpBB 裡面沒有 page_footer.php 這個檔案,我不知道他到底是修改了哪一個..... Tiberius 幫忙看一下吧!這東西應該加在哪裡才對?
</FONT><!-- BBCode Quote End -->
mysql_close() 是用來關閉之前使用 mysql_connect() 建立的資料庫連結,但是這個在絕大多數狀況下是不需要使用的。如果程式使用 mysql_connect() 那麼建立的資料庫連結會在該頁程式執行完畢的時候自動被關閉,因此不需要自己另外呼叫 mysql_close() 來關閉。如果使用 mysql_pconnect() 的話,也還是不需要使用 mysql_close() ,因為 mysql_close() 並不能關閉 mysql_pconnect() 所建立的資料庫連結(它只能關閉由 mysql_connect() 建立的連結)。
提供個參考。
而關於人多時,時常連不上 MySQL 的問題,argus 告訴我說,之前有網友告訴他,修改 auth.php 中的 mysql_connect 變成 mysql_pconnect 可以改善,我已經照做,似乎真的有明顯的改善。
</FONT><!-- BBCode Quote End -->
一般使用mysql_connect()取得與MySQL資料庫的連結,在該頁程式執行完以後就會自動被關閉。換了別頁,程式又需要連結資料庫的時候,就必須再重新建立一個資料庫連結,而建立資料庫連結的過程是滿慢而且對資料庫的負荷也不小。而使用mysql_pconnect()所開啟的連結則不會因為某頁程式執行完畢而被關閉,該連結會持續保持存在,而其他程式需要連結資料庫的時候,PHP會去看看是不是已經有之前已經開啟過的連結,有的話就直接拿來用,就不需要一再重複開啟資料庫連結。這對減輕MySQL資料庫的負荷有很大的幫助,因此一般如果預知對資料庫會有頻繁的存取的話,都會使用mysql_pconnect()(FYI:P 代表 persistent)。
<!-- BBCode Quote Start --><FONT COLOR=GREEN>
但他說還要修改 page_footer.php,增加 mysql_close($db) 這個我沒來得及問他,因為 phpBB 裡面沒有 page_footer.php 這個檔案,我不知道他到底是修改了哪一個..... Tiberius 幫忙看一下吧!這東西應該加在哪裡才對?
</FONT><!-- BBCode Quote End -->
mysql_close() 是用來關閉之前使用 mysql_connect() 建立的資料庫連結,但是這個在絕大多數狀況下是不需要使用的。如果程式使用 mysql_connect() 那麼建立的資料庫連結會在該頁程式執行完畢的時候自動被關閉,因此不需要自己另外呼叫 mysql_close() 來關閉。如果使用 mysql_pconnect() 的話,也還是不需要使用 mysql_close() ,因為 mysql_close() 並不能關閉 mysql_pconnect() 所建立的資料庫連結(它只能關閉由 mysql_connect() 建立的連結)。
提供個參考。
嗯!自從知道有 mysql_pconnect 之後,我和 Tiberius 也去看了一些資料,與您講的是一樣的。但不太懂的是,這有既生瑜,何生亮的感覺.....
到底什麼場合適合 mysql_connect,什麼場合適合 mysql_pconnect 呢?
據說尋夢園的這台主機,是雙 CPU,多少 Mhz 我不知道,記憶體是 512MB,硬碟是普通 IDE 的。在這種情況下,調高 MySQL 的 Max Connection 數值,有沒有危險呢?預設是 100,但是我們這個討論區,加上尋夢園自己還有兩個討論區,一共三個,很容易將 connection 值衝上 100,造成超過的 connection 暫時拒絕連線,也就是大家常看到的錯誤訊息。改用 mysql_pconnect 之後,情況稍有好轉,但是 connection 數目還是相當的大,這就讓我們有點不太理解了。
我們昨天試圖調高至 200,一開始也相安無事,但是沒多久後竟然死當。我們不確定是不是這個 200 的上限造成,但是在過去是 100 時,主機的負擔很輕微,雖然最重的還是 mysqld,但也都只是佔用百分之十幾的 CPU 而已。所以在我的感覺,調高到 200 應該一點影響也沒有,但就是這麼巧,一調高就死當。
後來調回 100,但看樣子是半夜死當了。所以我更加覺得這只是時間點很巧合,也許是其他問題導致主機不穩,例如風扇不太會轉這類的.....
Marinne 您的經驗似乎很豐富,可以多給予我們一些建議嗎?
到底什麼場合適合 mysql_connect,什麼場合適合 mysql_pconnect 呢?
據說尋夢園的這台主機,是雙 CPU,多少 Mhz 我不知道,記憶體是 512MB,硬碟是普通 IDE 的。在這種情況下,調高 MySQL 的 Max Connection 數值,有沒有危險呢?預設是 100,但是我們這個討論區,加上尋夢園自己還有兩個討論區,一共三個,很容易將 connection 值衝上 100,造成超過的 connection 暫時拒絕連線,也就是大家常看到的錯誤訊息。改用 mysql_pconnect 之後,情況稍有好轉,但是 connection 數目還是相當的大,這就讓我們有點不太理解了。
我們昨天試圖調高至 200,一開始也相安無事,但是沒多久後竟然死當。我們不確定是不是這個 200 的上限造成,但是在過去是 100 時,主機的負擔很輕微,雖然最重的還是 mysqld,但也都只是佔用百分之十幾的 CPU 而已。所以在我的感覺,調高到 200 應該一點影響也沒有,但就是這麼巧,一調高就死當。
後來調回 100,但看樣子是半夜死當了。所以我更加覺得這只是時間點很巧合,也許是其他問題導致主機不穩,例如風扇不太會轉這類的.....
Marinne 您的經驗似乎很豐富,可以多給予我們一些建議嗎?
我不敢說對MySQL很有經驗,只是公司正好也有網站是使用PHP+MySQL這樣的組合所以稍微知道一些。我們其中一個網站使用Sun Sparc10的機器,兩顆CPU,記憶體是2GB(原本沒有那麼多記憶體,實在是因為我們用的另一間公司所寫的Java聊天室是個吃記憶體的怪獸...,為了養牠才加了那麼多RAM)。以前網站剛開始運作的時候我們也常遇到MySQL傳回 too many connections 的錯誤訊息,SA後來做過調整,目前這個MySQL伺服器的 max_connections 設定是 1024 ,我們後來從來沒有遇過類似的問題(每日上站人數大約是一萬五千到兩萬人左右)。
使用 mysql_pconnect() 能夠讓程式執行的效能變快,但是前提是 MySQL 伺服器必須能夠支撐夠多的同時連線數量。要把 max_connections 調高到多少,應該要看網站最多會同時使用多少個連線。下面這個指令可以觀看MySQL的執行狀況:
SHOW STATUS
顯示的資訊裡面,有個數值 Max_used_connections 就是從上次啟動 mysqld 以來,曾經同時使用中的最大連線數目(這和同時開啟的連線數目並不相同,有些被開啟的連線可能是在閒置狀態,沒有被用到,也沒有被關閉,而是在等待程式來用它)。要預防 too many connections 的問題,應該參考過去的 Max_used_connections 資料決定出網站最多會同時用到多少個資料庫連線,然後把max_connections調整到比這個 Max_used_connections 來得高。
此外,程式的寫法對資料庫的負荷也會有影響。送出qurey給資料庫的次數(或者說使用mysql_query())的次數應該越少越好,因為每次送出query都會需要一個資料庫連線,如果某次送出query的時候正好已經沒有閒置的已開啟連線可用的話,就會再次開啟另一個新的連線。前面提到的 SHOW STATUS 指令顯示的資訊裡面,有個數值 Questions 表示從上次啟動 mysqld 以來,送出給 mysqld 的 query 總次數。你可以先觀看這個數值,然後執行 phpBB 的某一頁,然後再觀看 Questions 數值增加了多少,大概就是那一頁送出 query 給 mysqld 的次數了。
提供個參考。
使用 mysql_pconnect() 能夠讓程式執行的效能變快,但是前提是 MySQL 伺服器必須能夠支撐夠多的同時連線數量。要把 max_connections 調高到多少,應該要看網站最多會同時使用多少個連線。下面這個指令可以觀看MySQL的執行狀況:
SHOW STATUS
顯示的資訊裡面,有個數值 Max_used_connections 就是從上次啟動 mysqld 以來,曾經同時使用中的最大連線數目(這和同時開啟的連線數目並不相同,有些被開啟的連線可能是在閒置狀態,沒有被用到,也沒有被關閉,而是在等待程式來用它)。要預防 too many connections 的問題,應該參考過去的 Max_used_connections 資料決定出網站最多會同時用到多少個資料庫連線,然後把max_connections調整到比這個 Max_used_connections 來得高。
此外,程式的寫法對資料庫的負荷也會有影響。送出qurey給資料庫的次數(或者說使用mysql_query())的次數應該越少越好,因為每次送出query都會需要一個資料庫連線,如果某次送出query的時候正好已經沒有閒置的已開啟連線可用的話,就會再次開啟另一個新的連線。前面提到的 SHOW STATUS 指令顯示的資訊裡面,有個數值 Questions 表示從上次啟動 mysqld 以來,送出給 mysqld 的 query 總次數。你可以先觀看這個數值,然後執行 phpBB 的某一頁,然後再觀看 Questions 數值增加了多少,大概就是那一頁送出 query 給 mysqld 的次數了。
提供個參考。
請問是哪個網站呢
可以說一下嗎
<!-- BBCode Quote Start --><FONT COLOR=GREEN>
我不敢說對MySQL很有經驗,只是公司正好也有網站是使用PHP+MySQL這樣的組合所以稍微知道一些。我們其中一個網站使用Sun Sparc10的機器,兩顆CPU,記憶體是2GB(原本沒有那麼多記憶體,實在是因為我們用的另一間公司所寫的Java聊天室是個吃記憶體的怪獸...,為了養牠才加了那麼多RAM)。以前網站剛開始運作的時候我們也常遇到MySQL傳回 too many connections 的錯誤訊息,SA後來做過調整,目前這個MySQL伺服器的 max_connections 設定是 1024 ,我們後來從來沒有遇過類似的問題(每日上站人數大約是一萬五千到兩萬人左右)。
使用 mysql_pconnect() 能夠讓程式執行的效能變快,但是前提是 MySQL 伺服器必須能夠支撐夠多的同時連線數量。要把 max_connections 調高到多少,應該要看網站最多會同時使用多少個連線。下面這個指令可以觀看MySQL的執行狀況:
SHOW STATUS
顯示的資訊裡面,有個數值 Max_used_connections 就是從上次啟動 mysqld 以來,曾經同時使用中的最大連線數目(這和同時開啟的連線數目並不相同,有些被開啟的連線可能是在閒置狀態,沒有被用到,也沒有被關閉,而是在等待程式來用它)。要預防 too many connections 的問題,應該參考過去的 Max_used_connections 資料決定出網站最多會同時用到多少個資料庫連線,然後把max_connections調整到比這個 Max_used_connections 來得高。
此外,程式的寫法對資料庫的負荷也會有影響。送出qurey給資料庫的次數(或者說使用mysql_query())的次數應該越少越好,因為每次送出query都會需要一個資料庫連線,如果某次送出query的時候正好已經沒有閒置的已開啟連線可用的話,就會再次開啟另一個新的連線。前面提到的 SHOW STATUS 指令顯示的資訊裡面,有個數值 Questions 表示從上次啟動 mysqld 以來,送出給 mysqld 的 query 總次數。你可以先觀看這個數值,然後執行 phpBB 的某一頁,然後再觀看 Questions 數值增加了多少,大概就是那一頁送出 query 給 mysqld 的次數了。
提供個參考。
</FONT><!-- BBCode Quote End -->
可以說一下嗎
<!-- BBCode Quote Start --><FONT COLOR=GREEN>
我不敢說對MySQL很有經驗,只是公司正好也有網站是使用PHP+MySQL這樣的組合所以稍微知道一些。我們其中一個網站使用Sun Sparc10的機器,兩顆CPU,記憶體是2GB(原本沒有那麼多記憶體,實在是因為我們用的另一間公司所寫的Java聊天室是個吃記憶體的怪獸...,為了養牠才加了那麼多RAM)。以前網站剛開始運作的時候我們也常遇到MySQL傳回 too many connections 的錯誤訊息,SA後來做過調整,目前這個MySQL伺服器的 max_connections 設定是 1024 ,我們後來從來沒有遇過類似的問題(每日上站人數大約是一萬五千到兩萬人左右)。
使用 mysql_pconnect() 能夠讓程式執行的效能變快,但是前提是 MySQL 伺服器必須能夠支撐夠多的同時連線數量。要把 max_connections 調高到多少,應該要看網站最多會同時使用多少個連線。下面這個指令可以觀看MySQL的執行狀況:
SHOW STATUS
顯示的資訊裡面,有個數值 Max_used_connections 就是從上次啟動 mysqld 以來,曾經同時使用中的最大連線數目(這和同時開啟的連線數目並不相同,有些被開啟的連線可能是在閒置狀態,沒有被用到,也沒有被關閉,而是在等待程式來用它)。要預防 too many connections 的問題,應該參考過去的 Max_used_connections 資料決定出網站最多會同時用到多少個資料庫連線,然後把max_connections調整到比這個 Max_used_connections 來得高。
此外,程式的寫法對資料庫的負荷也會有影響。送出qurey給資料庫的次數(或者說使用mysql_query())的次數應該越少越好,因為每次送出query都會需要一個資料庫連線,如果某次送出query的時候正好已經沒有閒置的已開啟連線可用的話,就會再次開啟另一個新的連線。前面提到的 SHOW STATUS 指令顯示的資訊裡面,有個數值 Questions 表示從上次啟動 mysqld 以來,送出給 mysqld 的 query 總次數。你可以先觀看這個數值,然後執行 phpBB 的某一頁,然後再觀看 Questions 數值增加了多少,大概就是那一頁送出 query 給 mysqld 的次數了。
提供個參考。
</FONT><!-- BBCode Quote End -->
目前的作法是使用 mysql_connect() 並且多呼叫一個 register_shutdown_function('mysql_close'); 在執行結束後關閉連線...
這樣做,資料庫連線就隨時保持在個位數或是 0 了!
果然在低 max_connections 時,不能用 mysql_pconnect 啊...
mysql_connect 在執行結束後,不會關閉連線,而會使得所使用的 connection process 進入 sleep 狀態。
還有 mysql_pconnect 只能在「同一個」httpd process 中共用 connection,所以一旦 httpd 多起來,連線數目會增加得很快... 開啟不同的連線一多就爆了。
這樣做,資料庫連線就隨時保持在個位數或是 0 了!
果然在低 max_connections 時,不能用 mysql_pconnect 啊...
mysql_connect 在執行結束後,不會關閉連線,而會使得所使用的 connection process 進入 sleep 狀態。
還有 mysql_pconnect 只能在「同一個」httpd process 中共用 connection,所以一旦 httpd 多起來,連線數目會增加得很快... 開啟不同的連線一多就爆了。
我有個疑問。雖然呼叫register_shutdown_function('mysql_close');可以在該頁程式執行完畢的時候自動呼叫mysql_close()關閉之前開啟的資料庫連線,但是這不是又回到之前討論過的關於mysql_close()的問題了嗎。如果程式都是使用mysql_connect()來連結資料庫的話,其實應該是不需要多呼叫register_shutdown_function('mysql_close');,因為即使不這麼做,之前開啟的連線本來就會自動被關閉了。所以我有些不確定這麼做是不是真的能夠解決 too many connections 的問題,或者應該這麼說,現在 too many connections 的問題似乎已經解決了,但是會不會是因為其他地方的修改而解決的呢。