下午兩點左右,保證連不進來的事件始末

對於本站有任何建議與指教的地方,請來此發言。

版主: DearHoney

回覆文章
DearHoney
神人
文章: 6487
註冊時間: 2001-01-03 08:00
聯繫:

文章 DearHoney »

下午兩點左右,討論區 100% 連不進來。我一時找不到尋夢園的工程師,只好厚著臉皮去麻煩另外一位 argus。之後我們利用 ICQ 交談,他有 root 權限但不太會操作 FreeBSD,我就教他改時間的方法,並且重開機了。

而關於人多時,時常連不上 MySQL 的問題,argus 告訴我說,之前有網友告訴他,修改 auth.php 中的 mysql_connect 變成 mysql_pconnect 可以改善,我已經照做,似乎真的有明顯的改善。

但他說還要修改 page_footer.php,增加 mysql_close($db) 這個我沒來得及問他,因為 phpBB 裡面沒有 page_footer.php 這個檔案,我不知道他到底是修改了哪一個..... Tiberius 幫忙看一下吧!這東西應該加在哪裡才對?
michaellai
初學者
文章: 32
註冊時間: 2001-01-05 08:00
來自: 淡江大學
聯繫:

文章 michaellai »

Warning: Supplied argument is not a valid MySQL-Link resource in /home/ddms/WWW/phpBB/functions.php on line 214

2/16,下午4:25分....
無法開啟文章.....
給大大們作為修正的參考~
Marinne
初學者
文章: 12
註冊時間: 2001-02-09 08:00
來自: Taipei, Taiwan

文章 Marinne »

<!-- 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() 建立的連結)。

提供個參考。
DearHoney
神人
文章: 6487
註冊時間: 2001-01-03 08:00
聯繫:

文章 DearHoney »

嗯!自從知道有 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 您的經驗似乎很豐富,可以多給予我們一些建議嗎?
Marinne
初學者
文章: 12
註冊時間: 2001-02-09 08:00
來自: Taipei, Taiwan

文章 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 的次數了。

提供個參考。
Marinne
初學者
文章: 12
註冊時間: 2001-02-09 08:00
來自: Taipei, Taiwan

文章 Marinne »

上面說的關於 Questions 數值有點不正確。Questions 數值代表 mysqld 上次啟動以來接收到的 query 總次數,在程式裡面每次呼叫 mysql_query(), mysql_db_query() 都會增加這個數值。此外(這個是上面沒提到的),每次呼叫mysql_fetch_array(); mysql_fetch_object(); mysql_fetch_row(); 也都會增加這個數值。
argus
初學者
文章: 5
註冊時間: 2001-01-11 08:00
聯繫:

文章 argus »

請問是哪個網站呢
可以說一下嗎
<!-- 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 -->
Tiberius
神人
文章: 931
註冊時間: 2001-01-03 08:00

文章 Tiberius »

目前的作法是使用 mysql_connect() 並且多呼叫一個 register_shutdown_function('mysql_close'); 在執行結束後關閉連線...

這樣做,資料庫連線就隨時保持在個位數或是 0 了!
果然在低 max_connections 時,不能用 mysql_pconnect 啊...

mysql_connect 在執行結束後,不會關閉連線,而會使得所使用的 connection process 進入 sleep 狀態。

還有 mysql_pconnect 只能在「同一個」httpd process 中共用 connection,所以一旦 httpd 多起來,連線數目會增加得很快... 開啟不同的連線一多就爆了。
Marinne
初學者
文章: 12
註冊時間: 2001-02-09 08:00
來自: Taipei, Taiwan

文章 Marinne »

我有個疑問。雖然呼叫register_shutdown_function('mysql_close');可以在該頁程式執行完畢的時候自動呼叫mysql_close()關閉之前開啟的資料庫連線,但是這不是又回到之前討論過的關於mysql_close()的問題了嗎。如果程式都是使用mysql_connect()來連結資料庫的話,其實應該是不需要多呼叫register_shutdown_function('mysql_close');,因為即使不這麼做,之前開啟的連線本來就會自動被關閉了。所以我有些不確定這麼做是不是真的能夠解決 too many connections 的問題,或者應該這麼說,現在 too many connections 的問題似乎已經解決了,但是會不會是因為其他地方的修改而解決的呢。
回覆文章