Too many connections , 本站目前解決方案

貼文者 : : 站長

Too many connections , 本站目前解決方案 - 2004-04-27 00:46:31

因為本站同時有許多網友在瀏覽,只要有一兩個網友 新增/刪除/修改 文章
就會造成資料庫 table 鎖定,此時網站好像沒反應似的

新的 request 將會被 MySQL 給 queue 住,在累積 connections 的過程中,如果我不中途把 http daemon 給暫時 stop 掉,整個網站會一直沒反應,但不會拒絕連線,新的連線請求會一直加到資料庫 reuqest queue 中,直到一百個 connections 滿載 (mysql 內定)。
從 一兩個 connections 累積到 100 個 connections 大概費時 3~5 分鐘(依照當時流量),此時螢幕就會顯示一長串 " Too many connections " 的錯誤訊息。

此時 mysql 會消耗內部 table lock , 某些 request 要 insert/update/delete 某個 row , 而其他的 request 要 select... MySQL 內部有個 timeout 機制處理這個 deadlock , 不處理完此事其他 connections 無法進來。

處理此 lock 大概得費時 數分鐘...,接著 connections 數量才會降到 100 以下,但是如果此時大家仍然不斷點選本網站,網站仍會繼續沒反應,又有可能出現 Too many connections 的錯誤訊息。依照以往經驗,從出現 Too many connections 到大家可以繼續瀏覽本網站,如果我不人工介入的話,大概得消耗十分鐘左右!

現在,我把連線上限修改為 10 個 connections , 這有什麼影響?如果人多而又有人要 insert/delete/update 某個 row 的時候,會 更快/更容易看到 Too many connections 的錯誤 ,但是相對地, 系統復原也更快 。不用累積到 100 個 connections 才阻擋大家進來,現在 10 個連線大家就進不來。此時系統處理 deadlock 會更快,大家也不用等太久就可以看到網站恢復正常。


前面看不懂沒關係,在此提供三點方法請大家遵守:


1. 儘量登入系統,不要登出系統。最好一直登入系統(勾選「記住我的帳號密碼」)。
2. 貼文謹慎 , 請參考此連結
3. 當您按下本站某連結發現沒反應時,請不要再繼續點選其他連結或是 重新載入 網頁,這樣只會雪上加霜。請暫時離開本站,到外面逛一下,約一兩分鐘後再來即可。


要根本解決此問題,在於引入高速高檔的伺服器主機,大概要花六萬以上(SCSI 硬碟為必需品)。本站目前無此預算,請大家多體諒,共體時艱。
貼文者 : : pingpoing

Re: Too many connections , 本站目前解決方案 - 2004-04-28 14:05:11

This is not a good approach.
To overcome the MySQL connection problem, you have to rewrite the php forum such that it uses mysql_connect() (NOT mysql_pconnect()) and retains some of the mysql connection threads on the server side.
It is not a easy way to do however.

Hope this help
貼文者 : : 站長

Re: Too many connections , 本站目前解決方案 - 2004-04-28 14:30:34

回應:

you have to rewrite the php forum such that it uses mysql_connect() (NOT mysql_pconnect()) and retains some of the mysql connection threads on the server side.




最主要的原因是 table lock .
是先因為 table lock 才會導致 too many connections 的
所以,即使加上 connection pool 也無濟於事
(否則本站最多線上四百多人,大家都在 reading , 網站速度仍然飛快...)

而 table lock 的主因: 硬碟不夠快、不是 SCSI 硬碟、資料庫不是獨立主機 ...
貼文者 : : 小苦

Re: Too many connections , 本站目前解決方案 - 2004-05-04 23:25:48

最近常常還是進不來..不知怎麼稿的哩.?
貼文者 : : 站長

Re: Too many connections , 本站目前解決方案 - 2004-05-04 23:29:04

回應:

最近常常還是進不來..不知怎麼稿的哩.?



資料庫瓶頸
有人 貼文/刪文/改文 就很有可能如此.
如果大家都在讀文章,線上五百人也不是問題
貼文者 : : 伍修羅

Re: Too many connections , 本站目前解決方案 - 2004-05-07 15:42:39

回應:

回應:

最近常常還是進不來..不知怎麼稿的哩.?



資料庫瓶頸
有人 貼文/刪文/改文 就很有可能如此.
如果大家都在讀文章,線上五百人也不是問題



站長大大, 有否考慮到更換database, 微軟的東東, 入門很容易, 但往往維護時的問題一大堆
貼文者 : : 站長

Re: Too many connections , 本站目前解決方案 - 2004-05-07 16:14:14

回應:


站長大大, 有否考慮到更換database, 微軟的東東, 入門很容易, 但往往維護時的問題一大堆



本站從沒用微軟的東西啊 
貼文者 : : 伍修羅

Re: Too many connections , 本站目前解決方案 - 2004-05-07 16:42:28

回應:

回應:


站長大大, 有否考慮到更換database, 微軟的東東, 入門很容易, 但往往維護時的問題一大堆



本站從沒用微軟的東西啊 



對不起, 我錯了...
貼文者 : : Miki

Re: Too many connections , 本站目前解決方案 - 2004-05-09 10:47:40

記住帳號密碼的方式
會不會造成人不在線上
卻依然出現登入狀態ㄋ?
貼文者 : : 命也!!

Re: Too many connections , 本站目前解決方案 - 2004-05-09 10:56:13

回應:

最近常常還是進不來..不知怎麼稿的哩.?



還不是你偷懶~~~整天都在路上撿光碟~~撿到也不分享給小弟~~
貼文者 : : 站長

Re: Too many connections , 本站目前解決方案 - 2004-05-09 16:59:08

回應:

記住帳號密碼的方式
會不會造成人不在線上
卻依然出現登入狀態ㄋ?



session timeout 為 10 分鐘
這點您不用擔心
貼文者 : : Miki

Re: Too many connections , 本站目前解決方案 - 2004-05-09 20:05:46

了解
謝謝搖頭站長大大哩~^^~
貼文者 : : 七龍珠

Re: Too many connections , 本站目前解決方案 - 2004-05-16 01:02:26

回應:

回應:

you have to rewrite the php forum such that it uses mysql_connect() (NOT mysql_pconnect()) and retains some of the mysql connection threads on the server side.




最主要的原因是 table lock .
是先因為 table lock 才會導致 too many connections 的
所以,即使加上 connection pool 也無濟於事
(否則本站最多線上四百多人,大家都在 reading , 網站速度仍然飛快...)

而 table lock 的主因: 硬碟不夠快、不是 SCSI 硬碟、資料庫不是獨立主機 ...




我覺得 Connection Pooling 是有正面效應的。Database Connection 本就 expensive, 會用到 CPU 的不少資源﹐也影響 MySQL 的速度。試想每一 Connection 省一秒﹐每天有多少個 Connection? 省下來的時間可讓 MySQL 處理其它 request, 良性循環﹐現在可是惡性循環啊~~

您提到 Table Lock, 我假定您是用 MyISAM Table Type (supports Table Level Locking). 如確實如此﹐而您的 MySQL 版本又 supports InnoDB 的話﹐我建議您換去 InnoDB Table Type (supports Row Level Locking), 那麼﹐ Insert/Update/Delete 就不需要 Lock 整個 Table 了。

我覺得硬件倒不是最主要的原因﹐因為 PHP Web Application 及 Database Design 還有很多待改善的空間﹐MySQL Performance Tuning 也會有明顯的幫助。
貼文者 : : 站長

Re: Too many connections , 本站目前解決方案 - 2004-05-16 01:12:01

回應:


我覺得 Connection Pooling 是有正面效應的。Database Connection 本就 expensive, 會用到 CPU 的不少資源﹐也影響 MySQL 的速度。試想每一 Connection 省一秒﹐每天有多少個 Connection? 省下來的時間可讓 MySQL 處理其它 request, 良性循環﹐現在可是惡性循環啊~~

您提到 Table Lock, 我假定您是用 MyISAM Table Type (supports Table Level Locking). 如確實如此﹐而您的 MySQL 版本又 supports InnoDB 的話﹐我建議您換去 InnoDB Table Type (supports Row Level Locking), 那麼﹐ Insert/Update/Delete 就不需要 Lock 整個 Table 了。



Connection Pool 有效沒錯,但是對本站而言效果可能不顯著
我看這程式碼,應該是沒有處理 connection pool 的機制
也許 php 內部本身就處理了 connection pool , 這我沒研究了...

因為其實 select 是非常快的,幾乎不會有任何延遲
之前某時段線上飆到四百多人,因為那一段時間似乎沒有人正在 insert/update/delete 任何資料
所以即使四百多人,速度仍然像閃電一樣快

至於 InnoDB , 我沒研究,謝謝您提供的方向
貼文者 : : 七龍珠

Re: Too many connections , 本站目前解決方案 - 2004-05-16 01:57:38

回應:

Connection Pool 有效沒錯,但是對本站而言效果可能不顯著
我看這程式碼,應該是沒有處理 connection pool 的機制
也許 php 內部本身就處理了 connection pool , 這我沒研究了...

因為其實 select 是非常快的,幾乎不會有任何延遲
之前某時段線上飆到四百多人,因為那一段時間似乎沒有人正在 insert/update/delete 任何資料
所以即使四百多人,速度仍然像閃電一樣快

至於 InnoDB , 我沒研究,謝謝您提供的方向




現在我對這問題有比較多的概念了﹐而 MyISAM 的假定也成立了﹐以下是我的看法:

目前最迫切的不是 Connection Pooling, 要改也要查比較多程式碼﹐所以容後再處理。

看來﹐把 Table Type 從 MyISAM 換去 InnoDB 是比較恰當﹐快﹐且省時的做法。
貼文者 : : jerryen

Re: Too many connections , 本站目前解決方案 - 2004-05-30 21:37:07

mm我也覺得不是硬體的問題
不知道MYSQL有沒有提供自己的ODBC DRIVER
在ORACLE的環境下
使用GENERIC DRIVER和ORACLE THIN DRIVER效能是差很多的
貼文者 : : pingpoing

Re: Too many connections , 本站目前解決方案 - 2004-06-14 18:03:45

This may help.

http://jeremy.zawodny.com/blog/archives/000173.html